Gcc 初始化DLL所需的函数调用

Gcc 初始化DLL所需的函数调用,gcc,dll,initialization,mingw,Gcc,Dll,Initialization,Mingw,编辑:只需尝试以下内容: __declspec(dllexport) int foo(int param) {return param*param;} 并编译。事实证明,来自CRT和内核32的函数仍然是导入的。我发现它们来自运行时。问题是为什么假定需要此运行时?我读过一些关于搬迁的书。这是线索吗 我创建了一个提供Win32 GUI小部件的dll。如果我查看mingw gcc生成的dll的导入表,它看起来像以下(标有(*)的函数是我自己调用的函数): 导入表(解释的.idata节内容)

编辑:只需尝试以下内容:

__declspec(dllexport) int foo(int param)
    {return param*param;}
并编译。事实证明,来自CRT和内核32的函数仍然是导入的。我发现它们来自运行时。问题是为什么假定需要此运行时?我读过一些关于搬迁的书。这是线索吗

我创建了一个提供Win32 GUI小部件的dll。如果我查看mingw gcc生成的dll的导入表,它看起来像以下(标有(*)的函数是我自己调用的函数):

导入表(解释的.idata节内容)

在我真正使用DLL之前,似乎还有很多事情要做。例如,我从未在代码中使用过
fwrite
,但它会显示在导入表中。这表示它用于编译器在链接时添加的某些初始化例程中为什么?(x)标记的函数是否足够?

我创建了一个提供Win32 GUI小部件的dll

这已经足够了,如果不使用Win32 API函数,就无法编写Win32小部件。这就是导入表转储显示的内容。您最终总会依赖于核心Windows API kernel32.dll。当你使用windows做任何事情时,你都会得到对user32.dll的依赖。msvcrt.dll依赖项由mingw生成,它链接Microsoft C运行时库的动态版本


一切正常,Windows loader确保在启动程序时加载并链接这些DLL。

C代码运行启动代码。要了解这意味着什么,请阅读谷歌上的第一个链接

简而言之:它设置堆、堆栈和初始化静态变量,以及“环境”、传递给程序的参数的内存、内部语言环境等。。。具体取决于操作系统、编译器和各自的版本


依赖项确实是链接在一起的,因为启动代码初始化了线程本地存储等等。您可以通过在与gcc链接时添加
-nodefaultlibs
来防止(至少部分)这种情况,但请注意:
前面有龙

这是真的,但它没有回答我的问题不,你没有,因为我知道我问了什么?问题是:为什么导入表中的函数比我调用的多。我认为它们来自初始化例程。这就引出了问题B:如果我只想让dll中的代码正常工作,那么初始化到底需要做多少工作。我不需要italic fwrite,是吗?看来你的DLL的代码很小很简单。也许您可以发布完整的代码或其他具有相同问题的测试代码?但是主应用程序不应该已经完成了很多吗?如果dll不使用TLS、CRT和其他功能,则使用-nodefaultlibs是否安全?
-nodefaultlibs
仅省略系统库(基本操作系统功能所需)<代码>-如果你不知道自己在做什么,nostartfiles
会给你带来麻烦。
vma:            Hint    Time      Forward  DLL       First
                Table   Stamp     Chain    Name      Thunk
00006000    00006050 00000000 00000000 00006354 000060d4

DLL Name: KERNEL32.dll
vma:  Hint/Ord Member-Name Bound-To
6158      207  DeleteCriticalSection
6170      236  EnterCriticalSection
6188      352  FreeLibrary
6196      510  GetLastError
61a6      529  GetModuleHandleA  (x)
61ba      577  GetProcAddress
61cc      734  InitializeCriticalSection
61e8      814  LeaveCriticalSection
6200      817  LoadLibraryA
6210     1173  TlsGetValue
621e     1213  VirtualProtect
6230     1215  VirtualQuery

00006014    00006084 00000000 00000000 00006394 00006108

DLL Name: msvcrt.dll
vma:  Hint/Ord Member-Name Bound-To
6240       52  __dllonexit
624e      182  _errno
6258      266  _iob
6260      538  _winmajor
626c      583  abort
6274      595  calloc
627e      610  fflush
6288      625  free    (x)
6290      633  fwrite
629a      676  malloc  (x)
62a4      682  memcpy  (x)
62ae      748  vfprintf

00006028    000060b8 00000000 00000000 000063b8 0000613c

DLL Name: USER32.dll
vma:  Hint/Ord Member-Name Bound-To
62ba      134  DefWindowProcA    (x)
62cc      342  GetWindowLongA    (x)
62de      405  LoadCursorA       (x)
62ec      480  RegisterClassExA  (x)
6300      508  SendMessageA      (x)
6310      569  SetWindowLongA    (x)