다른 공유 라이브러리의 기호를 포함하도록 공유 라이브러리(.so)를 어떻게 구축합니까? [폐쇄]

다른 공유 라이브러리의 기호를 포함하도록 공유 라이브러리(.so)를 어떻게 구축합니까? [폐쇄]

내 공유 라이브러리는 libnew.so이미 구축된 타사 공유 라이브러리의 일부 기호를 사용합니다 libold.so. 하지만 libnew.so.아직 연결이 필요해요libold.so또한. 그렇지 않으면 링커가 불평할 것입니다 undefined reference to symbol....

이 명령을 사용하여 실행 파일을 빌드합니다 libnew.so. 어떤 이유로 현재 디렉토리만 허용되며 파일을 다른 곳에 둘 수 없습니다.

그런데 정의되지 않은 nm libnew.so기호가 표시됩니다. 신고하지도 마세요. 빌드에 사용하지 않으면 크기가 변하지 않습니다!libold.soldd libnew.solibold.solibold.solibnew.solibnew.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했지만추천이 파일의 기호는 동적 로더에게 해당 기호를 가져올 위치를 알려줍니다.

일반적으로 누군가가 특정 라이브러리를 억제/숨기려고 할 때 먼저 공유 라이브러리를 만드는 데 사용된 개체 파일을 재조립합니다. 너가능한이 작업은 다음을 통해 수행할 수 있습니다.부분 링크, 그러나 해결책이 보이지 않습니다(공유 라이브러리와 공유 객체는 서로 바꿔서 사용할 수 없기 때문입니다).

추가 자료:

관련 정보