微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从C / C ++程序调用__strlen_sse2?

我会说蝙蝠,我不是一个程序员,可能在我的头上。

我试图追踪安装在Debian中的__strlen_sse2(assembly)函数中的一个错误,作为libc6-i686的一部分。

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

编辑:

在Linux环境下运行联机汇编(使用GCC / G ++)

使用寄存器而不保存它们? (部件)

Linux NASM OUTSB SegFault

如何将反汇编的C代码分解为函数

虚拟处理器和高级networkingLinux和Windows

试过这个代码,但是我得到一个关于未定义的引用'__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"); }

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

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

无法运行与libc链接的可执行文件

如何在汇编程序中打开文件并进行修改

ASLR和地址

内联assembly可以closures保护模式吗?

如何让Python使用Assembly

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

你说你有.S文件,它定义了来自glibc源代码的__strlen_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。

你可以通过superuser.com得到一些帮助,在你的问题中提供/proc/cpuinfo的内容

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

size_t __strlen_sse2(const char *);

我对你声称你试图追踪这个函数中的一个错误有点怀疑。 这很可能是你的程序中有一个错误,用一个无效的参数(一个无效的指针或者一个指向非null终止的字符串的指针)调用strlen 。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐