2012-09-15 3 views
2

정적으로 링크 된 기호를 미리로드 할 수 있습니까? 기호가 동적으로 링크하는 경우정적으로 링크 된 C 기호 사전로드

리눅스, 나는

LD_PRELOAD=libSomeLibrary.so ./anExecutableLinkedToAnOtherLibrary

하지만이 단지 작품을 사용할 수 있습니다. 이제 심볼이 다른 라이브러리에 정적으로 링크 된 실행 파일에 일부 심볼을 ​​주입해야합니다.

정적 기호가 인라인되었을 수도 있기 때문에 일반적인 경우에는 이론적으로 불가능하다는 것을 알고 있습니다. 그러나 최적화 및 전체 디버그 기호가 포함되지 않은 디버그 빌드가있는 경우 이론 상 올바른 위치에 기호를 삽입 할 수 있어야합니다.

나는 리눅스와 윈도우 세계 모두에 대한 답변에 관심이 있지만, 리눅스에서이를 해결하는 것만으로도 충분할 것이다.

+0

당신이하려고하는 것이 조금 분명하지 않습니다. 오브젝트 파일/정적 라이브러리를로드 하시겠습니까? 당신은 항상 그 안에서 .so를 만들 수 있습니다. –

+0

내가하려는 것은 이것이다 : 나는 몇몇 라이브러리 함수를 호출하는 실행 파일을 가지고 있으며 정적으로 링크되어있다. 실행 파일을 다시 컴파일하지 않고 어떻게 든이 함수를 재정의하려고합니다. – enobayram

+0

정적으로 함수를 연결한다는 것은 무엇을 의미합니까? 이 함수들로 정적 라이브러리를 가지고 있습니까? 그렇다면 라이브러리는 전혀 링크되지 않고 나중에 링크 될 라이브러리에 저장됩니다. –

답변

2

정적 기호에는 ld.so가 사용되지 않으므로 사전로드 메커니즘이 없습니다. 운영 체제는 파일을 메모리에 매핑하고 실행을 시작합니다.

새 버전의 라이브러리가 포함되도록 바이너리를 수정할 수 있습니다. 한 가지 방법은 objcopy을 사용하여 이전 기호를 제거한 다음 ld을 사용하여 새 기호를 연결하는 것입니다.

+1

답변을 주셔서 감사합니다. 귀하의 제안을 시도했지만 작동하지 않습니다. 나는 심볼을 성공적으로 제거했다 (readelf -s는 심볼을 표시하지 않는다). 그러나 재 링크는 작동하지 않는다. 나는 심볼이 내부적으로 사용되지 않는다고 생각한다. – enobayram