__attribute __ ((생성자))가 정적 라이브러리에서 작동하지 않는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1202494

문제

다음 예에서는 프로그램이 "foo work"를 인쇄해야합니다.

// 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

왜 이런 일이 발생합니까?

도움이 되었습니까?

해결책

링커는 Main.O의 아무것도 참조하지 않기 때문에 최종 프로그램에 FOO.A에 코드를 포함하지 않습니다. 만약에 main.c 다음과 같이 다시 작성하면 프로그램이 작동합니다.

//main.c

void foo();

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

또한 정적 라이브러리로 컴파일 할 때 GCC (또는 링커)에 대한 인수 순서가 중요합니다. 라이브러리는이를 참조하는 객체 뒤에 있어야합니다.

gcc -o test main.o foo.a

다른 팁

언급 한 바와 같이, 아카이브에서 참조되지 않은 기호는 링커가 기본적으로 폐기하기 때문에 출력 바이너리로 만들지 않습니다.

정적 라이브러리와 연결할 때이 동작을 무시하려면 --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 링커에 출력에 포함되지만 때로는 정당화됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top