0007-nativesdk-glibc-Make-relocatable-install-for-locales.patch 3.8 KB

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