2012-04-23 3 views
1

실행 가능한 elf 파일을 동적으로 링크 할 때 libc.so.6 공유 라이브러리가 필요합니다. 실행 가능한 elf 파일을 정적으로 링크 할 때 libc.so.6 공유 라이브러리가 필요하지 않습니다 (놀랄 일도 아닙니다).링커는 정적으로 링크 된 파일에 libc.so.6을 포함합니까?

즉, 실행 파일을 --static로 어셈블하는 것은 링커에 libc.so.6을 포함합니까? 그렇지 않은 경우 - 링커에는 어떤 파일이 있습니까? 어디에서 검색 할 수 있습니까? 필자가 아는 한, 링커는 정적으로 어셈블 된 파일에 정적 라이브러리를 포함합니다.

답변

2

정적으로 링크하면 링커는 정적 라이브러리 (.a)의 필요한 모든 개체 (.o) 파일을 연결합니다. 예를 들어, 다음 명령은 libc6 내 라이브러리에 포함 된 오브젝트 파일이 나열되어

ar t /usr/lib/libc.a 

(물론 libc.a에 대한 정확한 경로는 시스템에 따라 다르다)을

그래서 귀하의 질문에 답변 아니요, 전체 libc6 라이브러리를 링크하지 않지만 필요한 객체 파일 만 연결합니다. 또한 libc.so.6은 동적 연결에만 사용되므로 아무 것도하지 않습니다. 라이브러리의 정적 버전 인 libc.a에서 작동합니다.

@janneb 주석에 따르면 링크 할 최소 단위는 "섹션"이므로 전체 개체 파일을 연결할 필요가 없습니다.

+1

IIUC, 섹션은 오브젝트 파일이 아니라 링크 할 수있는 최소 단위입니다. 예 : GNU ld의 --gc-sections 플래그, gcc의 -funcions-sections 및 -fdata-sections 옵션. – janneb

+0

그리고 최근의 GCC 컴파일러는 LTO (link time optimization) 기능을 가지고 있습니다 ... –

+0

답장을 보내 주셔서 감사합니다. libc.a는 어디에 저장됩니까? "찾기"의 도움으로도 찾을 수 없습니다. –

1

링커는 ld 명령입니다. 이 명령을 사용하면 요청한대로 작동합니다. GNU ld은 받아 들일 수 있습니다. scripts

그러나 대부분의 사람들은 gcc 명령을 사용하고 있습니다. 이것은 Gnu Compiler Collection 제품군의 컴파일러입니다. 실제로 gcc 명령은 cc1 (적절한 C 컴파일러), as, ldcollect2 (초기화 등을 다루는 링커를 호출 함)을 실행하는 드라이버 프로그램입니다.

정확한 명령 []이 실행 중인지 이해하려면 -v 프로그램 플래그를 전달하십시오.

-staticgcc으로 전달하면 아마도 예 : /usr/lib/x86_64-linux-gnu/libc.a 또는 GNU Libc 라이브러리의 다른 정적 양식.

+0

답장을 보내 주셔서 감사합니다. libc.a를 찾을 수 없습니다. 그 이유는 무엇입니까? –

+0

알아 내기 위해'gcc -v -static -O helloworld.c -o helloworld' 명령을 실행하려고 시도 했습니까? 'libc.a '의 정확한 위치는 시스템 (즉, 배포판)에 따라 다릅니다. –

+0

예, 작동하지 않습니다. –

관련 문제