【发布时间】:2022-11-03 18:45:48
【问题描述】:
我正在 Linux 上用 gcc 编译一个简单的 c 文件,并使用 readelf 来查找符号信息。 函数名称(可能还有其他符号 - 我没有检查)被修剪为 25 个字符。
有没有办法告诉编译器/链接器保留更长的符号?
版本:
- 编译器:gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
<prompt>$ cat test_long_fnames_in_elf.c #include <stdlib.h> #include <stdio.h> #include <stdint.h> void verly_long_function_xjsakdghajkshdlasjkldashjkldhasjklfdsjkhfsdjkhfsdjklhdsjkl_v1(uint32_t val) { int i = 0; for (i = 0 ; i < val; i++) { printf("%d\n", i); } } void verly_long_function_xjsakdghajkshdlasjkldashjkldhasjklfdsjkhfsdjkhfsdjklhdsjkl_v2(uint32_t val) { int i = 0; for (i = 0 ; i < val; i++) { printf("This is i = %d\n", i); } } int main() { verly_long_function_xjsakdghajkshdlasjkldashjkldhasjklfdsjkhfsdjkhfsdjklhdsjkl_v1(5); verly_long_function_xjsakdghajkshdlasjkldashjkldhasjklfdsjkhfsdjkhfsdjklhdsjkl_v2(5); } <prompt>$ gcc test_long_fnames_in_elf.c -g -o test_long_fnames_in_elf.elf <prompt>$ readelf -a te.elf | grep long <prompt>$ readelf -a test_long_fnames_in_elf.elf | grep long 41: 0000000000000000 0 FILE LOCAL DEFAULT ABS test_long_fnames_in_elf.c 52: 000000000040052d 61 FUNC GLOBAL DEFAULT 13 verly_long_function_xjsak <-- Function symbol is trimmed 62: 000000000040056a 61 FUNC GLOBAL DEFAULT 13 verly_long_function_xjsak <-- Function symbol is trimmed <prompt>$
【问题讨论】:
-
调试器显示什么?您是否认为只有 shell 中的输出可以被截断?
-
C 标准已经要求在外部标识符中允许至少 31 个重要的初始字符(内部标识符为 64 个)。如果标识符被编译器和链接器截断,您可能会收到重复标识符的错误。您看到的是调试信息或
readelf工具的限制。请参阅 C 标准的“5.2.4.1 翻译限制” -
如果
readelf有问题[我对此表示怀疑],请尝试objdump。或者,试试nm甚至strings -。或者,只需编写您自己的程序来执行mmap并扫描字符串。您也可以尝试as并创建.o来测试编译器本身的限制(如果有的话)。
标签: c gcc compilation symbols elf