gpt4 book ai didi

c++ - 如何告诉 MinGW 链接器不要导出所有符号?

转载 作者:IT老高 更新时间:2023-10-28 23:01:37 27 4
gpt4 key购买 nike

我正在使用 MinGW 工具链构建一个 Windows 动态库。

为了构建这个库,我静态链接到提供 API 的其他 2 个库,并且我有一个 .def 文件,我在其中编写了我想在我的库中导出的唯一符号。

问题是 GCC 正在导出所有符号,包括我链接到的库中的符号。有没有办法告诉链接器只导出 def 文件中的符号?

我知道有选项 --export-all-symbols 但似乎没有相反的选项。

现在构建脚本的最后一行具有这样的结构:

g++ -shared CXXFLAGS DEFINES INCLUDES -o library.dll library.cpp DEF_FILE \
OBJECT_FILES LIBS -Wl,--enable-stdcall-fixup

编辑:在 docs关于链接器,它说 --export-all-symbols 是默认行为,如果您提供 def 文件,当您不明确使用该选项时,它会被禁用,除非它没有;无论如何,第 3 方库中的符号正在被导出。

编辑:添加选项 --exclude-libs LIBS--exclude-symbols SYMBOLS 不会阻止库中的符号被导出。

最佳答案

不知道为什么没有真正的答案,但这对我有用:

  1. 目标文件的编译:

    g++ -O0 -gdwarf-4 dll\dllmain.cpp -c -o dllmain.o
  2. 链接(-Wl,--exclude-all-symbols 很重要):

    g++ -Wl,--enable-auto-import -Wl,--out-implib,libsomelib.a -Wl,--exclude-all-symbols -shared dllmain.o -o somelib.dll

然后你选择在你的 DLL 源代码中直接导出哪些函数:

#include <windows.h>

__declspec(dllexport) void someExportedFunction() {
MessageBox(NULL, "msgbox", "msgbox", MB_OK);
}

void nonExportedFunction() {
MessageBox(NULL, "notexported", "notexported", MB_OK);
}

验证:

C:\libtest>pedump -E somelib.dll

=== EXPORTS ===

# module "somelib.dll"
# flags=0x0 ts="2014-02-20 08:37:48" version=0.0 ord_base=1
# nFuncs=1 nNames=1

ORD ENTRY_VA NAME
1 1570 _Z20someExportedFunctionv

(pedump = http://pedump.me )

关于c++ - 如何告诉 MinGW 链接器不要导出所有符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2810118/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com