2010-04-28 3 views
6

버전 차이로 인해 대상 시스템을 사용하는 대신 내 프로그램과 함께 공유 라이브러리를 제공하려고합니다.다른 libc 파일에 연결하는 방법은 무엇입니까?

ldd 내 프로그램이 이러한 공유 libs와 사용 말한다 :

linux-gate.so.1 => (0xf7ef0000)**(made by kernel)** 
libc.so.6 => /lib32/libc.so.6 (0xf7d88000)**(libc-2.7.so)** 
/lib/ld-linux.so.2 (0xf7ef1000)**(ld-2.7.so)** 

가 나는 성공적으로 컴파일하여 ld-xxx.so 연결 한 :

gcc -std=c99 -D_POSIX_C_SOURCE=200112L -O2 -m32 -s -Wl,-dynamic-linker,ld-2.7.so myprogram.c 

하지만 성공적인 링크 libc-xxx.so에 관리하지 않았습니다. 어떻게해야합니까?

+1

입니다. 이런 식으로 아무도 우연히 libc 버전을 잃어 버릴 것이고 만약 그들이 당신의 프로그램을 제거한다면 당신의 libc는 오래 가지 않을 것입니다. – nategoose

+0

같지만 정적으로 다음과 같습니다. http://stackoverflow.com/questions/10763394/how-to-build-a-c-program-using-a-custom-version-of-glibc –

답변

7

나는 그것을 수행하는 방법을 발견 : 제공된 라이브러리의 위치

RPATH를 지정합니다. 이 폴더에는 libc.so.6, libdl.so.2, libgcc_s.so.1 등이 포함되어야합니다. strace를 사용하여 바이너리 파일이 사용하는 라이브러리를 확인하십시오.

ld.so는 하나의 실행 파일이있는 경우이 프로그램을 연결하는 정적으로 고려할 수 있습니다 제공된 링커

gcc -Xlinker -rpath=/default/path/to/libraries -Xlinker -I/default/path/to/libraries/ld.so program.c

6

-nodefaultlibs 또는 -nostdlib을 gcc에 전달하면 기본 라이브러리가 ld에 인수로 전달되지 않습니다. 그러면 링크하려는 libc를 명시 적으로 지정할 수 있습니다. 두 옵션에 대한 자세한 내용과주의 사항은 gcc(1) 매뉴얼 페이지를 참조하십시오.

+2

이 게시물은 잘못되었습니다. 이 두 플래그를 전달할 필요는 없습니다. –

관련 문제