On 2019-07-21 1:01 a.m., Yangfl wrote:
> John David Anglin <[email protected]> 于2019年7月21日周日 上午5:03写道:
>> Source: libminini
>> Version: 1.2.a+ds-2
>> Severity: normal
>>
>> Dear Maintainer,
>>
>> The build fails in test1 with a segmentation fault:
>>
>> LD_LIBRARY_PATH=. ./test1
>> Segmentation fault
>>
>> This is caused by the fact that objects linked into shared libraries need
>> to be compiled with the -fPIC option. This option also needs to be added
>> when linking shared libraries. With this problem fixed, test1 now runs
>> correctly but test2 fails at the following assert:
> Hmm, I'm still confused why this option is not needed on any other arch?
It's definitely a problem on architectures that aren't PIC by default.
On 32-bit hppa, register r19 is the PIC register when PIC code is generated.
In non-PIC code,
r19 is a general register. The PIC register for a shared library is set on
entry by long branch
stubs set up by the linker. If a shared library contains non PIC code, r19 may
be clobbered.
That's what happens here in test1:
(gdb) c
Continuing.
Breakpoint 1, 0xfabcca28 in ini_gets (Section=0x11878 "first",
Key=0x11870 "string", DefValue=0x11868 "dummy",
Buffer=0xf8f022d4 "\372Wl\200", BufferSize=<optimized out>,
Filename=<optimized out>) at minIni.cc:374
374 if (ini_openread(Filename, &fp)) {
(gdb) stepi
0xfabcca2c 374 if (ini_openread(Filename, &fp)) {
(gdb) disass $pc-16,$pc+16
Dump of assembler code from 0xfabcca1c to 0xfabcca3c:
0xfabcca1c <ini_gets(char const*, char const*, char const*, char*, int, char
const*)+44>: stw r4,-68(sp)
0xfabcca20 <ini_gets(char const*, char const*, char const*, char*, int, char
const*)+48>: ldw -b4(sp),r4
0xfabcca24 <ini_gets(char const*, char const*, char const*, char*, int, char
const*)+52>: stw r3,-64(sp)
0xfabcca28 <ini_gets(char const*, char const*, char const*, char*, int, char
const*)+56>: b,l 0xfabcb91c,rp
=> 0xfabcca2c <ini_gets(char const*, char const*, char const*, char*, int, char
const*)+60>: copy r23,r3
0xfabcca30 <ini_gets(char const*, char const*, char const*, char*, int, char
const*)+64>: cmpib,= 0,ret0,0xfabcca70 <ini_gets(char const*,
char const*, char const*, char*, int, char const*)+128>
0xfabcca34 <ini_gets(char const*, char const*, char const*, char*, int, char
const*)+68>: stw ret0,-78(sp)
0xfabcca38 <ini_gets(char const*, char const*, char const*, char*, int, char
const*)+72>: ldi -1,ret0
End of assembler dump.
(gdb) stepi
0xfabcb91c in ?? ()
from /home/dave/debian/libminini-x/libminini-1.2.a+ds/libminIni.so.1
(gdb) x/4i $pc
=> 0xfabcb91c: addil L%-800,r19,r1
0xfabcb920: ldw 794(r1),r21
0xfabcb924: bv r0(r21)
0xfabcb928: ldw 798(r1),r19
(gdb) p/x $r19
$1 = 0x0
(gdb) stepi
0xfabcb920 in ?? ()
from /home/dave/debian/libminini-x/libminini-1.2.a+ds/libminIni.so.1
(gdb) bt
#0 0xfabcb920 in ?? ()
from /home/dave/debian/libminini-x/libminini-1.2.a+ds/libminIni.so.1
#1 0xfabcca30 in ini_gets (Section=0x11878 "first", Key=0x11870 "string",
DefValue=0x11868 "dummy", Buffer=0xf8f022d4 "\372Wl\200",
BufferSize=<optimized out>, Filename=<optimized out>) at minIni.cc:374
#2 0x000108b4 in main ()
(gdb) stepi
Program received signal SIGSEGV, Segmentation fault.
0xfabcb920 in ?? ()
from /home/dave/debian/libminini-x/libminini-1.2.a+ds/libminIni.so.1
Non-PIC code also uses different relocations. Some are not valid in PIC code.
The reason to pass "-fPIC" in shared link commands is in some circumstances
(e.g., lto) the
linker may perform compilations and generate objects that are linked into the
shared object.
Dave
--
John David Anglin [email protected]