生成正确的.DEF文件以导出非静态函数AND GLOBALS

接下来的一个问题是,如何检测跨dll badaries的全局variables的不良链接 ,事实certificate我需要修改PostgreSQL项目使用的.DEF文件生成器工具,以便正确地为全局variables发出.DEF条目的DATA标记。

问题

我似乎无法find一种方法,使用微软的工具,得到一个符号表列表,区分全局variables和函数,并包括未在其定义站点初始化的全局variables。

想法?

打破目前的做法

该工具通过dumpbin /symbols输出循环生成.DEF文件。 与我习惯的nm不同的是, dumpbin /symbols似乎不会为每个符号发出一个条目来指示符号types – 函数,初始化variables,未初始化variables。 它只显示符号是否在本地定义。

随着每个dumpbin输出行跟着在.c文件中的相应定义,我们首先有一个初始化的全局:

 00B 00000000 SECT3 notype External | _DefaultXactIsoLevel int DefaultXactIsoLevel = XACT_READ_COMMITTED; 

vs非静态链接的函数:

 022 00000030 SECT5 notype () External | _IsAbortedTransactionBlockState bool IsAbortedTransactionBlockState(void) {...} 

…为了获得额外的乐趣,未初始化的全局variables显示为UNDEF ,就像引用其他编译单元的符号一样,例如:

 007 00000004 UNDEF notype External | _XactIsoLevel int XactIsoLevel; 

即使这是在编译期间在头文件中预先声明的(为了便于阅读,使用项目特定的macros手工扩展)如下:

 extern __declspec(dllexport) int XactIsoLevel; 

所以…它看起来像dumpbin输出不包含足够的信息来生成一个正确的.DEF文件。

现在, gendefs.pl正在快速地吐出一个.DEF文件,它省略了未初始化的全局variables,并将所有其他代码声明为代码(通过在.DEF中未指定CONSTANTDATA )。 对于如此破碎的东西,它的工作非常好。

解决它

要生成正确的.DEF文件,我需要一种方法来确定哪些符号是variables。

我看着使用cl.exe/Fm选项,但它只是链接器/MAP选项的传递,当你只是生成一个目标文件,而不是链接它。

我可以使用一个符号转储工具来产生更多有用的信息,比如gcc的nm.exe ,但是这会增加额外的工具依赖性,并且看起来很脆弱。

在这一点上,我不能简单地使用PGDLLIMPORT (项目使用的__declspec(dllimport) / __declspec(dllexport)macros__declspec(dllimport)注释每个导出的函数,并停止使用DEF文件。

即使我需要find一种方法,当在暴露的variables上省略PGDLLIMPORT时,会导致清除链接器错误。

所以。 Windows链接器/编译器专家。 有任何想法吗?

Solutions Collecting From Web of "生成正确的.DEF文件以导出非静态函数AND GLOBALS"

那么,我必须说我错了,说Microsoft工具根本不使用符号类型字段。

1)。 cl不使用它来区分实际的类型信息,但它存储您需要的信息:

  • 0x20表示功能
  • 0x00意味着不是一个功能

PE / COFF规范 ,p。 46-47。

您可以在dumpbin的输出中搜索符号类型(在您的案例中notype类型()之后的()存在/ notype ,以查找它是code还是data

2)。 另外, clobj文件中为链接器生成特殊部分,其中包括以/export:symbol[,type]形式的每个__declspec(dllexport)符号的export切换。

3)。 最后,你可以指定'C ++'外部链接,并获取符号的类型,因为mangling。