2010-02-01 2 views
3

리눅스 : 거기에 컴파일 된 공유 라이브러리를 편집 할 수있는 방법이 있습니까?solaris elfedit : 리눅스와 비슷한 것이 있습니까? (공유 라이브러리 편집기)?

특별히 컴파일 된 이진 공유 라이브러리에 DT_SYMBOLIC flag을 추가하는 방법을 찾고 있습니까?

우리의 응용 프로그램이

  • 우리 자신의 라이브러리 (정적 libXXX.a)
  • 일부 제 3 자 libs가 구성되어

    (진 :이을 요구하고 여기 왜

    입니다 - 만 공유 도서관 libYYY.so)

지금까지 애플리케이션으로 모든 것이 잘되었습니다.

이제 우리는 static * libXXX.a 라이브러리를 공유 라이브러리 버전 (libXXX.so)으로 대체했습니다.

모든 것이 잘 컴파일되고 링크됩니다.

하지만 지금은 응용 프로그램을 실행하면 예상되는 많은 처리가 시작됩니다. 그런 다음 반쯤 어딘가에 충돌합니다. gdb 백 트레이스는 일부 타사 공유 라이브러리에서 충돌이 발생했음을 보여줍니다.

저는 SOF를 검색하여 흥미로운 기사 here을 발견했습니다. 나는 정말 나는 그것이 해볼만 한 가치는있을 것 같아요 도움이 될 것을 의심하지만

내가 말하는거다 끝은

... add the DT_SYMBOLIC flag to the dynamic section ... 

입니다.

이미 컴파일/링크 된 공유 라이브러리에 DT_SYMBOLIC flag을 어떻게 추가 할 수 있습니까?

환경 : debian lenny 64bit 및 g ++ v4.2.4 및 binutils v20.

편집 : solaris에는 elfedit이라는 프로그램이 있습니다. 리눅스와 비슷한 것이 있습니까?

답변

2

한편 도구 elfsh을 발견했습니다. ELF 객체, 바이너리 및 공유 라이브러리를 검사하고 편집하기위한 대화 형 쉘입니다.

은 프로젝트 페이지 여기를 참조하십시오 http://www.eresi-project.org

는 불행하게도 매우 안정 될 것 같지 않습니다. elfsh 그 자체 내에 많은 충돌이 발생했습니다.

+1

'elfsh'에 대한 * 설명서가 있습니까? 그것은 완전히 문서화되지 않은 점을 제외하고는 위대한 도구처럼 보입니다. –

0

깃발이라면 힘든 방법은 16 진수 편집기로 엘프 헤더를 조정하는 것입니다.

제 3 자 lib가 충돌하는 경우 개인적으로 다른 끝을 보게됩니다. 공유로 이동하기 때문에 라이브러리 로딩 순서가 변경되었습니다.

LDD

수출 LD_DEBUG = libs와

여기에 당신의 친구입니다.

dlopen() 런타임 로더가 타사 라이브러리를로드 한 후 공유 라이브러리를 사용하는 것으로 충분할 수 있습니다.

+0

라이브러리로드 순서와 관련하여 조언 해 주셔서 감사합니다. 그러나 나는 당신이 언급 한 '고통스러운 접근법'을 사용해야 만한다는 두려움을 가지고 있습니다. 엘프 헤더를 편집하는 방법에 대한 도움은 매우 감사하겠습니다! –

+0

다시 말하지만,이 방법을 권장 할 수는 없지만 다음과 같이해야합니다. 1. ELF 사양 을 읽습니다. 2. -Bsymbolic과 함께 최소한의 라이브러리를 빌드하고 바이너리 차이를 확인하십시오 –

+0

"... can 이 접근법을 정말로 권장하지 않습니다 ... ". 나는 동의한다. 그러나 여전히 시도해 볼만한 가치가있을 것입니다. –