Nice programing

-fPIC로 재 컴파일하는 방법

nicepro 2020. 12. 30. 20:23
반응형

-fPIC로 재 컴파일하는 방법


가이드 에 따라 ARM Ubuntu 시스템에 ffmpeg를 다시 설치하려고했습니다 . 불행히도이 lib를 사용하는 프로그램을 컴파일하면 다음과 같은 오류가 발생합니다.

/usr/bin/ld: /usr/local/lib/libavcodec.a(amrnbdec.o): relocation R_ARM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libavcodec.a: could not read symbols: Bad value
collect2: ld returned 1 exit status

이제 -fPIC컴파일러가 제안한 것처럼 다시 컴파일하고 싶지만 방법을 모르겠습니다. 도움을 주시면 감사하겠습니다.


간단히 말해서이 오류 는 정적 라이브러리를 사용하여 동적 라이브러리와 연결할 수 없음을 의미합니다 . 올바른 방법은 libavcodec을 .a 대신 .so로 컴파일하는 것이므로 빌드하려는 다른 .so 라이브러리가 잘 링크됩니다.

가장 짧은 방법 --enable-shared./configure옵션 을 추가 하는 것 입니다. 또는 공유 (또는 정적) 라이브러리를 전혀 비활성화하려고 할 수도 있습니다 ... 자신에게 적합한 것을 선택하십시오!


한 번 봐 가지고 이 페이지를.

다음을 사용하여 전역 적으로 플래그를 추가 할 수 있습니다. export CXXFLAGS="$CXXFLAGS -fPIC"


구성 단계 후에 아마도 makefile이있을 것입니다. 이 메이크 파일 안에서 CFLAGS (또는 유사)를 찾으십시오. 마지막에 puf -fPIC를 실행하고 make를 다시 실행합니다. 즉, -fPIC는 컴파일러로 어딘가에 전달되어야하는 컴파일러 옵션입니다.


Centos 7에 Dashcast를 설치하려고 시도하는 동안 동일한 문제가 발생했습니다. 수정은 -fPICx264 Makefile의 각 CFLAGS 끝에 추가 되었습니다. 그런 다음 make distcleanx264와 ffmpeg를 모두 실행 하고 다시 빌드해야했습니다.


Android x86_64 대상 플랫폼 (Android NDK clang 사용) 용 FFMPEG 정적 라이브러리 (예 : libavcodec.a)를 빌드 할 때이 문제가 발생했습니다. 내 라이브러리와 정적으로 연결할 때 모든 FFMPEG C-> 개체 파일 (* .o)이 -fPIC 컴파일 옵션으로 컴파일되었지만 문제가 발생했습니다.

x86_64/libavcodec.a(h264_qpel_10bit.o): 
requires dynamic R_X86_64_PC32 reloc against 'ff_pw_1023' 
which may overflow at runtime; recompile with -fPIC

libavcodec.a 및 libswscale.a에 대해서만 문제가 발생했습니다.

이 문제의 원인은 FFMPEG 에 x86 * 플랫폼에 대한 어셈블러 최적화 가 있다는 것입니다. 예를 들어보고 된 문제 원인은 libavcodec / h264_qpel_10bit.asm- > h264_qpel_10bit.o에 있습니다.

(예를 들어 libavcodec.a)는 (예를 들면 위해 libavcodec / h264_qpel_10bit.asm) 어셈블러 파일처럼 보이는 - 64이 정적 라이브러리를 비트 생산하는 경우는 정적 - 64 비트 대상 라이브러리와 링크 할 때 호환되지 않는 일부의 x86 (32 비트) 어셈블러 명령을 사용하여 그들이 이후를 필수 재배치 유형을 지원하지 않습니다.

가능한 해결책 :

  1. 어셈블러 최적화없이 모든 ffmpeg 파일을 컴파일합니다 (ffmpeg의 경우 구성 옵션 : --disable-asm).
  2. 동적 라이브러리 (예 : libavcodec.so)를 생성하고 최종 라이브러리에 동적으로 연결합니다.

나는 1)을 선택했고 그것은 문제를 해결했다.

참조 : https://tecnocode.co.uk/2014/10/01/dynamic-relocs-runtime-overflows-and-fpic/


컴파일하기 전에 "rules.mk"파일이 Makefile에 제대로 포함되어 있는지 확인하거나 다음과 같이 명시 적으로 포함하는지 확인하십시오.

"소스 rules.mk"

참조 URL : https://stackoverflow.com/questions/13812185/how-to-recompile-with-fpic

반응형