练习3-1
问题
使⽤
gcc
编译代码并使⽤binutils
⼯具对⽣成的⽬标文件和可执⾏文件(ELF 格式
)进⾏分析。具体要求如下:
- 编写⼀个简单的打印
“hello world!”
的程序源文件:hello.c
- 对源文件进⾏本地编译,⽣成针对⽀持
x86_64
指令集架构处理器的⽬标文件hello.o
。- 查看
hello.o
的文件的文件头信息。- 查看
hello.o
的Section header table
。- 对
hello.o
反汇编,并查看hello.c
的 C 程序源码和机器指令的对应关系。
答案
1. 编写hello.c
#include <stdio.h>
int main(){
printf("hello world!\r\n");
return 0;
}
2. 本地编译
gcc -c hello.c -o hello.o
3. 查看文件头信息
查看文件头信息即查看
ELF Header
信息。
可以使用readelf
工具进行查看:
readelf -h hello.o
4. 查看Section header table
查看编译文件的
Section Header Table
可以使用readelf
工具进行查看:
readelf -SW hello.o
5. 反汇编
如果想要反汇编.o文件,需要在编译时就加入调试信息:
gcc -g -c hello.c
然后使用
objdump
工具查看反汇编
objdump -S hello.o
练习3-2
问题
如下例子C语言代码:
#include <stdio.h>
int global_init = 0x11111111;
const int global_const = 0x22222222;
void main()
{
static int static_var = 0x33333333;
static int static_var_uninit;
int auto_var = 0x44444444;
printf("hello world!\n");
return;
}
请问编译为 .o 文件后,
global_init
,global_const
,static_var
,static_var_uninit
,auto_var
这些变量分别存放在那些 section ⾥,"hello world!\n"
这个字符串⼜在哪⾥?并尝试⽤⼯具查看并验证你的猜测。
答案
变量 | Section |
---|---|
global_init | .data |
global_const | .rodata |
static_var | .data |
static_var_uninit | .bss |
auto_var | 栈区(运行时分配) |
"hello world!\n" | .rodata |
可以使用反汇编命令查看各个变量的存储区:
objdump -t hello.o
课程地址
PLCT-rvos-ch03 编译与链接