我会说明我不是程序员的蝙蝠,而且可能是我的头脑。
我正在尝试跟踪作为libc6-i686的一部分在Debian中安装的__strlen_sse2(程序集)函数中的错误。
我已经有了汇编代码(.S文件)的副本,我需要想办法从C / C ++程序中调用它。我怎样才能做到这一点?
编辑:
试过这段代码,但是我从gcc那里得到一个关于未定义引用'__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");
}
就像我说的......不是程序员。
我希望我的问题有道理。如果您需要更多信息,请与我们联系。
答案 0 :(得分:2)
你不能直接在通常的,动态链接的__strlen_sse2
内调用/lib/libc.so.6
的副本,因为它是一个“隐藏的符号” - libc内部的代码可以访问,但不能用于外部链接。
你说你有glibc源代码中定义.S
的{{1}}文件,但是你需要修改它才能在glibc之外构建。我发现我认为是正确的文件,并且能够很容易地修改它。删除所有内容但不包括只读
__strlen_sse2
并将其替换为:
.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
s。
您可以从superuser.com获得有关较大问题的帮助 - 在您的问题中提供-m32
的内容。
答案 1 :(得分:1)
只需声明该函数,最好使用完整的原型,然后调用它。这可能是正确的原型:
size_t __strlen_sse2(const char *);
我对你试图追踪这个功能中的错误的说法持怀疑态度。你的程序中有一个错误,就是调用带有无效参数的strlen
(无效指针或指向以空字符结尾的字符串之外的其他指针)。