그냥 컨텍스트를 제공하기 위해 여기에 무엇을 달성하려하는지 알려줍니다. .so 파일 자체에 버전 문자열을 포함하기 위해 공유 객체 파일에 const char *를 임베드 할 예정입니다. 데이터 분석을하고 있는데,이 문자열을 통해 데이터를 생성 한 소프트웨어의 버전을 데이터에 알릴 수 있습니다. 이 모든 것이 잘 작동합니다.nm 기호 값의 오프셋?
내가 겪고있는 문제는 .so 라이브러리에서 문자열을 직접 읽으려고 할 때입니다. 나는
nm libSMPselection.so | grep _version_info
를 사용하고
000000000003d968 D __SMPselection_version_info
이 모든 괜찮 예상대로 (위치의 char *이 _SMPselection_version_info이라고합니다) 얻기 위해 노력했다. 그러나 지금은 파일을 열고 0x3d968을 찾고 문자열을 읽을 수있을 것으로 기대했지만, 모두 가비지입니다.
.so 파일을 열고 단순히 문자열의 내용을 검색하면 (어떻게 시작하는지 알 수 있음) 주소 0x2e0b4에서 찾을 수 있습니다. 이 주소에는 0이 종료되고 예상대로 존재합니다. (지금이 방법을 사용하고 있습니다.)
저는 컴퓨터 과학가 아닙니다. 누군가 nm에 표시된 기호 값이 올바르지 않거나 기호의 주소가 아닌 경우 기호 값은 무엇이 다른지 설명하십시오.
리눅스에
이것은 좋은 생각입니다. 나는 지금 그것을 시도하고있다. 단 하나의 문제가 있습니다 : 테스트하고있는 라이브러리는 다른 라이브러리에 대해 다소 긴 의존 관계를 가지고 있습니다. 내가 dlopen으로로드하려고하면 Symbol-not-found 오류가 발생합니다. 물론 관심이있는 버전 문자열은 종속성이 없습니다. dl이 의존성을 무시하도록하려면 어떻게해야합니까? – Simon
나는 체크했다. 두 개의 유스 케이스 중 하나 인 모든 종속성을로드 한 경우이 방법이 유용합니다. 아이디어를 가져 주셔서 감사합니다. – Simon