如何从C / C ++程序中调用__strlen_sse2? [Linux的]

时间:2011-01-31 07:02:05

标签: c++ c linux assembly

我会说明我不是程序员的蝙蝠,而且可能是我的头脑。

我正在尝试跟踪作为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");
}

就像我说的......不是程序员。

我希望我的问题有道理。如果您需要更多信息,请与我们联系。

2 个答案:

答案 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(无效指针或指向以空字符结尾的字符串之外的其他指针)。