首页 > 解决方案 > 您是否能够在 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

因此,我想知道构造函数是否可以按优先级顺序运行,即使它们位于不同的模块/库中,而不管它们传递给链接器的顺序如何。

标签: cgcc

解决方案


构造函数的顺序似乎与加载库的顺序有关,而这又似乎取决于创建可执行文件时的链接顺序。如果您切换链接顺序,您应该获得所需的构造函数顺序。

gcc -O0 -Wall -g hw.c -o hw -L. -lhw -lprio

推荐阅读