Assembly 无法将内容添加到";“执行机构”;带链接器的节
我有一个项目,我正在将一个共享对象加载到Go应用程序中。此共享对象具有静态构造函数。它适用于Ubuntu和Centos,但不适用于Alpine,因为musl libc和Go运行时之间不兼容,所以不会调用静态构造函数。GCC将静态构造函数(如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中函数的这些调用
\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