llvm-gcc-4.2.1을 사용하여 mplayer를 컴파일 중입니다.ASM 상수가있는 정의되지 않은 기호를 유발하는 링크 시간 최적화 문제
'-O1'(링크 시간 최적화를 비활성화 함)을 사용하면 프로그램이 성공적으로 컴파일되고 연결됩니다. '-O2'또는 '-O1 -flto'로 ld는 정의되지 않은 기호 불평 : 참고하시기 바랍니다
Undefined symbols for architecture x86_64: "_MM_FIX_0_707106781", referenced from: _filter in vf_fspp.o "_MM_FIX_0_541196100", referenced from: _filter in vf_fspp.o ld: symbol(s) not found for architecture x86_64 collect2: ld returned 1 exit status
, LD의 내 버전 :
@(#)PROGRAM:ld PROJECT:ld64-123.2
llvm version 2.9svn, from Apple Clang 2.0 (build 137)
내가 MM_FIX_0_707106781에 불과 할것의로 다른 상수는 모두 동일한 절차를 따릅니다.
MM_FIX_0_707106781는 매크로로 초기화된다
static const uint64_t __attribute__((used, aligned (8))) MM_FIX_0_707106781=0x2d412d412d412d41;
이러한 상수는 ASM 코드에 사용되는 : 평가
DECLARE_ASM_CONST(8, uint64_t, MM_FIX_0_707106781)=FIX64(0.707106781, 14);
#define MANGLE(a) "_" #a "(%%rip)" __asm__ volatile( ... "pmulhw "MANGLE(MM_FIX_0_707106781)", %%mm7 \n\t" ... );
내가 비슷한을했다합니다 (같은?) asm 함수를 추가하여 해결할 수있는 문제 :
".globl "LABLE_MANGLE(functionnamehere)"\n\t"
각 레이블 앞에 있지만이 지식은 이러한 ASM 상수로 나를 도왔습니다.
나는 그것이 제공 할 수있는만큼 많은 정보이다. 나는 두렵다. 다시 한번 -O1을 사용하면 코드가 컴파일되고 링크되고 실행됩니다. -O2를 사용하면 링커가 이러한 asm 상수를 찾지 못합니다.
누구든지이 문제를 해결할 수 있습니까? 감사.
. 여기서 상수는 명시 적으로 "used"로 표시되어 있으므로 사용 된 장소와 상관없이 옵티 마이저에 의해 보존되어야합니다. –
@Anton Korobeynikov, 전체 모듈이 링크되지 않았으므로 도움이되지 않는 것 같습니다. 포함 된 asm의 참조는 뒤 따르지 않습니다. '__asm__'이 한 모듈에 있고 상수가 다른 모듈에 있고, 후자가 첫 모듈 다음에 연결되어있을 때 일어납니다. –
이것은 의도 된 동작이므로 컴파일러는 어셈블러를 텍스트로 취급하므로 내부에서 이상한 일을하고 있다는 것을주의 깊게 알려야합니다. 정적 변수의 사용 (외부 가시성이 없으므로)은 컴파일러에게 반드시 알려야합니다 (이 경우 피연산자를 통해). –