我正在开发一个C ++库,该库需要包含一些外部汇编函数。
当前,以这种方式声明C / C ++函数(通用格式,而不是确切的代码):
#if defined _WIN32
#define DLL_ENTITY __declspec(dllexport)
#endif
#if defined _WIN32
DLL_ENTITY
#endif
int Function (int argument);
并使用-fPIC标志在GCC中对其进行编译(使用Makefile),以创建可重定位的代码,该代码可从链接到我的库的程序中使用。例如(我的Makefile的一个命令输出):
g++ -I`pwd`/.. -Wall -fPIC -march=x86-64 -mtune=generic -g -c sort.cpp
在Windows中,我在Visual Studio中创建并配置一个带有可执行格式DLL选项的项目,然后它将完成所有工作。
好的,我的汇编函数如下:
global function
global _function
function:
_function:
ENTER reserved_bytes,nest_level
; ...get possible parameters...
; ...do something...
LEAVE
ret
根据NASM手册,对于Windows DLL库,我必须添加以下内容:
export function
我的怀疑是这些
1)对于Linux,它没有提及“导出”,我想这与不需要任何特殊处理的C / C ++函数/类原型相同,它们的声明方式与独立程序。这样对吗?只需在Windows上使用“导出”,而在Linux上不使用?
2)可重定位代码生成怎么样?对于Windows,“ export”关键字使它可重定位或只是EXPORTABLE?对于Linux,我是否需要使用与-fPIC等效的标志,还是必须使用BASED寻址来创建可重定位代码?例如:
add WORD[BP+myNumber],10h
instead of
add WORD[myNumber],10h
但是在这种情况下,如何找到要为其设置BP(EBP / RBP)的函数的基地址(以防万一,我需要访问LOCAL变量或数据)?