c - 您是否能够在 C 中跨模块设置构造函数优先级?
问题描述
您是否能够在 C 中跨模块设置构造函数优先级?
例如,假设我有以下三个文件:
(1) 硬件:
#include <stdio.h>
int main(void)
{
fprintf(stdout, "main\n");
}
(2) libhw.c
#include <stdio.h>
__attribute__((constructor(104)))
void my_constructor4(void)
{
fprintf(stdout, "my_constructor4\n");
}
(3) libprio.c
#include <stdio.h>
__attribute__((constructor(101)))
void my_constructor1(void)
{
fprintf(stdout, "my_constructor1\n");
}
__attribute__((constructor(102)))
void my_constructor2(void)
{
fprintf(stdout, "my_constructor2\n");
}
__attribute__((constructor(103)))
void my_constructor3(void)
{
fprintf(stdout, "my_constructor3\n");
}
然后我编译:
gcc -O0 -Wall -g -shared -fPIC libhw.c -o libhw.so
gcc -O0 -Wall -g -shared -fPIC libprio.c -o libprio.so
gcc -O0 -Wall -g hw.c -o hw -L. -lprio -lhw
如果我运行LD_LIBRARY_PATH=. ./hw
输出是:
my_constructor4
my_constructor1
my_constructor2
my_constructor3
main
我想看到以下输出:
my_constructor1
my_constructor2
my_constructor3
my_constructor4
main
因此,我想知道构造函数是否可以按优先级顺序运行,即使它们位于不同的模块/库中,而不管它们传递给链接器的顺序如何。
解决方案
构造函数的顺序似乎与加载库的顺序有关,而这又似乎取决于创建可执行文件时的链接顺序。如果您切换链接顺序,您应该获得所需的构造函数顺序。
gcc -O0 -Wall -g hw.c -o hw -L. -lhw -lprio
推荐阅读
- reactjs - 如何在 Jest 中测试嵌套组件
- jquery - 没有 dataType 和 contentType 的 Jquery AJAX POST
- json - 用户从桌面应用程序登录到网站最佳实践 (.NET)
- sql - 在oracle中不为空时选择父级的父级
- html - 表格单元格增加宽度,尽管盒子大小:border-box
- python - xpath loop pages with beautifulsoup
- gnu-screen - 你如何从你的screenrc设置复制模式?
- python - 如何在 Django 的 base.html 中插入多个块?
- npm - “npm audit fix”到底是做什么的?
- django - Save a list of strings in django sql-lite database from view