代码之家  ›  专栏  ›  技术社区  ›  Matthew Iselin

独立臂C++代码-空

  •  1
  • Matthew Iselin  · 技术社区  · 14 年前

    我编写C++代码运行在一个独立的环境(基本上是一个ARM板)。除了遇到一个绊脚石-全局静态构造函数外,一切都进展顺利。

    据我所知,.ctors部分包含每个静态构造函数的地址列表,我的代码只需要迭代该列表并在执行过程中调用每个函数。但是,我发现二进制文件中的这个部分实际上是完全空的!谷歌指向使用“.init_array”而不是“.ctors”(EABI的东西),但这并没有改变任何东西。

    关于为什么我的静态构造函数不存在有什么想法吗?相关链接器脚本和objdump输出如下:

    .ctors :
    {
        . = ALIGN(4096);
        start_ctors = .;
        *(.init_array);
        *(.ctors);
        end_ctors = .;
    }
    
    .dtors :
    {
        . = ALIGN(4096);
        start_dtors = .;
        *(.fini_array);
        *(.dtors);
        end_dtors = .;
    }
    

    ——

    2 .ctors        00001000  8014c000  8014c000  00054000  2**2
                    CONTENTS, ALLOC, LOAD, DATA
    <snip>
    8014d000 g     O .ctors 00000004 start_ctors
    <snip>
    8014d000 g     O .ctors 00000004 end_ctors
    

    我使用的是ARMELF目标GCC编译器(4.4.1)。

    更新:输出二进制文件也充满了 __static_initialization_and_destruction_0 符号,我以前从未见过。

    更新2:这是从编译对象文件(链接到主二进制文件)的objdump中摘录的.ctors节保持不变:

    21 .ctors        00000004  00000000  00000000  00000864  2**2
                     CONTENTS, ALLOC, LOAD, RELOC, DATA
    
    RELOCATION RECORDS FOR [.ctors]:
    OFFSET   TYPE              VALUE 
    00000000 R_ARM_ABS32       _GLOBAL__I__ZN9SomeStaticClass10m_InstanceE
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   Matthew Iselin    14 年前

    这最终导致了一个构建系统问题——在链接器命令行上多次指定了链接器脚本,这在某种程度上导致了g++阻塞。