assembly - 无法使用链接器将内容添加到“ctors”部分
问题描述
我有一个项目,我将共享对象加载到 Go 应用程序中。此共享对象具有静态构造函数。它适用于 Ubuntu 和 Centos,但不适用于 Alpine,由于 musl-libc 和 Go 运行时不兼容,因此不会调用静态构造函数。GCC 将静态构造函数(如__attribute__((constructor))
)放入.init_array
其中,由 glibc 中的加载程序调用,但不是由 musl-libc 将其留给 C 启动代码。如果 Go 运行时没有实现这些对.init_array
.
另一方面,在这两种情况下,加载程序都会调用.ctors
section 中的函数。它看起来是这个项目的理想解决方案。
我正在尝试将我的构造函数(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
部分添加功能?
解决方案
推荐阅读
- c++ - 如何使用 cl.exe 编译 Google 测试代码
- android - 移动食品计划 Android 应用程序(使用 Kotlin)
- node.js - Node.js:附加到可读流同时通过管道传输到可写流?
- python - 有人可以解释为什么我收到错误:“IndentationError: unindent does not match any external indentation level”吗?
- java - 有没有办法在应用程序进入后台时检索图像并在不丢失之前选择的图像的情况下将其带回来
- typescript - NestJS - 避免返回用户密码
- laravel - 通过 API 进行 Laravel Echo 身份验证
- go - golang 回声控制器模型
- c - C函数调用错误显示函数使用txt文件
- python - PyQt4.QtCore 运行时错误:如何降级 sip/API?