Linux에서 어떤 라이브러리가 컴파일되었는지 확인

Linux에서 어떤 라이브러리가 컴파일되었는지 확인

gccGnu/Linux를 실행하는 임베디드 arm으로 C 파일을 컴파일하고 싶습니다 .

어떤 함수/헤더 파일을 정적으로 컴파일해야 하는지, 어떤 함수/헤더 파일을 동적으로 컴파일해야 하는지 어떻게 알 수 있나요? (모든 헤더 파일을 정적으로 컴파일하고 싶지 않습니다)

사용할 수 있는 명령이 있나요?

예를 들어 , stdio.h를 사용하기 위해 포함시켰는데 printf, 정적으로 컴파일해야 하는지 알 수 있는 방법이 있나요?

답변1

대상 시스템에서 사용할 수 있는 동적 라이브러리와 그렇지 않은 동적 라이브러리를 알아야 합니다.

예를 들어 내 시스템에서는 stdio.h이 라이브러리가 패키지의 포함 파일 중 하나 libc6-dev(Debian 패키지 명명 규칙)이고 해당 동적 라이브러리 libc.so.6는 입니다 libc-2.24.so. 이는 거의 모든 프로그램의 기본 빌딩 블록이므로 ARM용입니다. system 즉, 이 라이브러리(또는 그와 동등한 것 중 일부)를 동적 라이브러리로 사용하지 않는 것은 매우 드문 일입니다. 일반적으로 사용되고 상당히 크기 때문에 동적 라이브러리로 사용하는 것이 완벽합니다.

(또한 GNU C 라이브러리 자체는 구성 가능한 이름 확인 기능과 같은 작업을 위해 동적 연결을 사용합니다. /etc/nsswitch.conf이는 C 라이브러리에 libnss_*.so런타임에 로드할 라이브러리를 알려주므로 GNU C 라이브러리를 프로그램에 완전히 정적으로 연결하는 것은 매우 까다로울 수 있습니다.)

특정 라이브러리에 대한 특정 파일이 임베디드 ARM 시스템에 설치되어 있지 않은데 lib*.so프로그램에서 해당 라이브러리를 계속 사용하려면 라이브러리를 정적으로 링크해야 합니다. 크로스 컴파일의 경우 이 작업을 수행하려면 해당하는 항목이 있어야 합니다.ARM 버전lib*.a도서관의 파일프로그램을 크로스 컴파일하는 시스템에서.

라이브러리의 헤더 파일( *.h)은 라이브러리가 컴파일될 수 있는 모든 아키텍처에서 동일할 가능성이 높지만 *.so*.a파일은 그렇지 않습니다. *.so*.a파일 모두 실행 가능한 코드를 포함하고 있기 때문에 각 프로세서 아키텍처에 따라 다릅니다. 따라서 x86_64 시스템에서 ARM용으로 크로스 컴파일하는 경우 사용 가능한 특정 라이브러리 파일의 x86_64 버전에서는 정적으로 컴파일된 라이브러리를 사용하여 ARM 프로그램을 크로스 컴파일하는 것을 허용하지 않습니다. 해당 라이브러리에는 ARM이 lib*.a필요합니다 .lib*.a

관련 정보