C++ 我如何从C/C++;节目?[Linux]
我会直截了当地说,我不是一个程序员,而且很可能是头脑发热 我正试图追踪作为libc6-i686的一部分安装在Debian中的u strlen_sse2(assembly)函数中的一个bug 我已经有了汇编代码(.S文件)的副本,我需要找到一种从C/C++程序调用它的方法。我怎样才能做到这一点 编辑: 尝试了这段代码,但是我从gcc得到了一个关于未定义对“\uu strlen\u sse2”的引用的错误 编辑2:我的理解是,这是问题的正确答案,但我缺乏正确的知识来完成它。谢谢大家的帮助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
#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说明。哇,回答太棒了。非常感谢为实现我所追求的目标而采取的具体步骤。唉,似乎我更大的问题与这个特定功能无关;但至少我能够排除它。再次感谢。