You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组中函数地址错误:调用DLL导出排序函数异常排查

问题原因与解决方案

你的核心问题出在导入函数地址的存储与调用逻辑上,以下是具体分析和解决办法:

可能的原因

1. 数组存储的是导入表项地址而非函数真实地址

__imp_xxx是链接器生成的全局变量,它的内存地址指向导入地址表(IAT)中存储函数真实地址的位置。你定义的sort_list数组里存的是__imp_xxx这个变量本身的地址,而非它指向的函数地址。

你当前的调用逻辑call qword ptr [rbx + rax * 8],本质是尝试调用__imp_xxx变量的地址(而非函数地址)。索引0能正常工作是巧合——刚好__imp_bubbleSort的地址落在了有效代码区,但这属于未定义行为,索引1时就会暴露问题。

2. 导入符号与DLL导出不匹配

如果DLL中insertionSort的导出名和你导入的__imp_insertionSort存在差异(比如大小写错误、多余修饰符),链接器会将__imp_insertionSort初始化为无效地址,导致调用时地址错误。

解决办法

方法1:让数组直接存储函数真实地址

修改sort_list的定义,直接存入__imp_xxx指向的函数地址:

sort_list dq [__imp_bubbleSort], [__imp_insertionSort], [__imp_quickSort], [__imp_selectionSort], [__imp_shakerSort]

此时数组每个元素都是函数的真实地址,你当前的调用逻辑call qword ptr [rbx + rax * 8]可以正常工作。

方法2:修正调用的寻址层级

保持sort_list定义不变,将调用代码改为双重间接寻址,先取__imp_xxx的地址,再取该地址中存储的函数真实地址:

call qword ptr [[rbx + rax * 8]]

方法3:验证导入符号的正确性

  1. 用dumpbin /imports 你的程序.exe查看导入表,确认insertionSort存在且__imp_insertionSort地址有效。
  2. 在调试器中查看sort_list数组的内容,对比sort_list+8的地址是否与__imp_insertionSort的地址一致。
  3. 检查DLL的导出表,确保insertionSort的导出名与你导入的符号完全匹配(x64下无stdcall修饰符,导出名应为纯函数名)。

内容的提问来源于stack exchange,提问作者mantissa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 23:27:43