141 lines
4.7 KiB
Diff
141 lines
4.7 KiB
Diff
From e53968d61804b6bab32ec6e13cc0b3cd57214796 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 03/26] 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 cfa335e..daa12ec 100644
|
|
--- a/elf/dl-cache.c
|
|
+++ b/elf/dl-cache.c
|
|
@@ -132,6 +132,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 3a3d112..a1410e4 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 9448802..e7e8c70 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 467ca82..631a2a9 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 4ec25d7..e159c12 100644
|
|
--- a/elf/rtld.c
|
|
+++ b/elf/rtld.c
|
|
@@ -99,6 +99,7 @@ uintptr_t __pointer_chk_guard_local
|
|
strong_alias (__pointer_chk_guard_local, __pointer_chk_guard)
|
|
#endif
|
|
|
|
+extern const char LD_SO_CACHE[4096] __attribute__ ((section (".ldsocache")));
|
|
|
|
/* List of auditing DSOs. */
|
|
static struct audit_list
|
|
@@ -854,12 +855,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 e235188..569f72e 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 eb2f900..505804e 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.10.2
|
|
|