链接gcc可执行文件和Visual C++库是否安全?

4
链接MinGW可执行文件与由Visual C++编译的库有多安全?
类似于这里所解释的内容。 http://www.codesynthesis.com/~boris/blog/2011/12/09/oci-mingw/ 简而言之,“因为OCI是一个C库,我们可以使用VC++的“官方”OCI导入库oci.lib,将其重命名为libclntsh.a,这样我们就可以在MinGW上使用OCI了。”
这会是一场等待发生的事故吗?可能会出现什么问题?

名称混淆不兼容性,实现之间的对齐差异,以及各种可能导致灾难的事情。 - San Jacinto
2
C语言有ABI。通过C API连接是安全的。但在Windows上,C++则没有。 - bmargulies
我很惊讶ld链接器甚至可以处理Microsoft的目标文件和库格式。由于这显然是一个使用C接口的DLL导入库,所以事情可能会顺利进行 - MinGW需要在Windows上通常使用DLL才能有用,因此它与DLL导入很好地配合使用。我认为可能的主要问题是跨运行时库分配/释放内存的一般问题。但我怀疑OCI.dll被设计成避免这种情况(因为这也是VC构建的问题)。 - Michael Burr
1个回答

2

这要看情况。

据我所知,glibc和msvcrt可以在Windows上的同一进程中共存——Linux上发生的全局函数搜索在Windows上不会发生(每个动态导入都知道它来自哪个DLL,函数不会合并在单个命名空间中)。

但是,某些库可能存在问题。如果库指定“该函数返回一个指针,该指针应在完成后使用free()释放”,则需要使用正确的free释放它,即与分配它的malloc()相对应的free。同样,如果函数声明“参数是将由函数使用free()释放的缓冲区”,那么它必须使用相应的malloc()进行分配。当使用realloc()时也存在类似的问题。

例如,在使用针对不同版本的MSVCRT编译的DLL时(如MSVCRT20.dll vs. MSVCRT40.dll),也会出现此问题。

这就是为什么Windows库总是说明内存应该如何分配的原因。例如,请参见CoTaskMemAlloc/CoTaskMemFree、LocalAlloc/LocalFree、HeapAlloc/HeapFree。文档可能会说明“缓冲区不再需要时必须使用CoTaskMemFree释放”。或者他们可以提供自己的free/alloc对,例如“不再需要返回的缓冲区必须使用SuperLibraryFreeBuffer释放”(其中内部可能仅委托给CRT的free,但至少它将是正确版本的free)。

这是因为Windows始终是一种多语言平台,可以在除C语言之外的其他语言中编写库。今天我们可能习惯于Lisp、Pascal等是C运行时的一层——即使在Pascal的情况下这并不总是正确的,大多数程序员可能认为如此——但它并不总是这样:在C发明之前,Pascal已经在DEC计算机上普及了两年,在Windows的历史背景下,它与DEC有很多共同之处。早期版本的Windows主要使用汇编语言编写,...你知道Windows 3头文件中的“Pascal”调用约定有什么原因...


1
你提出了重要的想法,但有人投了负评。我希望他们能给出原因。我对这个领域的了解并不足以判断你的答案是正确还是错误。 - user841550
请记住,即使所有模块都使用VC编译(甚至是相同版本),从不同运行时库中分配和释放内存的问题仍可能出现。因此,将MinGW应用程序与VC库(特别是DLL)链接在一起并没有真正增加太多混合内容。另外,请记住,就C运行时而言,MinGW并不使用glibc(或者如果使用,只是很小的一部分)。MinGW C运行时的大部分是作为Windows的一部分提供的msvcrt.dll。我不确定C++运行时对兼容性有什么影响。 - Michael Burr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接