首页 > 解决方案 > 无法使用链接器将内容添加到“ctors”部分

问题描述

我有一个项目,我将共享对象加载到 Go 应用程序中。此共享对象具有静态构造函数。它适用于 Ubuntu 和 Centos,但不适用于 Alpine,由于 musl-libc 和 Go 运行时不兼容,因此不会调用静态构造函数。GCC 将静态构造函数(如__attribute__((constructor)))放入.init_array其中,由 glibc 中的加载程序调用,但不是由 musl-libc 将其留给 C 启动代码。如果 Go 运行时没有实现这些对.init_array.

另一方面,在这两种情况下,加载程序都会调用.ctorssection 中的函数。它看起来是这个项目的理想解决方案。

我正在尝试将我的构造函数(C 或 ASM)添加到该.ctors部分,但在链接我的共享对象之后,它们似乎被.init_array链接器(ld)移动到。

这是我的示例 ASM 代码:

       .intel_syntax noprefix
       .text

       .section      .rodata
.Message:
       .string "Constructor called!"

       .text
Constructor:
       lea    rdi, .Message[rip]
       jmp    puts@PLT

       .section      .ctors,"a"
__CTOR_LIST__:
       .quad  Constructor

我运行编译并链接它,但.ctors逻辑上是空的!

$ gcc ctors.s -c -o ctors.o
$ ld -shared ctors.o -o ctors.so
$ readelf -x 14 /libctors.so 
Hex dump of section '.ctors':
  0x00003df8 ffffffff ffffffff 00000000 00000000 ................

为什么会这样?可以让我的阵列留在.ctors部分吗?如何向.ctors部分添加功能?

标签: assemblylinkeralpinegnu-assemblerstatic-constructor

解决方案


推荐阅读