From 490a0eb4da1af726ea5d68e3efc0d18ba94c4054 Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Wed, 18 Mar 2015 01:51:38 +0000 Subject: [PATCH 03/25] 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/interp.c | 2 +- elf/ldconfig.c | 3 +++ elf/rtld.c | 5 +++-- iconv/gconv_conf.c | 2 +- sysdeps/generic/dl-cache.h | 4 ---- 7 files changed, 14 insertions(+), 10 deletions(-) diff --git a/elf/dl-cache.c b/elf/dl-cache.c index e9632da0b3..4de529d2cf 100644 --- a/elf/dl-cache.c +++ b/elf/dl-cache.c @@ -133,6 +133,10 @@ do \ while (0) +const char LD_SO_CACHE[4096] __attribute__ ((section (".ldsocache"))) = + SYSCONFDIR "/ld.so.cache"; + + int internal_function _dl_cache_libcmp (const char *p1, const char *p2) diff --git a/elf/dl-load.c b/elf/dl-load.c index 19c1db9948..70c259b400 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -106,8 +106,8 @@ static size_t max_capstrlen attribute_relro; /* Get the generated information about the trusted directories. */ #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/interp.c b/elf/interp.c index b6e8f04444..47c20415bc 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 99caf9e9bb..36ea5df5f1 100644 --- a/elf/ldconfig.c +++ b/elf/ldconfig.c @@ -168,6 +168,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 65647fb1c8..cd8381cb33 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -128,6 +128,7 @@ dso_name_valid_for_suid (const char *p) } return *p != '\0'; } +extern const char LD_SO_CACHE[4096] __attribute__ ((section (".ldsocache"))); /* LD_AUDIT variable contents. Must be processed before the audit_list below. */ @@ -999,12 +1000,12 @@ of this helper program; chances are you did not intend to run this program.\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\ --inhibit-rpath LIST ignore RUNPATH and RPATH information in object names\n\ in LIST\n\ - --audit LIST use objects named in LIST as auditors\n"); + --audit LIST use objects named in LIST as auditors\n", LD_SO_CACHE); ++_dl_skip_args; --_dl_argc; diff --git a/iconv/gconv_conf.c b/iconv/gconv_conf.c index 5aa055de6e..b9a14b9bd3 100644 --- a/iconv/gconv_conf.c +++ b/iconv/gconv_conf.c @@ -36,7 +36,7 @@ /* 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; /* The path elements, as determined by the __gconv_get_path function. All path elements end in a slash. */ diff --git a/sysdeps/generic/dl-cache.h b/sysdeps/generic/dl-cache.h index 1f0b8f629d..acbe68399d 100644 --- a/sysdeps/generic/dl-cache.h +++ b/sysdeps/generic/dl-cache.h @@ -27,10 +27,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 -- 2.13.2