소스 코드를 다운로드하고 컴파일한 프로그램을 실행하려고 합니다. 프로그램을 실행하려고 하면 다음과 같은 메시지가 계속 나타납니다.
unable to load undefined symbol _z15InvalidateImageSs
이 오류가 발생하는 이유를 확인하려고 합니다. 프로그램은 실제로 다른 프로그램에 의해 로드된 라이브러리입니다. 내 프로그램은 .so 파일로 컴파일됩니다.
난 달린다:
$ nm myprog.so > nm.txt
기호가 파일에 나타나지만 연관된 주소가 없습니다.
- 다음을 사용하여 소스 트리에서 기호를 검색합니다.
$ find . -type f | xargs fgrep -I '_zinvalidateimagess' | grep -v 'Binary
결과가 없습니다. 2. 모든 표준 로드 라이브러리에서 이 기호를 검색했습니다.
$ scanelf -l -s _zInvalidateImageSs | grep -I '_zinvalidateImageSs'
이번에도 결과가 없습니다.
그래서 내 질문은: 기호가 소스 트리의 어느 곳에서도 참조되지 않는 경우 .so 파일에 문제가 있는 이유는 무엇입니까? 이 기호가 어디서 왔는지 어떻게 알 수 있나요?
답변1
이 라이브러리의 소스는 다음과 같습니다.발표하다하나의 상징이 아닌정의그, 이런 일을 해서
extern InvalidateImage(const char *);
그럼 그걸 사용해
const char *foo = InvalidateImage(bar);
라이브러리이기 때문에 해당 기호를 사용하는 프로그램을 실행하지 않으면 이를 알 수 없습니다. 갈 곳바라보다기호는 라이브러리 소스를 다운로드한 위치입니다. 라이브러리 개발자가 관련 소스를 직접 제공했거나 소스를 어디서 얻었는지에 대한 단서를 제공했을 수 있습니다.
그만한 가치가 있기 때문에 스크립트(exports
그리고externs
) 내가 관리하는 프로그램에 기호가 누락되었는지 확인합니다.
추가 자료: