2

我使用 Bash 来获取 ac 程序变量的地址。如何知道地址是否与整数、浮点数或双精度变量有关?

4

1 回答 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,那么您能做的最好的事情就是使用二进制转储实用程序(例如nmobjdump或)获取给定对象的大小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计算我们感兴趣的地址与紧随其后的地址之间的差异。注意地址是十六进制的,所以我们需要bcibase参数来说明。${var^^}bash 扩展还根据bc需要将十六进制数字 af 转换为大写。
于 2013-11-04T17:53:45.693 回答