为什么不__attribute __((构造函数))的静态库的工作?(Why doesn't

2019-06-27 03:49发布

在下面的例子中,程序应打印“富称为”:

// foo.c
#include <stdio.h>

__attribute__((constructor)) void foo()
{
    printf("foo called\n");
}

// main.c
int main()
{
    return 0;
}

如果程序被编译这样的,它的工作原理:

gcc -o test main.c foo.c

但是,如果文件foo.c被编译成静态库,程序打印什么。

gcc -c main.c
gcc -c foo.c
as rcs foo.a foo.o
gcc -o test foo.a main.o

为什么会出现这种情况?

Answer 1:

链接器不包括在最终方案中foo.a的代码,因为没有在main.o中引用它。 如果main.c被重写如下,该方案将工作:

//main.c

void foo();

int main()
{
    void (*f)() = foo;
    return 0;
}

此外,与静态库编译时的参数的顺序与gcc(或连接件)是显著:库必须来引用它的对象后。

gcc -o test main.o foo.a


Answer 2:

正如有人说,从档案未引用的符号不会使它的输出二进制文件,因为链接默认情况下丢弃它们。

与静态库链接时覆盖此行为, --whole-archive / --no-whole-archive可用于连接选项,如下所示:

gcc -c main.c
gcc -c foo.c
ar rcs foo.a foo.o
gcc -o test -Wl,--whole-archive foo.a -Wl,--no-whole-archive main.o

这可能会导致臃肿的二进制文件,因为所有的符号foo.a将被连接到输出包括在内,但有时这是有道理的。



文章来源: Why doesn't __attribute__((constructor)) work in a static library?