summaryrefslogtreecommitdiffstats
path: root/meta/recipes-core/glibc/glibc/0005-nativesdk-glibc-Raise-the-size-of-arrays-containing-.patch
blob: 197caae9218a027c88464976eb5df83950ef5843 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
From 3ea08e491a8494ff03e598b5e0fc2d8131e75da9 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 32f3bef5ea..71f3a82dc0 100644
--- a/elf/dl-cache.c
+++ b/elf/dl-cache.c
@@ -359,6 +359,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 f455207e79..a144e24fcf 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 6e26818bd7..f09e8b93e5 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\
@@ -266,7 +268,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 28ed637a29..5d38a60c5d 100644
--- a/elf/ldconfig.c
+++ b/elf/ldconfig.c
@@ -176,6 +176,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 596b6ac3d9..1ccd33f668 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 682f949834..7eed87bc9d 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 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