创建可执行的共享库

239 篇文章 2 订阅
147 篇文章 1 订阅

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

1
2
3
4
5
6
7
~$ /lib/i386-linux-gnu/libc.so.6
GNU 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相关选项可以创建这种共享库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//~ 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;
}
1
2
3
4
5
6
7
$ # -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.so
echo from main in echo.c:8
$ LD_LIBRARY_PATH=. ./main
echo from main in main.c:6

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ objdump -d libecho.so
000005d0 <_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和安全相关的一些信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值