blob: 729ce1b42d8f8c1266738b465c15107ee0cf5eea [file] [log] [blame]
Andrew Geissler635e0e42020-08-21 15:58:33 -05001From 9a8bf11ea375a2fe5eddb30bc10943e64d3b96a4 Mon Sep 17 00:00:00 2001
Andrew Geissler82c905d2020-04-13 13:39:40 -05002From: Khem Raj <raj.khem@gmail.com>
3Date: Fri, 3 Aug 2018 09:55:12 -0700
Andrew Geissler635e0e42020-08-21 15:58:33 -05004Subject: [PATCH 07/29] nativesdk-glibc: Make relocatable install for locales
Andrew Geissler82c905d2020-04-13 13:39:40 -05005
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---
Andrew Geissler635e0e42020-08-21 15:58:33 -050015 locale/findlocale.c | 4 ++--
16 locale/loadarchive.c | 2 +-
17 locale/localeinfo.h | 2 +-
18 locale/programs/locale.c | 7 ++++---
19 4 files changed, 8 insertions(+), 7 deletions(-)
Andrew Geissler82c905d2020-04-13 13:39:40 -050020
Andrew Geissler635e0e42020-08-21 15:58:33 -050021diff --git a/locale/findlocale.c b/locale/findlocale.c
22index 9cd3b71a6d..84272310e0 100644
23--- a/locale/findlocale.c
24+++ b/locale/findlocale.c
25@@ -56,7 +56,7 @@ struct __locale_data *const _nl_C[] attribute_hidden =
Andrew Geissler82c905d2020-04-13 13:39:40 -050026 which are somehow addressed. */
27 struct loaded_l10nfile *_nl_locale_file_list[__LC_LAST];
28
29-const char _nl_default_locale_path[] attribute_hidden = COMPLOCALEDIR;
30+char _nl_default_locale_path[4096] attribute_hidden __attribute__ ((section (".gccrelocprefix"))) = COMPLOCALEDIR;
31
32 /* Checks if the name is actually present, that is, not NULL and not
33 empty. */
Andrew Geissler635e0e42020-08-21 15:58:33 -050034@@ -166,7 +166,7 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len,
Andrew Geissler82c905d2020-04-13 13:39:40 -050035
36 /* Nothing in the archive. Set the default path to search below. */
37 locale_path = _nl_default_locale_path;
38- locale_path_len = sizeof _nl_default_locale_path;
39+ locale_path_len = strlen(locale_path) + 1;
40 }
41 else
42 /* We really have to load some data. First see whether the name is
Andrew Geissler635e0e42020-08-21 15:58:33 -050043diff --git a/locale/loadarchive.c b/locale/loadarchive.c
44index ba0fe45648..9737fd4cda 100644
45--- a/locale/loadarchive.c
46+++ b/locale/loadarchive.c
Andrew Geissler82c905d2020-04-13 13:39:40 -050047@@ -42,7 +42,7 @@
48
49
50 /* Name of the locale archive file. */
51-static const char archfname[] = COMPLOCALEDIR "/locale-archive";
52+static const char archfname[4096] __attribute__ ((section (".gccrelocprefix"))) = COMPLOCALEDIR "/locale-archive";
53
54 /* Size of initial mapping window, optimal if large enough to
55 cover the header plus the initial locale. */
Andrew Geissler635e0e42020-08-21 15:58:33 -050056diff --git a/locale/localeinfo.h b/locale/localeinfo.h
57index 1bfe22aa7f..fdc283c69a 100644
58--- a/locale/localeinfo.h
59+++ b/locale/localeinfo.h
60@@ -331,7 +331,7 @@ _nl_lookup_word (locale_t l, int category, int item)
Andrew Geissler82c905d2020-04-13 13:39:40 -050061 }
62
63 /* Default search path if no LOCPATH environment variable. */
64-extern const char _nl_default_locale_path[] attribute_hidden;
65+extern char _nl_default_locale_path[4096] attribute_hidden;
66
67 /* Load the locale data for CATEGORY from the file specified by *NAME.
68 If *NAME is "", use environment variables as specified by POSIX, and
Andrew Geissler635e0e42020-08-21 15:58:33 -050069diff --git a/locale/programs/locale.c b/locale/programs/locale.c
70index e2e309c2a1..61a92cdcd1 100644
71--- a/locale/programs/locale.c
72+++ b/locale/programs/locale.c
73@@ -632,6 +632,7 @@ nameentcmp (const void *a, const void *b)
Andrew Geissler82c905d2020-04-13 13:39:40 -050074 ((const struct nameent *) b)->name);
75 }
76
77+static char _write_archive_locales_path[4096] attribute_hidden __attribute__ ((section (".gccrelocprefix"))) = ARCHIVE_NAME;
78
79 static int
80 write_archive_locales (void **all_datap, char *linebuf)
Andrew Geissler635e0e42020-08-21 15:58:33 -050081@@ -645,7 +646,7 @@ write_archive_locales (void **all_datap, char *linebuf)
Andrew Geissler82c905d2020-04-13 13:39:40 -050082 int fd, ret = 0;
83 uint32_t cnt;
84
85- fd = open64 (ARCHIVE_NAME, O_RDONLY);
86+ fd = open64 (_write_archive_locales_path, O_RDONLY);
87 if (fd < 0)
88 return 0;
89
Andrew Geissler635e0e42020-08-21 15:58:33 -050090@@ -700,8 +701,8 @@ write_archive_locales (void **all_datap, char *linebuf)
Andrew Geissler82c905d2020-04-13 13:39:40 -050091 if (cnt)
92 putchar_unlocked ('\n');
93
94- printf ("locale: %-15.15s archive: " ARCHIVE_NAME "\n%s\n",
95- names[cnt].name, linebuf);
96+ printf ("locale: %-15.15s archive: %s\n%s\n",
97+ names[cnt].name, _write_archive_locales_path, linebuf);
98
99 locrec = (struct locrecent *) (addr + names[cnt].locrec_offset);
100
Andrew Geissler635e0e42020-08-21 15:58:33 -0500101--
1022.27.0
103