From 055dd46b793168fb08e44913153010b088011ba2 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/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 6ee5153ff9..37a5f701fa 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 74e2e5e962..8f19186e1c 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -110,8 +110,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 9cd50c7291..fc2f39d73c 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 fbdd814edf..9f4d8d69b1 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 1b0c74739f..a70a62d31e 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -130,6 +130,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.  */
@@ -1001,12 +1002,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 f173cde71b..5c3205026f 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 cf43f1cf3b..7f07adde53 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
