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

知道为什么吗?

最佳答案

感谢Michael Petch:

该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

关于linux - 预加载自定义strchr()-Ubuntu崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42811805/

10-11 07:34