我会说蝙蝠,我不是一个程序员,可能在我的头上。
我试图追踪安装在Debian中的__strlen_sse2(assembly)函数中的一个错误,作为libc6-i686的一部分。
我已经有一个汇编代码(.S文件)的副本,我需要找出从C / C ++程序调用它的方法。 我怎样才能做到这一点?
编辑:
在Linux环境下运行联机汇编(使用GCC / G ++)
使用寄存器而不保存它们? (部件)
Linux NASM OUTSB SegFault
虚拟处理器和高级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"); }
就像我说的…不是程序员。
我希望我的问题是有道理的。 如果您需要更多信息,请让我知道。
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
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] 举报,一经查实,本站将立刻删除。