blob: 2073576aac42c73dfb7a0f4dedc34bf5589a9f24 [file] [log] [blame]
From 19cd858f5f04a6ac584fbd89a2fbc51791263b85 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 05/29] 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/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 93d185e788..e115b18756 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
_dl_cache_libcmp (const char *p1, const char *p2)
{
diff --git a/elf/dl-load.c b/elf/dl-load.c
index e1b3486549..5226d0c4fa 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -111,8 +111,8 @@ static size_t max_capstrlen attribute_relro;
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/interp.c b/elf/interp.c
index 331cc1df48..885b2d9476 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 0c090dca15..6bb6e0fe72 100644
--- a/elf/ldconfig.c
+++ b/elf/ldconfig.c
@@ -171,6 +171,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 5b882163fa..db407b5d8b 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -217,6 +217,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)
@@ -1286,13 +1287,13 @@ 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\
- --preload LIST preload objects named in LIST\n");
+ --preload LIST preload objects named in LIST\n", LD_SO_CACHE);
++_dl_skip_args;
--_dl_argc;
diff --git a/iconv/gconv_conf.c b/iconv/gconv_conf.c
index 735bd1f2d5..25100ba666 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;
/* Type to represent search path. */
struct path_elem
diff --git a/sysdeps/generic/dl-cache.h b/sysdeps/generic/dl-cache.h
index 6b310e9e15..3877311df4 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.27.0