0

我注意到链接到我的应用程序的共享对象的构造函数将始终在我的应用程序构造函数之前运行,即使我的应用程序具有较低的优先级(即:较高的优先级);例如,假设这个程序:

#include <stdio.h>

static void __attribute__ ((constructor (101))) test() {
    printf("test\n");
}

int main(int argc, char *argv[]) {
    return 0;
}

正在链接以下共享对象:

#include <stdio.h>

static void __attribute__ ((constructor (102))) test_so() {
    printf("test so\n");
}

我预计输出是:

测试
测试所以

相反,输出是相反的。
有什么理由吗?我找不到任何文件。

4

1 回答 1

2

有什么理由吗?

事实:

  • __attribute__((__constructor__))基本上将指向函数的指针添加到某个 ELF 部分
  • 每个 ELF 文件都有一个单独的 DT_INIT 或 DT_INIT_ARRAY 部分。
  • 每个 ELF 文件都按顺序加载,依赖项在可执行之前加载。
  • 因此共享库构造函数将在可执行之前运行。
  • 的排序__attribute__((__constructor__(this_number)))仅限于一个 ELF 文件,因为编译器可以在那里重新排序。

找不到任何文档。

它记录在https://refspecs.linuxfoundation.org/elf/elf.pdf中:

初始化和终止函数

在动态链接器建立进程映像并执行重定位之后,每个共享对象都有机会执行一些初始化代码。所有共享对象初始化都发生在可执行文件获得控制权之前。

于 2021-12-01T22:49:44.300 回答