From 88a31cd08801df53249963f3b26c7dbcee6ae2f8 Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Wed, 18 Mar 2015 01:51:38 +0000 Subject: [PATCH] nativesdk-glibc: Raise the size of arrays containing dl paths This patch puts the dynamic loader path in the binaries, SYSTEM_DIRS strings and lengths as well as ld.so.cache path in the dynamic loader to specific sections in memory. The sections that contain paths have been allocated a 4096 byte section, which is the maximum path length in linux. This will allow the relocating script to parse the ELF binary, detect the section and easily replace the strings in a certain path. Upstream-Status: Inappropriate [SDK specific] Signed-off-by: Laurentiu Palcu Signed-off-by: Khem Raj --- elf/dl-cache.c | 4 ++++ elf/dl-load.c | 4 ++-- elf/dl-usage.c | 6 ++++-- elf/interp.c | 2 +- elf/ldconfig.c | 3 +++ elf/rtld.c | 1 + iconv/gconv_conf.c | 2 +- sysdeps/generic/dl-cache.h | 4 ---- 8 files changed, 16 insertions(+), 10 deletions(-) diff --git a/elf/dl-cache.c b/elf/dl-cache.c index 2b8da8650d..3d9787bda4 100644 --- a/elf/dl-cache.c +++ b/elf/dl-cache.c @@ -355,6 +355,10 @@ search_cache (const char *string_table, uint32_t string_table_size, return best; } +const char LD_SO_CACHE[4096] __attribute__ ((section (".ldsocache"))) = + SYSCONFDIR "/ld.so.cache"; + + int _dl_cache_libcmp (const char *p1, const char *p2) { diff --git a/elf/dl-load.c b/elf/dl-load.c index daa3af6c51..e323952993 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -117,8 +117,8 @@ enum { ncapstr = 1, max_capstrlen = 0 }; gen-trusted-dirs.awk. */ #include "trusted-dirs.h" -static const char system_dirs[] = SYSTEM_DIRS; -static const size_t system_dirs_len[] = +static const char system_dirs[4096] __attribute__ ((section (".sysdirs"))) = SYSTEM_DIRS; +volatile static const size_t system_dirs_len[] __attribute__ ((section (".sysdirslen"))) = { SYSTEM_DIRS_LEN }; diff --git a/elf/dl-usage.c b/elf/dl-usage.c index 5ad3a72559..88f26d3692 100644 --- a/elf/dl-usage.c +++ b/elf/dl-usage.c @@ -25,6 +25,8 @@ #include #include +extern const char LD_SO_CACHE[4096] __attribute__ ((section (".ldsocache"))); + void _dl_usage (const char *argv0, const char *wrong_option) { @@ -244,7 +246,7 @@ setting environment variables (which would be inherited by subprocesses).\n\ --list list all dependencies and how they are resolved\n\ --verify verify that given object really is a dynamically linked\n\ object we can handle\n\ - --inhibit-cache Do not use " LD_SO_CACHE "\n\ + --inhibit-cache Do not use %s\n\ --library-path PATH use given PATH instead of content of the environment\n\ variable LD_LIBRARY_PATH\n\ --glibc-hwcaps-prepend LIST\n\ @@ -267,7 +269,7 @@ setting environment variables (which would be inherited by subprocesses).\n\ \n\ This program interpreter self-identifies as: " RTLD "\n\ ", - argv0); + argv0, LD_SO_CACHE); print_search_path_for_help (state); print_hwcaps_subdirectories (state); print_legacy_hwcap_directories (); diff --git a/elf/interp.c b/elf/interp.c index 91966702ca..dc86c20e83 100644 --- a/elf/interp.c +++ b/elf/interp.c @@ -18,5 +18,5 @@ #include -const char __invoke_dynamic_linker__[] __attribute__ ((section (".interp"))) +const char __invoke_dynamic_linker__[4096] __attribute__ ((section (".interp"))) = RUNTIME_LINKER; diff --git a/elf/ldconfig.c b/elf/ldconfig.c index 101d56ac8e..33debef60a 100644 --- a/elf/ldconfig.c +++ b/elf/ldconfig.c @@ -176,6 +176,9 @@ static struct argp argp = options, parse_opt, NULL, doc, NULL, more_help, NULL }; + +extern const char LD_SO_CACHE[4096] __attribute__ ((section (".ldsocache"))); + /* Check if string corresponds to an important hardware capability or a platform. */ static int diff --git a/elf/rtld.c b/elf/rtld.c index 4b09e84b0d..56d93ff616 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -193,6 +193,7 @@ dso_name_valid_for_suid (const char *p) } return *p != '\0'; } +extern const char LD_SO_CACHE[4096] __attribute__ ((section (".ldsocache"))); static void audit_list_init (struct audit_list *list) diff --git a/iconv/gconv_conf.c b/iconv/gconv_conf.c index 077082af66..46b6152455 100644 --- a/iconv/gconv_conf.c +++ b/iconv/gconv_conf.c @@ -35,7 +35,7 @@ #include /* This is the default path where we look for module lists. */ -static const char default_gconv_path[] = GCONV_PATH; +static char default_gconv_path[4096] __attribute__ ((section (".gccrelocprefix"))) = GCONV_PATH; /* Type to represent search path. */ struct path_elem diff --git a/sysdeps/generic/dl-cache.h b/sysdeps/generic/dl-cache.h index 964d50a486..94bf68ca9d 100644 --- a/sysdeps/generic/dl-cache.h +++ b/sysdeps/generic/dl-cache.h @@ -34,10 +34,6 @@ ((flags) == 1 || (flags) == _DL_CACHE_DEFAULT_ID) #endif -#ifndef LD_SO_CACHE -# define LD_SO_CACHE SYSCONFDIR "/ld.so.cache" -#endif - #ifndef add_system_dir # define add_system_dir(dir) add_dir (dir) #endif