2017-11-10 22 views
0

바이너리 형태로만 배포되는 공유 라이브러리 집합 (Intel MKL)이 있습니다. 최상위 "런타임"도서관, libmkl_rt.so 내 실행 파일에 대한 링크와는 ldd로 볼 수 있습니다 : 그러나dlopen()에서 사용하지 않은 기호를 무시합니다. .so

... 
libmkl_rt.so => /var/task/lib/libmkl_rt.so (0x00007f8049a1f000) 
... 

, 다른 사람과 같은 libmkl_avx.so, 실행 던졌습니다 내가 dlopen() 동적으로로드되는 가정 라이브러리가 없으면 찾을 수 없지만 ldd으로 표시되지 않는다는 오류가 표시됩니다.

이 라이브러리는 크기가 크고 (> 100MB) 내 컨테이너에서이 라이브러리 만 사용 가능합니다. 실행 파일은이 라이브러리의 각 함수를 호출하지 않는다고 가정하므로 함수를 호출하지 않는지 먼저 결정한 다음 해당 함수 만 유지하면서 슬림화하고 싶습니다.

내가 어떻게 할 수 동적으로 공유로드 된 라이브러리에있는 기호는 실제로

  1. 을 사용하는 결정하십시오?
  2. 해당 기호 만 라이브러리의 "슬림"복사본으로 추출합니까?

어떤 도구가 있습니까?

답변

2

동적으로로드되는 공유 라이브러리에서 실제로 사용되는 기호를 결정합니까?

LD_DEBUG=bindings LD_BIND_NOW=1에서 프로그램을 실행하고 libmkl_avx.so의 기호를 확인할 수 있습니다.

해당 기호 만 라이브러리의 "슬림"사본으로 추출합니까?

불행하게도 실행 파일에서 기능을 재 배열 할 수없는 이유는 동일하지 않습니다. 일단 코드가 링크되면 내부의 모든 내부 변수와 전역 변수 위치가 고정되어 변경할 수 없습니다. (함수 경계와 콜 그래프를 결정하기 위해) 링크 된 코드를 올바르게 분해하는 것조차도 해결할 수없는 문제입니다 (IDA와 같은 도구는이를 해결하기 위해 휴리스틱을 사용하지만 문제는 남아 있습니다).

OS는 응용 프로그램에서 실제로 사용하는 코드 페이지 만로드하기 때문에 큰 문제는 아닙니다.