我是靠谱客的博主 单身老鼠,最近开发中收集的这篇文章主要介绍在没有源码的情况下判断宏的具体值,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

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

比如下面一段代码 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


最后

以上就是单身老鼠为你收集整理的在没有源码的情况下判断宏的具体值的全部内容,希望文章能够帮你解决在没有源码的情况下判断宏的具体值所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部