2

我实现了 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 预加载它时,它可以工作。

知道为什么吗?

4

1 回答 1

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
于 2017-03-15T14:16:11.737 回答