【问题标题】:How can I call __strlen_sse2 from a C/C++ program? [Linux]如何从 C/C++ 程序调用 __strlen_sse2? [Linux]
【发布时间】:2011-01-31 07:02:05
【问题描述】:

我会直截了当地声明,我不是程序员,而且我可能已经不知所措了。

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

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

我希望我的问题是有道理的。如果您需要更多信息,请告诉我。

【问题讨论】:

    标签: c++ c linux assembly


    【解决方案1】:

    您不能在通常的动态链接/lib/libc.so.6 中直接调用__strlen_sse2 的副本,因为它是一个“隐藏符号”——libc 本身的代码可以访问,但不能用于外部链接。

    你说你有定义 __strlen_sse2.S 文件,来自 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
    

    您可能不需要-m32s。

    您也许可以从superuser.com 获得有关您更大问题的一些帮助——在您的问题中提供/proc/cpuinfo 的内容。

    【讨论】:

    • 哇,很棒的答案。非常感谢实现我所追求的具体步骤。唉,似乎我更大的问题与这个特定的功能无关;但至少我能够排除它。再次感谢。
    【解决方案2】:

    只需声明函数,最好使用完整的原型,然后调用它。这可能是正确的原型:

    size_t __strlen_sse2(const char *);
    

    我有点怀疑您声称您正试图追踪此函数中的错误。您的程序中很可能存在一个错误,它使用无效参数(无效指针或指向非空终止字符串的指针)调用 strlen

    【讨论】:

    • 感谢您的回复。我会试试这个并报告。崩溃的程序实际上是 init 和 bash。这是一个复杂的情况,但我只需要确认无论问题是什么,它都发生在 libc 内部,并且是可重现的(至少在我的系统上)。这样我就可以做出正确的错误报告。
    • 试过你的代码,但编译器抱怨一个未定义的函数引用。请耐心等待,这对我来说是新的领域。
    • 投诉的是编译器还是链接器?如果是链接器,那可能是因为您没有链接到包含__strlen_sse2 的文件。
    • @jaquer:也许最好的起点是查看 bash/init 何时开始崩溃以及您(或其他人)在此之前做了什么。也许您对某些手动更新有不兼容的 libc 和二进制文件?也许您使用的 bash 版本是使用与您现在在系统上安装的不同的 libc 编译的?例如。
    • 听起来您的动态链接器可能会错误检测 cpu 类型并在缺少 sse2 指令的 cpu 上加载 sse2 优化。
    猜你喜欢
    • 1970-01-01
    • 2011-06-27
    • 2012-02-09
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    相关资源
    最近更新 更多