Assembly 无法将内容添加到";“执行机构”;带链接器的节

Assembly 无法将内容添加到";“执行机构”;带链接器的节,assembly,linker,alpine,gnu-assembler,static-constructor,Assembly,Linker,Alpine,Gnu Assembler,Static Constructor,我有一个项目,我正在将一个共享对象加载到Go应用程序中。此共享对象具有静态构造函数。它适用于Ubuntu和Centos,但不适用于Alpine,因为musl libc和Go运行时之间不兼容,所以不会调用静态构造函数。GCC将静态构造函数(如\uuuu attribute\uuu((构造函数)))放入.init\u数组中,该数组由glibc中的加载程序调用,而不是由musl libc调用,musl libc将其留给C启动代码。在Go的情况下,运行时不实现对.init\u array中函数的这些调用

我有一个项目,我正在将一个共享对象加载到Go应用程序中。此共享对象具有静态构造函数。它适用于Ubuntu和Centos,但不适用于Alpine,因为musl libc和Go运行时之间不兼容,所以不会调用静态构造函数。GCC将静态构造函数(如
\uuuu attribute\uuu((构造函数))
)放入
.init\u数组中,该数组由glibc中的加载程序调用,而不是由musl libc调用,musl libc将其留给C启动代码。在Go的情况下,运行时不实现对
.init\u array
中函数的这些调用

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

我试图将我的构造函数(C或ASM)添加到
.ctors
部分,但在链接我的共享对象之后,链接器(ld)似乎将它们移动到
.init\u array

下面是我的示例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
我运行compile并链接它,但是
.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
部分添加函数?

我认为最好的方法是使用--disable initfini array配置gcc我认为最好的方法是使用--disable initfini array配置gcc