【发布时间】:2017-08-06 07:30:13
【问题描述】:
我实现了 strchr()
global strchr
strchr:
cmp byte[rdi], 0
je end
cmp [rdi], sil
je end
add rdi, 1
jmp strchr
end: mov rax, rdi
ret
当我使用 .so 预加载它时,
export LD_PRELOAD=abs/path/to/lib.so
Ubuntu 16.04 崩溃。有时它完全崩溃,有时它显示 SIGILL(损坏的数据?)。
当我使用 opensuse 4 预加载它时,它可以工作。
知道为什么吗?
【问题讨论】:
-
如何构建共享对象?您确实在不同的系统上重建它(而不仅仅是将一个二进制文件复制到另一个)?
-
@Someprogrammerdude 我在每个系统上使用 nasm -f elf64 asm.asm 然后 gcc -shared asm.o -o lib.so (Makefile) 构建它
-
这个函数不符合
strchr,因为它在找不到字符时不返回空指针。 -
@MichaelPetch 哦,我很愚蠢。谢谢。
-
还应该指出搜索
nul(\0) 字符也是有效的,因为nul被认为是字符串的一部分。如果有人将 0 作为字符传递,那么您应该返回一个指向 NUL 终止符的指针。
标签: linux ubuntu assembly strchr