Я компилирую mplayer с помощью llvm-gcc-4.2.1.
С '-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
fyi, моя версия 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 инициализируется с помощью макроса:
DECLARE_ASM_CONST(8, uint64_t, MM_FIX_0_707106781)=FIX64(0.707106781, 14);
, который оценивается как:
static const uint64_t __attribute__((used, aligned (8))) MM_FIX_0_707106781=0x2d412d412d412d41;
Эти константыиспользуется в коде asm:
#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.
Может кто-нибудь предложить решение этой проблемы?Спасибо.