.SO和.DLL库的可重定位代码

时间:2019-02-17 04:15:49

标签: c++ c assembly nasm relocation

我正在开发一个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变量或数据)?

0 个答案:

没有答案