Openwall GNU/*/Linux - a small security-enhanced Linux distro for servers
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Fri, 1 May 2015 12:10:16 +0200
From: Szabolcs Nagy <nsz@...t70.net>
To: musl@...ts.openwall.com
Subject: Re: building musl libc.so with gcc -flto

* Andre McCurdy <armccurdy@...il.com> [2015-04-30 22:48:09 -0700]:
> I'm able to reproduce the problem I saw previously with the latest
> musl git version. Behaviour is that some binaries dynamically linked
> with gold (notably busybox) seem to run well but most binaries
> segfault at startup.
> 
> I'm using gcc 4.9.2 and binutils 2.25, but I should also mention that
> I'm using OpenEmbedded to build the toolchain and musl support in OE
> is still quite experimental...
> 
> Below is a link to a base64 encoded tar file containing two
> dynamically linked "hello world" x86 binaries. Both were created using
> the same OE toolchain (the only difference was the -fuse-ld=XXX option
> used). "hello.bfd" runs well, "hello.gold" segfaults. Hopefully they
> can give some clues about what's happening.
> 
>   http://pastebin.com/raw.php?i=RKJBqAg1

$ nm -D hello.gold
         w _ITM_deregisterTMCloneTable
         w _ITM_registerTMCloneTable
         w _Jv_RegisterClasses
08049670 A __bss_start
         w __deregister_frame_info
         U __libc_start_main
         w __register_frame_info
08049670 A _edata
08049690 A _end
         U printf

$ nm -D hello.bfd
08049564 B __bss_start
         U __libc_start_main
08049564 D _edata
08049584 B _end
         U printf

i'm not sure where gold expects __register_frame_info to be defined..

the call chain is

__dls3 -> do_init_fini -> _init -> frame_dummy -> __register_frame_info@plt -> 0

objdump:

0804846e <frame_dummy>:
 804846e:	55                   	push   %ebp
 804846f:	b8 70 83 04 08       	mov    $0x8048370,%eax
 8048474:	89 e5                	mov    %esp,%ebp
 8048476:	83 ec 08             	sub    $0x8,%esp
 8048479:	85 c0                	test   %eax,%eax
 804847b:	74 14                	je     8048491 <frame_dummy+0x23>
 804847d:	50                   	push   %eax
 804847e:	50                   	push   %eax
 804847f:	68 78 96 04 08       	push   $0x8049678
 8048484:	68 18 85 04 08       	push   $0x8048518
 8048489:	e8 e2 fe ff ff       	call   8048370 <__register_frame_info@plt>
...
08048370 <__register_frame_info@plt>:
 8048370:	ff 25 50 96 04 08    	jmp    *0x8049650
...

GOT at this point:

0x08049648: 0xf7f92263 (__libc_start_main)
0x0804964c: 0x00000000 (should be __deregister_frame_info?)
0x08049650: 0x00000000 (should be __register_frame_info?)
0x08049654: 0xf7fbedeb (printf)

readelf says:

Relocation section '.rel.plt' at offset 0x308 contains 4 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
08049648  00000107 R_386_JUMP_SLOT   00000000   __libc_start_main
0804964c  00000907 R_386_JUMP_SLOT   08048360   __deregister_frame_inf
08049650  00000607 R_386_JUMP_SLOT   08048370   __register_frame_info
08049654  00000507 R_386_JUMP_SLOT   00000000   printf

Symbol table '.dynsym' contains 11 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 00000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main
     2: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTab
     3: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable
     4: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses
     5: 00000000     0 FUNC    GLOBAL DEFAULT  UND printf
     6: 08048370     0 FUNC    WEAK   DEFAULT  UND __register_frame_info
     7: 08049690     0 NOTYPE  GLOBAL DEFAULT  ABS _end
     8: 08049670     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
     9: 08048360     0 FUNC    WEAK   DEFAULT  UND __deregister_frame_info
    10: 08049670     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start

Symbol table '.symtab' contains 39 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
...
    32: 00000000     0 FUNC    WEAK   DEFAULT  UND __deregister_frame_info
    33: 00000000     0 FUNC    WEAK   DEFAULT  UND __register_frame_info

Powered by blists - more mailing lists

Your e-mail address:

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.