【问题标题】:Preloading custom strchr() - ubuntu crashes预加载自定义 strchr() - ubuntu 崩溃
【发布时间】: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


【解决方案1】:

感谢迈克尔·佩奇:

strchr() 不符合手册,因为它在未找到字符时不返回 NULL。

固定 strchr() :

global  strchr
strchr:
        cmp     [rdi], sil;first check for character (useful if user searches '\0')
        je      end
        cmp     byte[rdi], 0;then if it is EoS and the character is not in the string, return NULL
        je      eos
        add     rdi, 1
        jmp     strchr
eos:    mov     rax, 0
        ret
end:    mov     rax, rdi
        ret

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多