静态链接
静态连接是将多个文件链接在一起并生成可执行文件的过程
示例代码:
a.c
extern int shared;
extern void swap(int* a,int* b);
int main(){
int a=10;
swap(&a,&shared);
}
b.c
int shared = 1;
int swap(int* a,int* b){
*a ^= *b ^= *a ^= *b;
}
将这a.c
和b.c
编译,使用下方命令
gcc -c a.c b.c -fno-stack-protector -m32
参数:
-c
: 在第一课中使用过,将a.c
编译为a.o
文件不进行链接-fno-stack-protector
: 禁用栈保护。默认会开启栈保护(GCC默认会增加一些代码来检测栈溢出),删除就会让编译的程序更小方便我们分析-m32
: 将a.c
编译为32可执行文件
使用上述gcc命令会将a.c
和b.c
编译为a.c
和b.o
的可执行文件,由于没有做链接,是无法执行的。
我们可以通过分析a.o
和b.o
来更深入的理解ELF文件的格式