【问题标题】:symbol names are trimmed in elf file to 25 characters符号名称在 elf 文件中被修剪为 25 个字符
【发布时间】:2022-11-03 18:45:48
【问题描述】:

我正在 Linux 上用 gcc 编译一个简单的 c 文件,并使用 readelf 来查找符号信息。 函数名称(可能还有其他符号 - 我没有检查)被修剪为 25 个字符。

有没有办法告诉编译器/链接器保留更长的符号?

版本:

  1. 编译器: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


【解决方案1】:

与 objdump 一起使用。谢谢Craig Estey

    <prompt>$ objdump -t test_long_fnames_in_elf.elf | grep long
    test_long_fnames_in_elf.elf:     file format elf64-x86-64
    0000000000000000 l    df *ABS*  0000000000000000              test_long_fnames_in_elf.c
    000000000040052d g     F .text  000000000000003d              verly_long_function_xjsakdghajkshdlasjkldashjkldhasjklfdsjkhfsdjkhfsdjklhdsjkl_v1
    000000000040056a g     F .text  000000000000003d              verly_long_function_xjsakdghajkshdlasjkldashjkldhasjklfdsjkhfsdjkhfsdjklhdsjkl_v2
    <prompt>$ 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-07
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多