GCC链接libc静态

时间:2015-12-31 16:09:51

标签: c gcc libc

我想链接libc.a和test.c但是不顺利

#test.c  
#include<stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
 char *ptr;
 ptr = malloc(1024);
 free(ptr);
 return 0;
}

GCC链接libc static

gcc test.c mystrcmp.c ./libc.a
ldd ./a.out
linux-gate.so.1 =>  (0xb7767000)
        libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb7737000)
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb758e000)
        /lib/ld-linux.so.2 (0xb7768000)

此方法是网站(GCC linking libc static and some other library dynamically, revisited?)。

mystrcmp.c是定义strcmp函数的,因为没有mystrcmp.c它不起作用。

执行此文件

./a.out 
Segmentation fault

abort位于__libc_start_main

(gdb) r

Program received signal SIGSEGV, Segmentation fault.
0x0804d5a7 in __libc_start_main ()
(gdb)disas
Dump of assembler code for function __libc_start_main:
   0x0804d560 <+0>:     push   %ebp
   0x0804d561 <+1>:     mov    $0x0,%eax
   0x0804d566 <+6>:     push   %edi
   0x0804d567 <+7>:     push   %esi
   0x0804d568 <+8>:     push   %ebx
   0x0804d569 <+9>:     sub    $0x4c,%esp
   0x0804d56c <+12>:    test   %eax,%eax
   0x0804d56e <+14>:    mov    0x6c(%esp),%ebp
   0x0804d572 <+18>:    mov    0x70(%esp),%edi
   0x0804d576 <+22>:    mov    0x74(%esp),%esi
   0x0804d57a <+26>:    je     0x804d6fa <__libc_start_main+410>
   0x0804d580 <+32>:    mov    0x0,%ecx
   0x0804d586 <+38>:    xor    %eax,%eax
   0x0804d588 <+40>:    test   %ecx,%ecx
   0x0804d58a <+42>:    sete   %al
   0x0804d58d <+45>:    mov    0x64(%esp),%edx
   0x0804d591 <+49>:    mov    0x68(%esp),%ecx
   0x0804d595 <+53>:    mov    %eax,0x80ee5c4
   0x0804d59a <+58>:    lea    0x4(%ecx,%edx,4),%eax
   0x0804d59e <+62>:    mov    0x78(%esp),%edx
   0x0804d5a2 <+66>:    mov    %eax,0x80ef5a8
=> 0x0804d5a7 <+71>:    mov    %edx,0x80eded4

中止locate的映射。

(gdb) shell pmap 15147
15147:   /home/watanabe/dlmalloc/test
08048000    660K r-x--  /home/a.out
080ed000      4K r----  /home/a.out
080ee000      4K rw---  /home/a.out
080ef000      8K rw---    [ anon ]
b7e02000      8K rw---    [ anon ]
b7e04000   1676K r-x--  /lib/i386-linux-gnu/libc-2.15.so
b7fa7000      8K r----  /lib/i386-linux-gnu/libc-2.15.so
b7fa9000      4K rw---  /lib/i386-linux-gnu/libc-2.15.so

0x80eded4是只读的,因此程序是中止的;

gcc -static test.c时,a.out映射。

_libc_start_main
   0x08048f7e <+62>:    mov    0x78(%esp),%edx
   0x08048f82 <+66>:    mov    %eax,0x80ef5a8
   0x08048f87 <+71>:    mov    %edx,0x80edfc0

(gdb) shell pmap 15199
15199:   /home/watanabe/dlmalloc/a.out
08048000    660K r-x--  /home/a.out
080ed000      8K rw---  /home/a.out
080ef000    144K rw---    [ anon ]
b7fff000      4K r-x--    [ anon ]

0x80edfc0是读写的,所以顺利进行

如果你这样做会怎么样?

0 个答案:

没有答案