Вы не можете напрямую вызвать копию __strlen_sse2
внутри обычного, динамически связанного /lib/libc.so.6
, потому что это «скрытый символ» - доступный для кода внутри самой libc, но недоступный для внешних ссылок.
Вы говорите, что у вас есть файл .S
, который определяет __strlen_sse2
, из исходного кода glibc, но вам нужно будет изменить его, чтобы его можно было собирать вне glibc. Я нашел то, что считаю правильным файлом, и смог довольно легко его изменить. Удалите все до, но не включая строку, которая читает только
.text
и замените его следующим:
#define PUSH(REG) pushl REG
#define POP(REG) popl REG
#define PARMS 4
#define STR PARMS
#define ENTRANCE
#define RETURN ret
#define L(x) .L##x
#define ENTRY(x) .globl x; .type x,@function; x:
#define END(x) .size x, .-x
Также удалите строку #endif
в самом конце файла. Затем скомпилируйте так:
gcc -m32 -c strlen-sse2.S
gcc -m32 -c test.c
gcc -m32 test.o strlen-sse2.o
./a.out
Возможно, вам не нужны -m32
с.
Возможно, вам удастся получить помощь в решении более крупной проблемы на superuser.com - укажите содержание /proc/cpuinfo
в вашем вопросе.