我使用 Bash 来获取 ac 程序变量的地址。如何知道地址是否与整数、浮点数或双精度变量有关?
问问题
73 次
1 回答
1
正如评论所提到的,除非您有调试符号,否则您无法获得类型。但如果你确实有符号,那么你可以使用 GDB。考虑这个程序:
#include <stdio.h>
static int i = 42;
static float f = 42.1;
static double d = 42.2;
int main (int argc, char **argv) {
printf("i=%d, f=%f, d=%f\n", i, f, d);
return (0);
}
如果编译如下:
gcc -g -o types types.c
然后,您可以像这样获取变量的类型:
ubuntu@ubuntu:~$ echo ptype i | gdb --静默类型 从 /home/ubuntu/types 读取符号...完成。 (gdb) 类型 = int ubuntu@ubuntu:~$ echo ptype f | gdb --静默类型 从 /home/ubuntu/types 读取符号...完成。 (gdb) 类型 = 浮点数 ubuntu@ubuntu:~$ echo ptype d | gdb --静默类型 从 /home/ubuntu/types 读取符号...完成。 (gdb) 类型 = 双 ubuntu@ubuntu:~$
如果您只有符号表而没有完整的调试信息,即二进制文件是用 编译的-g
,然后由 处理strip -d
,那么您能做的最好的事情就是使用二进制转储实用程序(例如nm
,objdump
或)获取给定对象的大小readelf
。
使用nm
:
ubuntu@ubuntu:~$ read addr next_addr <<< $(nm -n types | grep -A1 ' i$' | cut -d' ' -f1)
ubuntu@ubuntu:~$ echo "ibase=16; ${next_addr^^} - ${addr^^}" | bc
4
ubuntu@ubuntu:~$ read addr next_addr <<< $(nm -n types | grep -A1 ' f$' | cut -d' ' -f1)
ubuntu@ubuntu:~$ echo "ibase=16; ${next_addr^^} - ${addr^^}" | bc
4
ubuntu@ubuntu:~$ read addr next_addr <<< $(nm -n types | grep -A1 ' d$' | cut -d' ' -f1)
ubuntu@ubuntu:~$ echo "ibase=16; ${next_addr^^} - ${addr^^}" | bc
8
ubuntu@ubuntu:~$
这工作如下:
nm -n
按数字顺序列出带有地址的符号表grep -A1 ' i$
使用紧随其后的行过滤我们感兴趣的交易品种。请注意,这是一个正则表达式搜索,旨在准确查找符号i
,仅此而已cut -d' ' -f1
仅列出地址read addr next_addr
将地址放入两个变量中- 然后通过管道输入的表达式
bc
计算我们感兴趣的地址与紧随其后的地址之间的差异。注意地址是十六进制的,所以我们需要bc
用ibase
参数来说明。${var^^}
bash 扩展还根据bc
需要将十六进制数字 af 转换为大写。
于 2013-11-04T17:53:45.693 回答