blob: 27cd17cdcdfdb9dfea596831b193252f1f884169 [file] [log] [blame]
Andrew Geissler82c905d2020-04-13 13:39:40 -05001From 3df91d1d8b9c7a01b3ef8133c4f9b9764227d583 Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Fri, 3 Aug 2018 09:55:12 -0700
4Subject: [PATCH] nativesdk-glibc: Make relocatable install for locales
5
6The glibc locale path is hard-coded to the install prefix, but in SDKs we need
7to be able to relocate the binaries. Expand the strings to 4K and put them in a
8magic segment that we can relocate at install time.
9
10Upstream-Status: Inappropriate (OE-specific)
11
12Signed-off-by: Ross Burton <ross.burton@intel.com>
13Signed-off-by: Khem Raj <raj.khem@gmail.com>
14---
15 locale/findlocale.c | 4 ++--
16 locale/loadarchive.c | 2 +-
17 locale/localeinfo.h | 2 +-
18 3 files changed, 4 insertions(+), 4 deletions(-)
19
20Index: git/locale/findlocale.c
21===================================================================
22--- git.orig/locale/findlocale.c
23+++ git/locale/findlocale.c
24@@ -56,7 +56,7 @@ struct __locale_data *const _nl_C[] attr
25 which are somehow addressed. */
26 struct loaded_l10nfile *_nl_locale_file_list[__LC_LAST];
27
28-const char _nl_default_locale_path[] attribute_hidden = COMPLOCALEDIR;
29+char _nl_default_locale_path[4096] attribute_hidden __attribute__ ((section (".gccrelocprefix"))) = COMPLOCALEDIR;
30
31 /* Checks if the name is actually present, that is, not NULL and not
32 empty. */
33@@ -166,7 +166,7 @@ _nl_find_locale (const char *locale_path
34
35 /* Nothing in the archive. Set the default path to search below. */
36 locale_path = _nl_default_locale_path;
37- locale_path_len = sizeof _nl_default_locale_path;
38+ locale_path_len = strlen(locale_path) + 1;
39 }
40 else
41 /* We really have to load some data. First see whether the name is
42Index: git/locale/loadarchive.c
43===================================================================
44--- git.orig/locale/loadarchive.c
45+++ git/locale/loadarchive.c
46@@ -42,7 +42,7 @@
47
48
49 /* Name of the locale archive file. */
50-static const char archfname[] = COMPLOCALEDIR "/locale-archive";
51+static const char archfname[4096] __attribute__ ((section (".gccrelocprefix"))) = COMPLOCALEDIR "/locale-archive";
52
53 /* Size of initial mapping window, optimal if large enough to
54 cover the header plus the initial locale. */
55Index: git/locale/localeinfo.h
56===================================================================
57--- git.orig/locale/localeinfo.h
58+++ git/locale/localeinfo.h
59@@ -331,7 +331,7 @@ _nl_lookup_word (locale_t l, int categor
60 }
61
62 /* Default search path if no LOCPATH environment variable. */
63-extern const char _nl_default_locale_path[] attribute_hidden;
64+extern char _nl_default_locale_path[4096] attribute_hidden;
65
66 /* Load the locale data for CATEGORY from the file specified by *NAME.
67 If *NAME is "", use environment variables as specified by POSIX, and
68Index: git/locale/programs/locale.c
69===================================================================
70--- git.orig/locale/programs/locale.c
71+++ git/locale/programs/locale.c
72@@ -632,6 +632,7 @@ nameentcmp (const void *a, const void *b
73 ((const struct nameent *) b)->name);
74 }
75
76+static char _write_archive_locales_path[4096] attribute_hidden __attribute__ ((section (".gccrelocprefix"))) = ARCHIVE_NAME;
77
78 static int
79 write_archive_locales (void **all_datap, char *linebuf)
80@@ -645,7 +646,7 @@ write_archive_locales (void **all_datap,
81 int fd, ret = 0;
82 uint32_t cnt;
83
84- fd = open64 (ARCHIVE_NAME, O_RDONLY);
85+ fd = open64 (_write_archive_locales_path, O_RDONLY);
86 if (fd < 0)
87 return 0;
88
89@@ -700,8 +701,8 @@ write_archive_locales (void **all_datap,
90 if (cnt)
91 putchar_unlocked ('\n');
92
93- printf ("locale: %-15.15s archive: " ARCHIVE_NAME "\n%s\n",
94- names[cnt].name, linebuf);
95+ printf ("locale: %-15.15s archive: %s\n%s\n",
96+ names[cnt].name, _write_archive_locales_path, linebuf);
97
98 locrec = (struct locrecent *) (addr + names[cnt].locrec_offset);
99