2017-02-17 15 views
0

내가 아래에 오류가 표시 nm의 사용하여 볼 수 있습니다 :이 기능 'GetList이'실행 파일에 링크 된 정적 라이브러리 liblist.a에 정의되어프로그램을로드 할 때 심볼 검색 오류가 발생합니다. 기호는 정적 라이브러리에 정의되어 있으며 프로그램 실행시

/usr/bin/getinfo: symbol lookup error: /usr/pkl/libinfo.so: undefined symbol: GetList 

/usr/bin/getinfo 그리고 gcc로 컴파일됩니다. 나는 실행 가능한 getinfo가 'nm'명령어를 실행할 때 정의 된 심볼을 가지고 있음을 볼 수있다. 여기에 나노 명령 출력입니다 :

[email protected] $ nm /usr/bin/getinfo | grep GetList 
080a3d89 T GetList 

나는 또한 readelf 명령을 사용하여 확인하고 여기에 출력의 : 공유 라이브러리 libinfo.so

[email protected] $ readelf -a /usr/bin/getinfo | grep GetList 
1080: 080a3d89 1777 FUNC GLOBAL DEFAULT 15 GetList 

liblist.a 정적 라이브러리에 정의 된 함수 GetList를 호출 . libinfo.soliblist.a은 모두 실행 파일 /usr/bin/getinfo에 종속되어 있습니다. liblist.a이 아니며은 (는) libinfo.so에 추가되었습니다. 도 작성했으며 objdump -S /usr/bin/getinfo | grep GetList도이 함수의 어셈블리 코드를 확인할 수 있습니다. 그러나 프로그램을 실행할 때 기호 조회 오류로 인해 충돌합니다. 이것은 공유 라이브러리 문제가 아니며 해결할 수 없습니다. 도와주세요.

답변

0

글쎄, 아마도 dlopen(3) 또는 유사한 기능을 사용하여 공유 객체 /usr/pkl/libinfo.so을 동적으로로드하고 있습니다. getinfo (정확히 연결 명령)을 어떻게 컴파일했는지, 그리고 dlopen(3)을 호출하거나 프로그램을 시작할 때 자동으로 공유 라이브러리를로드하는 방법에 대해 흥미로울 것입니다. 링크 과정 후에 정적 라이브러리 정보를 사용할 수 없습니다 (정적 라이브러리의 링크는 .o 파일을 압축 해제하고 실행 파일에 정상적으로 연결하는 것으로 구성되어 있으므로 GetList은 정적 라이브러리 또는 *.o 개체에서 가져옵니다. 여기서는 아무런 관심이 없습니다.

getinfo 실행 파일을 연결하는 정확한 명령 시퀀스를 표시하고 dlopen(3)에 대한 호출을 통해 libinfo.so을로드하면 해당 호출과 관련된 일부 컨텍스트도 중요합니다. 또한 GetList이 C 또는 C++ 함수인지 여부는 알고 있어야합니다. C++ 기호는 매개 변수 목록 유형 일치를 처리하기 위해 컴파일러에서 변경된 이름이므로 알 수 있습니다. 아마도 출력에서 ​​C 스타일 함수가 nm으로 표시되지만 C++ GetList 함수를 호출하려고합니다.

그런데 링크가 완료된 후에 일부 정적 라이브러리에 대한 종속성 정보가 무엇을 의미합니까? nm(1) 출력에 표시하면 GetList 함수가 실행 파일에 포함되어 있다고 가정합니다. 따라서 동적 연결 인 경우 libinfo.so 공유 객체에 사용할 수 있어야합니다 (연결 프로세스에서 링커에 대한 몇 가지 옵션에 따라 달라집니다 - 이것이 사용하는 정확한 연결 명령을 요구하는 이유입니다). 가능한 경우 libinfo.so 모듈의 정확한 연결 명령.

질문을 편집하고 누락 된 정보를 추가하면 도움이 될 것입니다.