summaryrefslogtreecommitdiffstats
path: root/meta/recipes-core/glibc/glibc/0005-nativesdk-glibc-Make-relocatable-install-for-locales.patch
blob: 5cd235f6ac9b332f1275aeb08baa3e3d2fb736b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
From 50ab0b0c116f4ae3d975ec1b15ed4595fd9147f6 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 05/28] 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 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/locale/findlocale.c b/locale/findlocale.c
index 9af605bd64..b2b0a3f93b 100644
--- a/locale/findlocale.c
+++ b/locale/findlocale.c
@@ -56,7 +56,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.  */
@@ -167,7 +167,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 803c1cf2a4..9023f475b8 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 7c1cc3eecb..53cb8bfc59 100644
--- a/locale/localeinfo.h
+++ b/locale/localeinfo.h
@@ -325,7 +325,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
Index: git/locale/programs/locale.c
===================================================================
--- git.orig/locale/programs/locale.c
+++ git/locale/programs/locale.c
@@ -632,6 +632,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)
@@ -645,7 +646,7 @@ write_archive_locales (void **all_datap,
   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;
 
@@ -700,8 +701,8 @@ write_archive_locales (void **all_datap,
 	  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);