预加载自定义 strchr() - ubuntu 崩溃
Preloading custom strchr() - ubuntu crashes
我实现了 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 预加载它时,它有效。
知道为什么吗?
感谢迈克尔·佩奇:
strchr() 不符合手册,因为当找不到字符时它不会 return NULL。
修复了 strchr() :
global strchr
strchr:
cmp [rdi], sil;first check for character (useful if user searches '[=10=]')
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
我实现了 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 预加载它时,它有效。
知道为什么吗?
感谢迈克尔·佩奇:
strchr() 不符合手册,因为当找不到字符时它不会 return NULL。
修复了 strchr() :
global strchr
strchr:
cmp [rdi], sil;first check for character (useful if user searches '[=10=]')
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