c++ - 如何从 C/C++ 程序调用 __strlen_sse2? [Linux]

标签 c++ c linux assembly

我会立即声明我不是程序员,并且可能超出了我的能力范围。

我正在尝试找出 __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/

相关文章:

c - 如何在c中创建一个函数来反转字符串

linux - WKHTMLTOPDF 在 Ubuntu 上安装错误

c++ - 如何使用 C++ 在 tesseract 中设置和获取变量

c - C 中的无缝内存映射文件

c++ - 有没有办法在 Mac 上为 OpenCL 启用双 vector ?

c++ - Vortex86DX C++ 代码/工具链构建上的非法指令

c - 使用内核模块锁定内部系统调用

c++ - 在 C++ 中使用 DevIL 和 OpenGL 加载图像

c# - 计算百分位数以去除异常值的快速算法

c++ - Boost.Asio SSL 线程安全