创建可执行的共享库

来源:互联网 发布:最终幻想15捏脸数据 编辑:程序博客网 时间:2024/06/12 19:44

偶然发现glibc提供的libc.so是“可执行的”,这是快速查看glibc版本的一种方法,

1234567
~$ /lib/i386-linux-gnu/libc.so.6GNU C Library (Ubuntu EGLIBC 2.13-20ubuntu5.1) stable release version 2.13, by Roland McGrath et al.Copyright (C) 2011 Free Software Foundation, Inc....Compiled by GNU CC version 4.6.1.Compiled on a Linux 3.0.17 system on 2012-03-07....

  这是gcc提供的一种叫做PIE(Position Independent Executable)的特性,可以创建位置无关的可以执行对象。它可以像共享库一样被加载到任何地址上执行。使用gcc的PIE相关选项可以创建这种共享库:

1234567891011121314151617181920
//~ echo.c#include <stdio.h>void echo(const char *s) {    printf("%s\n", s);}int main() {    char s[64];    snprintf(s, sizeof(s), "echo from %s in %s:%d", __func__, __FILE__, __LINE__);    echo(s);    return 0;}//~ main.c#include <stdio.h>extern void echo(const char*);int main() {    char s[64];    snprintf(s, sizeof(s), "echo from %s in %s:%d", __func__, __FILE__, __LINE__);    echo(s);    return 0;}
1234567
$ # -E let ld export dynamic symbols explicitly$ cc -fPIC -pie -shared -Wl,-E -o libecho.so echo.c $ cc main.c -L. -lecho -o main$ ./libecho.soecho from main in echo.c:8$ LD_LIBRARY_PATH=. ./mainecho from main in main.c:6

  使用objdump反汇编libecho.so,会看到,它同普通的so一样没有使用虚拟空间的绝对地址,但libecho.so中却含有_start符号(gcc生成的可执行程序的入口点)。

123456789101112131415161718192021
$ objdump -d libecho.so000005d0 <_start>: 5d0:31 ed                xor    %ebp,%ebp 5d2:5e                   pop    %esi 5d3:89 e1                mov    %esp,%ecx 5d5:83 e4 f0             and    $0xfffffff0,%esp...000006cc <echo>: 6cc:55                   push   %ebp 6cd:89 e5                mov    %esp,%ebp 6cf:53                   push   %ebx 6d0:83 ec 14             sub    $0x14,%esp 6d3:e8 ef ff ff ff       call   6c7 <__i686.get_pc_thunk.bx> 6d8:81 c3 1c 19 00 00    add    $0x191c,%ebx 6de:8b 45 08             mov    0x8(%ebp),%eax 6e1:89 04 24             mov    %eax,(%esp) 6e4:e8 a7 fe ff ff       call   590 <puts@plt> 6e9:83 c4 14             add    $0x14,%esp 6ec:5b                   pop    %ebx 6ed:5d                   pop    %ebp 6ee:c3                   ret

  更多关于PIE的信息,可以查看gcc中-fPIC/-fpic/-fPIE/-fpie/-pie选项,这篇文章还介绍了PIE和安全相关的一些信息。

原创粉丝点击