gcc 如何编译so 和 objdump 反汇编

本文档详细介绍了如何在Cygwin环境下使用gcc编译生成so文件,通过添加-fPIC选项确保生成位置无关代码。然后利用objdump工具对编译后的libtest.so进行反汇编,展示了反编译后的汇编代码,进一步阐述了objdump在分析二进制文件中的应用。

1、打开cygwin 终端

2、切换到源码所在目录




3、通过gcc编译

输入:gcc test.c -fPIC -shared -o libtest.so


-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),


编译之后生成了 libtest.so


4.使用objdump 对so进行反编译


result.txt中对应的汇编代码



test.c中的源码


主要介绍objdump的作用


<think>我们被要求回答:如何使用gcc编译生成反汇编代码? 根据引用[2]引用[3]提供的信息,我们可以总结如下: 1. 使用gcc编译选项可以生成反汇编代码,通常使用`-S`选项可以生成汇编代码(注意:这是汇编代码,不是反汇编,但有时我们也把从机器码转换为汇编代码的过程称为反汇编)。 2. 实际上,我们通常使用`objdump`工具来进行反汇编,而gcc本身并不直接生成反汇编代码,但我们可以通过gcc编译生成可执行文件或目标文件,然后用objdump反汇编。 但是,根据引用[2]提到: arm-none-eabi-objdump的参数-S表示尽可能的把原来的代码反汇编出来的代码一起呈现出来,-S参数需要结合 arm-linux-gcc编译参数-g,才能达到反汇编时同时输出原来的代码。 所以,我们可以分两种情况: 情况一:生成汇编代码(编译阶段,从C代码到汇编代码) 使用gcc的-S选项,例如:gcc -S source.c -o output.s 这样会生成汇编代码文件output.s。 情况二:生成反汇编代码(从可执行文件或目标文件反汇编) 步骤: 1. 用gcc编译源文件生成目标文件或可执行文件,并且为了在反汇编时看到C源代码,需要加上-g选项(调试信息)。 2. 使用objdump工具进行反汇编,命令为:objdump -d 文件名 (只反汇编代码段) 或者使用:objdump -D 文件名 (反汇编所有段) 如果希望混合显示源代码汇编代码,则使用:objdump -S 文件名 注意:使用objdump的-S选项时,需要目标文件或可执行文件包含调试信息(即编译时使用-g选项)。 因此,具体步骤为: 1. 编译C程序并加入调试信息(-g): gcc -g -c source.c -o source.o # 生成目标文件 或者直接生成可执行文件: gcc -g source.c -o program 2. 使用objdump反汇编目标文件或可执行文件: objdump -S source.o > source_disassembly.txt # 将反汇编输出到文件 或 objdump -S program > program_disassembly.txt 另外,如果只想生成汇编代码(即编译过程中的汇编输出,而不是反汇编),则使用: gcc -S source.c # 默认生成source.s gcc -S source.c -o output.s 但注意:-S生成的汇编代码是编译器生成的汇编,而objdump反汇编的是机器码对应的汇编,两者在格式注释上可能有所不同。 因此,回答用户问题:如何生成反汇编代码?我们应推荐使用objdump工具,并配合编译时使用-g选项以得到更好的可读性(混合源代码汇编)。 总结步骤: 方法一:生成纯汇编代码(编译阶段) gcc -S source.c -o source.s 方法二:生成反汇编代码(从二进制文件反汇编gcc -g source.c -o program objdump -S program > disassembly.txt 注意:如果使用交叉编译工具链,则objdump应替换为对应的交叉版本,如arm-linux-gnueabi-objdump。 根据引用[2]的例子,他们使用的是arm-none-eabi-objdump,所以对于不同的目标平台,需要选择对应的objdump。 因此,在回答中,我们可以这样写:</think>### 如何使用 GCC 生成反汇编代码 在 Linux 环境下,使用 GCC 生成反汇编代码主要通过两种方式实现,以下是详细步骤原理说明: --- #### 方法一:直接生成汇编文件(编译阶段) 使用 GCC 的 `-S` 选项可在编译过程中生成汇编代码文件: ```bash # 基本用法 gcc -S source.c -o output.s # 完整示例(包含调试信息) gcc -g -S -fverbose-asm -O0 source.c -o source.s ``` **参数说明**: - `-S`:在编译阶段停止,生成汇编代码文件 - `-g`:添加调试信息(与反汇编工具配合使用) - `-O0`:禁用优化(保持代码结构清晰) - `-fverbose-asm`:在汇编中添加注释变量名[^3] **生成文件**: - 输出 `.s` 文件包含完整的汇编指令符号信息 - 示例输出片段: ```nasm main: pushq %rbp movq %rsp, %rbp # 创建栈帧 movl $42, -4(%rbp) # int a = 42; movl -4(%rbp), %eax popq %rbp ret ``` --- #### 方法二:从二进制文件反汇编(链接后) 使用 `objdump` 工具对可执行文件进行反汇编: ```bash # 编译时添加调试信息 gcc -g source.c -o program # 反汇编可执行文件 objdump -dS program > disassembly.txt ``` **关键参数**: - `-d`:反汇编代码段 - `-S`:交叉显示源代码汇编(需 `-g` 编译选项)[^2] - `-M intel`:指定 Intel 汇编语法(默认 AT&T) **输出示例**: ```nasm 0000000000001139 <main>: #include <stdio.h> int main() { 1139: 55 push %rbp 113a: 48 89 e5 mov %rsp,%rbp int a = 42; 113d: c7 45 fc 2a 00 00 00 movl $0x2a,-0x4(%rbp) # 0x2a = 42 return a; 1144: 8b 45 fc mov -0x4(%rbp),%eax } 1147: 5d pop %rbp 1148: c3 ret ``` --- #### 高级技巧 1. **指定目标架构**: ```bash # ARM 平台反汇编 arm-linux-gnueabi-objdump -d -S program > arm_disasm.txt ``` 2. **分离代码段**: ```bash # 仅反汇编 .text 段 objdump -j .text -dS program > code_section.txt ``` 3. **生成 Intel 语法**: ```bash objdump -d -M intel program > intel_disasm.txt ``` --- #### 注意事项 1. **调试信息依赖**: - 交叉显示源码需编译时添加 `-g` 选项[^2] - 优化级别会影响反汇编可读性(建议使用 `-O0`) 2. **工具链选择**: | 文件类型 | 工具 | 特点 | |---------------|--------------|--------------------------| | 可执行文件 | objdump | 支持交叉显示源码 | | 目标文件(.o) | objdump -d | 显示未链接的汇编 | | 动态库(.so) | objdump -T | 查看动态符号表 | 3. **ARM 平台特殊处理**: ```bash # Thumb 指令集反汇编 arm-none-eabi-objdump -d --disassembler-options=force-thumb program ``` > 提示:使用 `gcc -Wa,-adhln -g source.c` 可实时查看编译过程中的汇编输出[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值