123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- From ce4e796fa8bd2df962cf7a0e4bc69ab6181e4ebf Mon Sep 17 00:00:00 2001
- From: Khem Raj <raj.khem@gmail.com>
- Date: Fri, 3 Aug 2018 09:55:12 -0700
- Subject: [PATCH] nativesdk-glibc: Make relocatable install for locales
- The glibc locale path is hard-coded to the install prefix, but in SDKs we need
- to be able to relocate the binaries. Expand the strings to 4K and put them in a
- magic segment that we can relocate at install time.
- Upstream-Status: Inappropriate (OE-specific)
- Signed-off-by: Ross Burton <ross.burton@intel.com>
- Signed-off-by: Khem Raj <raj.khem@gmail.com>
- ---
- locale/findlocale.c | 4 ++--
- locale/loadarchive.c | 2 +-
- locale/localeinfo.h | 2 +-
- locale/programs/locale.c | 7 ++++---
- 4 files changed, 8 insertions(+), 7 deletions(-)
- diff --git a/locale/findlocale.c b/locale/findlocale.c
- index fc433b61d8..d6f030f13c 100644
- --- a/locale/findlocale.c
- +++ b/locale/findlocale.c
- @@ -55,7 +55,7 @@ struct __locale_data *const _nl_C[] attribute_hidden =
- which are somehow addressed. */
- struct loaded_l10nfile *_nl_locale_file_list[__LC_LAST];
-
- -const char _nl_default_locale_path[] attribute_hidden = COMPLOCALEDIR;
- +char _nl_default_locale_path[4096] attribute_hidden __attribute__ ((section (".gccrelocprefix"))) = COMPLOCALEDIR;
-
- /* Checks if the name is actually present, that is, not NULL and not
- empty. */
- @@ -165,7 +165,7 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len,
-
- /* Nothing in the archive. Set the default path to search below. */
- locale_path = _nl_default_locale_path;
- - locale_path_len = sizeof _nl_default_locale_path;
- + locale_path_len = strlen(locale_path) + 1;
- }
- else
- /* We really have to load some data. First see whether the name is
- diff --git a/locale/loadarchive.c b/locale/loadarchive.c
- index fcc4913319..62cae8c6c0 100644
- --- a/locale/loadarchive.c
- +++ b/locale/loadarchive.c
- @@ -42,7 +42,7 @@
-
-
- /* Name of the locale archive file. */
- -static const char archfname[] = COMPLOCALEDIR "/locale-archive";
- +static const char archfname[4096] __attribute__ ((section (".gccrelocprefix"))) = COMPLOCALEDIR "/locale-archive";
-
- /* Size of initial mapping window, optimal if large enough to
- cover the header plus the initial locale. */
- diff --git a/locale/localeinfo.h b/locale/localeinfo.h
- index fd43033a19..3dc26272a0 100644
- --- a/locale/localeinfo.h
- +++ b/locale/localeinfo.h
- @@ -347,7 +347,7 @@ _nl_lookup_word (locale_t l, int category, int item)
- }
-
- /* Default search path if no LOCPATH environment variable. */
- -extern const char _nl_default_locale_path[] attribute_hidden;
- +extern char _nl_default_locale_path[4096] attribute_hidden;
-
- /* Load the locale data for CATEGORY from the file specified by *NAME.
- If *NAME is "", use environment variables as specified by POSIX, and
- diff --git a/locale/programs/locale.c b/locale/programs/locale.c
- index 1b51b50d68..87c9049444 100644
- --- a/locale/programs/locale.c
- +++ b/locale/programs/locale.c
- @@ -631,6 +631,7 @@ nameentcmp (const void *a, const void *b)
- ((const struct nameent *) b)->name);
- }
-
- +static char _write_archive_locales_path[4096] attribute_hidden __attribute__ ((section (".gccrelocprefix"))) = ARCHIVE_NAME;
-
- static int
- write_archive_locales (void **all_datap, char *linebuf)
- @@ -644,7 +645,7 @@ write_archive_locales (void **all_datap, char *linebuf)
- int fd, ret = 0;
- uint32_t cnt;
-
- - fd = open64 (ARCHIVE_NAME, O_RDONLY);
- + fd = open64 (_write_archive_locales_path, O_RDONLY);
- if (fd < 0)
- return 0;
-
- @@ -699,8 +700,8 @@ write_archive_locales (void **all_datap, char *linebuf)
- if (cnt)
- putchar_unlocked ('\n');
-
- - printf ("locale: %-15.15s archive: " ARCHIVE_NAME "\n%s\n",
- - names[cnt].name, linebuf);
- + printf ("locale: %-15.15s archive: %s\n%s\n",
- + names[cnt].name, _write_archive_locales_path, linebuf);
-
- locrec = (struct locrecent *) (addr + names[cnt].locrec_offset);
-
|