123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- From 6af8ce8eceed86addbc188f773a2d36d83ee4042 Mon Sep 17 00:00:00 2001
- From: Khem Raj <raj.khem@gmail.com>
- 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 <laurentiu.palcu@intel.com>
- Signed-off-by: Khem Raj <raj.khem@gmail.com>
- ---
- 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 2c6270e2a7..23018d2f7e 100644
- --- a/elf/dl-load.c
- +++ b/elf/dl-load.c
- @@ -115,8 +115,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 <dl-procinfo.h>
- #include <dl-hwcaps.h>
-
- +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 <runtime-linker.h>
-
- -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 1037e8d0cf..ffdac84952 100644
- --- a/elf/ldconfig.c
- +++ b/elf/ldconfig.c
- @@ -177,6 +177,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 fbbd60b446..fce9940f80 100644
- --- a/elf/rtld.c
- +++ b/elf/rtld.c
- @@ -185,6 +185,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 62bee28769..67b60dc88c 100644
- --- a/iconv/gconv_conf.c
- +++ b/iconv/gconv_conf.c
- @@ -36,7 +36,7 @@
- #include <gconv_parseconfdir.h>
-
- /* 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
|