2012-10-12 8 views
3

임베디드 powerpc (e500v2) 플랫폼에서 작업하고 있습니다. 나는 gcc 4.6.3과 eglibc 2.13으로 컴파일하는 크로스 컴파일이다. 대상에 컴파일되어로드 된 swig 라이브러리가 있습니다. 그 파이썬에로드 할 때 나는 역 추적에서이 오류를 얻고있다 :R_PPC_REL24 재배치가 범위를 벗어났습니다.

ImportError: /opt/load/lib/libISSDcn.so: R_PPC_REL24 relocation at 0x0ddc99c0 for symbol `longjmp' out of range 

내가 전에이 라이브러리와 투쟁이, 내가 2.7 목표에 파이썬 2.5에서 마이그레이션하고 있습니다. 처음에이 라이브러리를 컴파일하려고 시도했을 때 어떤 플래그를 사용했는지에 따라 컴파일 시간에 재배치 오류 또는 피연산자가 범위 오류를 벗어났습니다. gcc 4.6.3으로 전환했는데 이제는 빌드되지만,로드 될 때이 오류가 발생합니다.

나는이 오류를 이해하려고 노력하고 있지만, 지금까지 나는 그것이 무엇을 의미하고 어떻게 고쳐야하는지 정확히 어둠 속에있다. 어떤 이유로 기호를 찾을 수 없지만, 왜, 또는 어떻게 수정해야하는지 이해하지 못합니다.

답변

4

R_PPC_REL24 재배치는 24 비트 상대 오프셋에 사용됩니다. 이 유형의 재배치는 동적 재배치 테이블에 나타나서는 안됩니다 (라이브러리는 16 MiB 이상 떨어져있는 주소로로드 될 수 있기 때문에로드 가능한 객체 내부의 참조를 의미합니다.

기본적으로 컴파일러는 전체 32 비트 주소보다 훨씬 작고 빠른 코드이므로 가능하면 이러한 reloc을 생성하지만 동적 연결의 경우 외부에서 볼 수있는 기호 및 PIC/GOT 항목에 전체 주소를 사용해야합니다 생성됩니다.

플래그가 라이브러리를 작성하는 데 사용되고 링커가 공유 객체를 작성 중임을 알리는 지 확인하십시오 (일반적으로 -shared 또는 -Bshared 통해).

+0

그래, 내가 다른 곳에서 제안한 것을 보았습니다. 나는이 라이브러리가 fPIC로 컴파일되었다고 들었지만 확실히 가능하지는 않았다. 라이브러리가 PIC인지 PIC인지 여부는 사실 후에 어떻게 알 수 있습니까? –

+0

또는 내가 물을 수있는 또 다른 질문은 내가 readelf -r을하면 공유 객체에서 R_PPC_REL24를 볼 것으로 예상해야합니까? 나는 그들 중 많은 것을 본다. 아니면이 목록에 외부 기호가 아닌 기호가 포함되어 있습니까? –

+0

PIC 라이브러리는 PIC 및 GOT 영역 이외의 영역에 동적 재배치를 적용해서는 안되며 이러한 재배치는 모두 전체 주소 공간을 포함 할 수 있어야합니다. –

관련 문제