1From bf1603b3d73f64de777be00f7e55f2cfef596102 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 locale/programs/locale.c | 7 ++++--- 19 4 files changed, 8 insertions(+), 7 deletions(-) 20 21diff --git a/locale/findlocale.c b/locale/findlocale.c 22index 5986373edd..856ba9afc0 100644 23--- a/locale/findlocale.c 24+++ b/locale/findlocale.c 25@@ -55,7 +55,7 @@ struct __locale_data *const _nl_C[] attribute_hidden = 26 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. */ 34@@ -165,7 +165,7 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, 35 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 43diff --git a/locale/loadarchive.c b/locale/loadarchive.c 44index 512769eaec..436619091b 100644 45--- a/locale/loadarchive.c 46+++ b/locale/loadarchive.c 47@@ -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. */ 56diff --git a/locale/localeinfo.h b/locale/localeinfo.h 57index b3d4da0185..22f9dc1140 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) 61 } 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 69diff --git a/locale/programs/locale.c b/locale/programs/locale.c 70index e9275d6b83..a9109155e5 100644 71--- a/locale/programs/locale.c 72+++ b/locale/programs/locale.c 73@@ -631,6 +631,7 @@ nameentcmp (const void *a, const void *b) 74 ((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) 81@@ -644,7 +645,7 @@ write_archive_locales (void **all_datap, char *linebuf) 82 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 90@@ -699,8 +700,8 @@ write_archive_locales (void **all_datap, char *linebuf) 91 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 101