diff options
author | Stefan Liebler <stli@linux.vnet.ibm.com> | 2016-06-28 12:23:35 +0200 |
---|---|---|
committer | Stefan Liebler <stli@linux.vnet.ibm.com> | 2016-06-28 12:28:53 +0200 |
commit | 5fa268239b46e127f941c3510ad200ce5ef8df45 (patch) | |
tree | 7d1a01839f5eec926509e97fe2d192afd4c46419 /ChangeLog | |
parent | 0cdaef4dac5a885af9848e158e77cc347ee781bb (diff) | |
download | glibc-5fa268239b46e127f941c3510ad200ce5ef8df45.tar.gz |
S390: Fix relocation of _nl_current_LC_CATETORY_used in static build. [BZ #19860]
With shared libc, all locale categories are always loaded.
For static libc they aren't, but there exist a weak
_nl_current_LC_CATEGORY_used symbol for each category.
If the category is used, the locale/lc-CATEGORY.o is linked in
where _NL_CURRENT_DEFINE (LC_CATEGORY) defines and sets the
_nl_current_LC_CATEGORY_used symbol to one.
As reported by Marcin
"Bug 18960 - s390: _nl_locale_subfreeres uses larl opcode on misaligned symbol"
(https://sourceware.org/bugzilla/show_bug.cgi?id=18960)
In function _nl_locale_subfreeres (locale/setlocale.c) for each category
a check - &_nl_current_LC_CATEGORY_used != 0 - decides whether the category
is used or not.
There is also a second usage with the same mechanism in function __uselocale
(locale/uselocale.c).
On s390 a larl instruction with R_390_PC32DBL relocation is used to
get the address of _nl_current_LC_CATEGORY_used symbols. As larl loads the
address relative in halfwords and the code is always 2-byte aligned,
larl can only load even addresses.
At the end, the relocated address is always zero and never one.
Marcins patch (see bugzilla) uses the following declaration in locale/setlocale.c:
extern char _nl_current_##category##_used __attribute__((__aligned__(1)));
In function _nl_locale_subfreeres all categories are checked and therefore gcc
is now building an array of addresses in rodata section with an R_390_64
relocation for every address. This array is loaded with larl instruction and
each address is accessed by index.
This fixes only the usage in _nl_locale_subfreeres. Each user has to add the
alignment attribute.
This patch set the _nl_current_LC_CATEGORY_used symbols to two instead of one.
This way gcc can use larl instruction and the check against zero works on
every usage.
ChangeLog:
[BZ #19860]
* locale/localeinfo.h (_NL_CURRENT_DEFINE):
Set _nl_current_LC_CATEGORY_used to two instead of one.
Diffstat (limited to 'ChangeLog')
-rw-r--r-- | ChangeLog | 6 |
1 files changed, 6 insertions, 0 deletions
@@ -1,3 +1,9 @@ +2016-06-28 Stefan Liebler <stli@linux.vnet.ibm.com> + + [BZ #19860] + * locale/localeinfo.h (_NL_CURRENT_DEFINE): + Set _nl_current_LC_CATEGORY_used to two instead of one. + 2016-06-27 Aurelien Jarno <aurelien@aurel32.net> * sysdeps/mips/tst-mode-switch-1.c (main): Converted to ... |