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
|