C++ 我如何从C/C++;节目?[Linux]

C++ 我如何从C/C++;节目?[Linux],c++,c,linux,assembly,C++,C,Linux,Assembly,我会直截了当地说,我不是一个程序员,而且很可能是头脑发热 我正试图追踪作为libc6-i686的一部分安装在Debian中的u strlen_sse2(assembly)函数中的一个bug 我已经有了汇编代码(.S文件)的副本,我需要找到一种从C/C++程序调用它的方法。我怎样才能做到这一点 编辑: 尝试了这段代码,但是我从gcc得到了一个关于未定义对“\uu strlen\u sse2”的引用的错误 编辑2:我的理解是,这是问题的正确答案,但我缺乏正确的知识来完成它。谢谢大家的帮助 #incl

我会直截了当地说,我不是一个程序员,而且很可能是头脑发热

我正试图追踪作为libc6-i686的一部分安装在Debian中的u strlen_sse2(assembly)函数中的一个bug

我已经有了汇编代码(.S文件)的副本,我需要找到一种从C/C++程序调用它的方法。我怎样才能做到这一点

编辑:

尝试了这段代码,但是我从gcc得到了一个关于未定义对“\uu strlen\u 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");
}
#包括
#包括
大小(常量字符*);
void main()
{
字符缓冲区[255];
printf(“备用…”);
获取(缓冲区);
__strlen_sse2(“崩溃!”);
printf(“确定!\n”);
}
就像我说的。。。不是程序员


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

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

size_t __strlen_sse2(const char *);

我有点怀疑你的说法,你正在试图追踪这个函数中的一个bug。更有可能的是,您的程序中存在一个错误,该错误使用无效参数(无效指针或指向非空终止字符串的指针)调用
strlen

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

你说你有一个
.S
文件,它从glibc的源代码中定义了
\uu strlen\u sse2
,但是你需要修改它,使其能够在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
s


您可能可以从中获得一些关于更大问题的帮助--在您的问题中提供
/proc/cpuinfo
的内容。

谢谢您的回答。我将尝试此方法并报告。正在崩溃的程序实际上是init和bash。这是一个复杂的情况,但我只需要确认,无论问题是什么,它都会发生笔位于libc内部,并且是可复制的(至少在我的系统上)。这样我可以做出正确的错误报告。尝试了您的代码,但编译器抱怨对函数的引用未定义。请容忍我,这对我来说是一个新领域。是编译器还是链接器抱怨的?如果是链接器,那可能是因为您没有链接到包含
\u strlen\u sse2
@jaquer:也许最好的出发点是看看bash/init何时开始崩溃,以及您(或其他人)做了什么在那之前有过。也许你有不兼容的libc和二进制文件要做一些手动更新?也许你正在使用的bash版本是用不同的libc编译的,而不是你现在在系统上安装的版本?例如。听起来你的动态链接器可能错误地检测到了cpu类型,并在lac的cpu上加载了sse2优化ks sse2说明。哇,回答太棒了。非常感谢为实现我所追求的目标而采取的具体步骤。唉,似乎我更大的问题与这个特定功能无关;但至少我能够排除它。再次感谢。