从 _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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...