[PATCH] S390: Fix relocation of _nl_current_LC_CATETORY_used in static build. [BZ #19860]

Stefan Liebler stli@linux.vnet.ibm.com
Tue Jun 28 08:53:00 GMT 2016


Hi,

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. Thus I propose to 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.

Okay to commit?

ChangeLog:

	[BZ #19860]
	* locale/localeinfo.h (_NL_CURRENT_DEFINE):
	Set _nl_current_LC_CATEGORY_used to two instead of one.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 20160628_nl_current_CATEGORY_used_bz19860.patch
Type: text/x-patch
Size: 3491 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/libc-alpha/attachments/20160628/afbcf32b/attachment.bin>


More information about the Libc-alpha mailing list