내 공유 라이브러리는 libnew.so
이미 구축된 타사 공유 라이브러리의 일부 기호를 사용합니다 libold.so
. 하지만 libnew.so
.아직 연결이 필요해요libold.so
또한. 그렇지 않으면 링커가 불평할 것입니다 undefined reference to symbol...
.
이 명령을 사용하여 실행 파일을 빌드합니다 libnew.so
. 어떤 이유로 현재 디렉토리만 허용되며 파일을 다른 곳에 둘 수 없습니다.
그런데 정의되지 않은 nm libnew.so
기호가 표시됩니다. 신고하지도 마세요. 빌드에 사용하지 않으면 크기가 변하지 않습니다!libold.so
ldd libnew.so
libold.so
libold.so
libnew.so
libnew.so
libnew.so의 경우:
gcc -Wall -fPIC -c libnew.c
gcc -shared -Wl,-soname,libnew.so.1 -o libnew.so.1.0 *.o -L. -lold
ln -sf libnew.so.1.0 libnew.so.1
ln -sf libnew.so.1.0 libnew.so
실행 파일의 경우:
#this does not work and needs -lold as well.
gcc -Wall main.c -L. -lnew -o prog
빠진 것이 있나요? 감사해요!
답변1
누락된 것은 링커 명령입니다.
gcc -shared -Wl,-soname,libnew.so.1 -o libnew.so.1.0 *.o -L. -lold
확실히복사에서 이의를 제기 libold.so
했지만추천이 파일의 기호는 동적 로더에게 해당 기호를 가져올 위치를 알려줍니다.
일반적으로 누군가가 특정 라이브러리를 억제/숨기려고 할 때 먼저 공유 라이브러리를 만드는 데 사용된 개체 파일을 재조립합니다. 너가능한이 작업은 다음을 통해 수행할 수 있습니다.부분 링크, 그러나 해결책이 보이지 않습니다(공유 라이브러리와 공유 객체는 서로 바꿔서 사용할 수 없기 때문입니다).
추가 자료:
- 여러 .so 공유 라이브러리 병합(이것은 작동하지 않을 것이라고 말하십시오…)
- GNU 링커에서 부분 링크란 무엇입니까?
ld
- GNU 링커