在没有源码的情况下判断宏的具体值

本文详细介绍了如何通过反汇编技术来解析宏定义的值,以解决在编译过程中遇到的头文件缺失问题。以实际代码示例为例,展示如何利用arm-none-linux-gnueabi-objdump命令获取宏值,从而解决编译错误。重点在于理解编译过程中的宏展开原理及反汇编技术的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候虽然有一部分代码,但比如这代码里用到了某一个宏,而这个宏定义的头文件你没有。

这种情况下如何判断宏的值呢?

可以通过对对应的二进制文件反汇编来处理。

比如下面一段代码 test.c:

#include "foo.h"

int foo(int i)
{
	return 0;
}

int test(void)
{
	foo(FOO);
	return 0;
}


对应的foo.h定义了一个宏:

#define FOO 0xdeafdeaf

使用下面命令编译test.c:

$ arm-none-linux-gnueabi-gcc -o libtest.so test.c -shared


好,这时候假如不知道FOO的值。使用如下的命令:

$ arm-none-linux-gnueabi-objdump -D libtest.so 

我们看test函数的反汇编结果:

00000684 <test>:
 684:   e92d4800        push    {fp, lr}
 688:   e28db004        add     fp, sp, #4
 68c:   e59f000c        ldr     r0, [pc, #12]   ; 6a0 <test+0x1c>
 690:   ebffff8e        bl      4d0 <_init+0x38>
 694:   e3a03000        mov     r3, #0
 698:   e1a00003        mov     r0, r3
 69c:   e8bd8800        pop     {fp, pc}
 6a0:   deafdeaf        cdple   14, 10, cr13, cr15, cr15, {5}

bl这个是跳转指令,在之前的r0是传给函数的参数。通过ldr获取,获取的值在6a0处,为deafdeaf。

这样我们就能知道FOO的值为0xdeafdeaf


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值