"-fPIC으로 재컴파일" 오류 발생

"-fPIC으로 재컴파일" 오류 발생

CentOS에서 별표 뒤에 ./configuremake 명령을 입력했지만 다음 오류가 발생합니다.

/usr/bin/ld: /usr/local/lib/liblua.a(lapi.o): relocation R_X86_64_32 against `luaO_nilobject_' can not be used when making a shared object; recompile with -fPIC /usr/local/lib/liblua.a: could not read symbols: Bad value

나는 이것을 시도했지만 ./configure CFLAGS=-fPIC위와 같은 오류가 발생했습니다.

답변1

별표로 표시된 이 시점에서는 동적 lib를 빌드하려고 합니다. 이 동적 라이브러리는 모든 메모리 위치에 로드될 수 있으므로 모든 것을 재배치할 수 있어야 합니다. 플래그 -fPIC는 위치 독립적 코드(Position Independent Code)를 의미하며, 코드는 로드 위치에 독립적으로 만들어졌습니다. 어디든 로드됩니다.

이 별표 동적 lib 빌드의 일부로 Lua 인터프리터를 가져오려고 합니다. 동적 라이브러리로 가져오므로 컴파일된 모든 PIC가 필요합니다. 하지만 당신은 Lua의 정적 라이브러리를 사용하고 있습니다.~ 아니다-fPIC으로 구축되었습니다. 정적 라이브러리의 lua 개체는 재배치될 수 없기 때문에 이를 거부합니다.

지금:이것이 -fPIC별표 빌드에 추가하는 것이 도움이 되지 않는 이유입니다. 호환되지 않는 별표 코드 개체(-fPIC가 영향을 줄 수 있음)가 아니라 liblua.a, 특히 liblua.a가 전달하는 개체(예: lapi.o)입니다. 게다가 그 시점에서 동적 lib를 구축하고 있으며, 그 시점에서 함께 가져오려는 별표 개체에 대해 -fPIC와 같은 재배치 가능한 코드 플래그가 이미 있다고 확신합니다.

세 가지 해결책이 보입니다.

  • 하나는 빌드에서 Lua를 삭제하는 것입니다. 특별히 필요하지 않고 "나중에 가지고 놀면 재미있을 것"이라고 더 많이 생각했다면 원하는 기능을 잃지 않고 사용할 수 있을 것입니다.

  • liblua.so또 다른 방법은 별표 빌드에서 참조할 수 있는 liblua의 동적 버전을 얻는 것입니다 . 나는 당신의 배포판을 모르기 때문에 그것을 얻는 방법을 말할 수 없습니다.

  • 다른 하나는 -fPIC을 사용하여 lua와 liblua.a를 다시 빌드하는 것입니다. 일관되지 않은 빌드 플래그(만든 것과 디스크에 있는 다른 것)로 인해 호환성 문제가 발생할 수 있으므로 현재 빌드된 Lua와 일치하는 liblua.so를 찾는 것이 더 나은 선택이라고 생각합니다.

liblua.so를 찾으면 이에 대한 '-rpath' 링커 플래그, 특히 '-Wl,-rpath,/path/to/lua/libs'를 살펴보는 것이 좋습니다.

관련 정보