2015-02-04 8 views
0

내가 액세스 할 수있는 코드가 있는데 그 코드는 dlopen("lib.so", RTLD_LOCAL)입니다.응용 프로그램 시작 후 dlopen() 검색 경로에 영향을줍니다. 가능한?

문제는 dlopen()의 검색 경로를 제어해야한다는 것입니다. 이 문제에 대한 해답은 매우 일반적으로 "LD_LIBRARY_PATH 설정"이지만 응용 프로그램 시작 전까지 설정해야 할 실제 경로를 알지 못하기 때문에이를 설정하고 응용 프로그램을 호출하는 래퍼 스크립트를 넣을 수 없습니다.

ld.so 및 dlopen의 설명서에 따르면 LD_LIBRARY_PATH는 응용 프로그램 시작시에만 검사됩니다. 나중에 setenv를 사용하여 응용 프로그램 내에서 변경하면 dlopen()의 조회 목록이 변경되지 않습니다.

dlopen()에 대한 전체 경로 지정은 전략이지만 dlopen 호출에 대한 액세스 권한이 없기 때문에이 옵션도 사용할 수 없습니다.

옵션이 없거나 찾을 수없는 마법 전략이 있습니까?

+0

질문이 명확하지 않습니다. 방금 그 코드를 사용하고 있습니까? 아니면 일부 소스 코드를 변경할 수 있습니까? –

답변

1

나는 그것이 쉽게 가능하지 않다고 믿습니다.

그러나 소스 코드에서 ld.so을 패치 할만큼 미친 사람이라면 뭔가 할 수 있습니다.

아마도 LD_PRELOAD 트릭을 사용할 수 있습니다.

그러나 정확한 파일이 왜 strace(1) 프로그램이 mmap을 -ed되는 파일을 이해하지 않는, dlopen -ed입니다 발견의 문제가있는 경우?

당신은 소스 코드의 일부 라인을 변경 일부 dlsym -ed 기능입니다 알아 dladdr(3)을 고려할 수 있다면 당신은 또한 pmap하거나 cat /proc/$(pidof your-program)/maps

을 사용할 수 있습니다 ... 그리고 당신은 또한 사용할 수 있습니다 dl_iterate_phdr(3)

+0

긴 이야기입니다. 나는 그것을 쉽게 만들려고했지만 진정한 필요성은 libncurses를 파이썬 응용 프로그램에서 libncursesw (넓은 char 지원)로 대체해야하기 때문입니다. _curses 모듈은 libncurses에 바인딩되므로 사용자 액세스 가능 디렉토리에서 libncurses를 libncurses로 복사 한 다음 검색 경로를 무시하고 _curses를 가져 와서 넓은 char 지원으로 curses를 해결합니다. 내 코드를 좀 더 사용자 친화적 인 것으로 만드는 것은 단지 호기심 이었지만 대체 전략을 찾을 수는 있습니다 ... –

+0

질문에 그렇게 했어야합니다. 나는 당신이 파이썬에서 그것을 처리해야한다고 생각합니다. –

+0

파이썬에서는 그것을 처리 할 수 ​​없습니다. _curses.so는 libncurses.so에 링크됩니다. 이것은 시스템 라이브러리이므로, 나는 그것을 만질 수 없다. 내 범위가 잘 정의되어있어 내 질문이 일반적입니다 : 시작 후 dlopen 검색 전략을 재정의하십시오. 문제를 해결하면 문제를 해결할 수 있습니다. –

1

LD_LIBRARY_PATH이 응용 프로그램 루트에 관련된 경우 - $(dirname $0)을 사용하여 자체 경로를 추출하고 올바른 LD_LIBRARY_PATH을 설정하는 래퍼 스크립트를 사용할 수 있습니다.

또 다른 트릭 (그렇게하는 것은 좋지 않습니다)은 실제 lib.so의 프록시가 될 lib.so을 제공하는 것입니다. 라이브러리 초기화 기능을 사용하여 프록시 라이브러리로드에 대한 모든 참조를 초기화 할 수 있습니다. this 질문을 참조하십시오.