如何解决从 _start 以外的函数调用 dlsym 崩溃
SECTION .text
EXTERN dlopen ; loads a dynamic library
EXTERN dlsym ; retrieves the address for a symbol in the dynamic library
global _start ; "global" means that the symbol can be accessed in other modules. In order to refer to a global symbol from another module,you must use the "extern" keyboard
_start:
; load the library
mov rdi,str_libX11so
mov rsi,2; RTLD_Now=2
call dlopen wrt ..plt
; plt stands for Procedure Linkage Table:
; used to call external library functions whose address is not kNow at link time,; so it must be resolved by the dynamic linker at run time
; more info: https://reverseengineering.stackexchange.com/questions/1992/what-is-plt-got
mov [ptr_libX11so],rax ; the prevIoUs function call returned the value in rax
; load the function
mov rdi,[ptr_libX11so]
mov rsi,fstr_XOpendisplay
call dlsym wrt ..plt
mov [fptr_XOpendisplay],rax
mov rax,60 ; syscal: exit
mov rdi,0 ; return code
syscall
str_libX11so: db "libX11.so",0
; X11 function names
fstr_XOpendisplay: db "XOpendisplay",0
SECTION .data
ptr_libX11so: dq 0 ; ptr to the X11 library
; X11 function ptrs
fptr_XOpendisplay: dq 0
然后我尝试将调用 dlsym
的代码移动到函数 (loadX11Functions
) 中。
SECTION .text
EXTERN dlopen ; loads a dynamic library
EXTERN dlsym ; retrieves the address for a symbol in the dynamic library
loadX11Functions:
mov rdi,rax
ret
global _start ; "global" means that the symbol can be accessed in other modules. In order to refer to a global symbol from another module,rax ; the prevIoUs function call returned the value in rax
call loadX11Functions
mov rax,0
SECTION .data
ptr_libX11so: dq 0 ; ptr to the X11 library
; X11 function ptrs
fptr_XOpendisplay: dq 0
我很困惑这么小的改动会破坏我的程序。
这是我用来编译的命令:
nasm -f elf64 -g -F dwarf minimal.asm && gcc -nostartfiles -no-pie minimal.o -ldl -o minimal && ./minimal
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。