我会立即声明我不是程序员,并且可能超出了我的能力范围。
我正在尝试找出 __strlen_sse2(程序集)函数中的错误,该函数作为 libc6-i686 的一部分安装在 Debian 中。
我已经有汇编代码(.S 文件)的拷贝,我需要找到一种从 C/C++ 程序调用它的方法。我怎样才能实现这个目标?
编辑:
尝试了这段代码,但我从 gcc 收到一个关于 undefined reference “__strlen_sse2”的错误
编辑2:据我所知,这是问题的正确答案,但我缺乏正确的知识来完成它。感谢大家的帮助。
#include <stdio.h>
#include <string.h>
size_t __strlen_sse2(const char *);
void main()
{
char buffer[255];
printf("Standby.. ");
gets(buffer);
__strlen_sse2("CRASH!");
printf("OK!\n");
}
就像我说的......不是程序员。
我希望我的问题有意义。如果您需要更多信息,请告诉我。
最佳答案
您不能在通常的动态链接 /lib/libc.so.6
中直接调用 __strlen_sse2
的拷贝,因为它是一个“隐藏符号” -- 可访问 libc 本身内部的代码,但不可用于外部链接。
您说您有来自 glibc 源代码的定义 __strlen_sse2
的 .S
文件,但您需要将其修改为可在 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
的内容。
关于c++ - 如何从 C/C++ 程序调用 __strlen_sse2? [Linux],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4848373/