Fix new testcase elf/tst-latepthread on s390x.

The first dlopen ("tst-latepthreadmod.so", RTLD_LOCAL | RTLD_LAZY) call
in elf/tst-latepthread.c fails on s390x with "error: dlopen failed:
.../build-s390x/elf/tst-latepthreadmod.so:
undefined symbol: this_function_is_not_defined".

In elf/tst-latepthreadmod.c, this_function_is_not_defined is a sibling
call which leads to a R_390_GLOB_DAT relocation in .rela.dyn instead of
a R_390_JMP_SLOT in .rela.plt.

As RTLD_LAZY skips the JMP_SLOT relocations, but not GLOB_DAT ones,
the dlopen call fails. If elf/tst-latepthreadmod.c is build with
-fno-optimize-sibling-calls, a JMP_SLOT relocation is generated for
this_function_is_not_defined and the test passes.

ChangeLog:

	* elf/Makefile (CFLAGS-tst-latepthreadmod.c):
	Add -fno-optimize-sibling-calls.
This commit is contained in:
Stefan Liebler 2016-12-02 09:09:55 +01:00
parent 55a38f8236
commit f91d3fd64d
2 changed files with 8 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2016-12-02 Stefan Liebler <stli@linux.vnet.ibm.com>
* elf/Makefile (CFLAGS-tst-latepthreadmod.c):
Add -fno-optimize-sibling-calls.
2016-12-02 Joseph Myers <joseph@codesourcery.com> 2016-12-02 Joseph Myers <joseph@codesourcery.com>
* math/bits/mathcalls.h [__GLIBC_USE (IEC_60559_BFP_EXT)] (llogb): * math/bits/mathcalls.h [__GLIBC_USE (IEC_60559_BFP_EXT)] (llogb):

View File

@ -1271,6 +1271,9 @@ LDFLAGS-tst-audit12mod2.so = -Wl,--version-script=tst-audit12mod2.map
# Force lazy binding for the same reason. # Force lazy binding for the same reason.
LDFLAGS-tst-latepthreadmod.so = \ LDFLAGS-tst-latepthreadmod.so = \
-Wl,-z,lazy -Wl,--unresolved-symbols=ignore-all -Wl,-z,lazy -Wl,--unresolved-symbols=ignore-all
# Do not optimize sibling calls as the test relies on a JMP_SLOT relocation for
# function this_function_is_not_defined.
CFLAGS-tst-latepthreadmod.c = -fno-optimize-sibling-calls
$(objpfx)tst-latepthreadmod.so: $(shared-thread-library) $(objpfx)tst-latepthreadmod.so: $(shared-thread-library)
$(objpfx)tst-latepthread: $(libdl) $(objpfx)tst-latepthread: $(libdl)
$(objpfx)tst-latepthread.out: $(objpfx)tst-latepthreadmod.so $(objpfx)tst-latepthread.out: $(objpfx)tst-latepthreadmod.so