blob: b40d2bdef69e6dba87cd129b7490b459e3a8fe83 [file] [log] [blame]
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001From bf1603b3d73f64de777be00f7e55f2cfef596102 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 Geisslerd1e89492021-02-12 15:35:20 -06004Subject: [PATCH] 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
Andrew Geissler7e0e3c02022-02-25 20:34:39 +000022index 5986373edd..856ba9afc0 100644
Andrew Geissler635e0e42020-08-21 15:58:33 -050023--- a/locale/findlocale.c
24+++ b/locale/findlocale.c
Andrew Geissler7e0e3c02022-02-25 20:34:39 +000025@@ -55,7 +55,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 Geissler7e0e3c02022-02-25 20:34:39 +000034@@ -165,7 +165,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
Patrick Williams0ca19cc2021-08-16 14:03:13 -050044index 512769eaec..436619091b 100644
Andrew Geissler635e0e42020-08-21 15:58:33 -050045--- 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
Andrew Geisslerd1e89492021-02-12 15:35:20 -060057index b3d4da0185..22f9dc1140 100644
Andrew Geissler635e0e42020-08-21 15:58:33 -050058--- 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
Andrew Geissler7e0e3c02022-02-25 20:34:39 +000070index e9275d6b83..a9109155e5 100644
Andrew Geissler635e0e42020-08-21 15:58:33 -050071--- a/locale/programs/locale.c
72+++ b/locale/programs/locale.c
Andrew Geissler7e0e3c02022-02-25 20:34:39 +000073@@ -631,6 +631,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 Geissler7e0e3c02022-02-25 20:34:39 +000081@@ -644,7 +645,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 Geissler7e0e3c02022-02-25 20:34:39 +000090@@ -699,8 +700,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