丢弃 GCC 中未使用的函数
discard unused functions in GCC
我需要一些帮助在 MinGW 下使用 GCC 进行编译。
假设我有 2 个文件:
a.c 包含 2 个函数 a1 和 a2
b.c 包含 2 个函数 b1 和 b2。
然后我link将这2个对象放到一个共享库中。使用的命令如下:
gcc -c a.c
gcc -c b.c
gcc -shared -Wl, --version-script v.ver -Wl, -Map=out.map -Wl, --strip-all -o mydll.dll a.o b.o
v.ver 看起来像:
mylib {
global: a1;
a2;
local: *;
}
用于控制导出哪些函数
通过检查映射文件,我可以看到 b.c 中的 2 个函数也包含在 dll 的 .text 部分中。
因为这个 dll 只导出 a1 和 a2,而 b1 和 b2 只在 b.c 中定义,但从未在任何地方使用过。有没有我可以在 gcc 或 ld 中添加的选项,这样 b1 和 b2 就不会内置到 dll 中,这样我就可以在 dll 中保存一些 space?
谢谢
是的,这是可能的。为此,在将 C 源代码编译为对象时添加以下两个标志:
-ffunction-sections -fdata-sections
这将生成更大的目标文件,但会为链接器添加大量信息。调用链接器时添加以下标志:
--gc-sections
链接器现在将丢弃所有未使用的函数和部分。
另请参阅此问题:Query on -ffunction-section & -fdata-sections options of gcc 了解更多信息。
我需要一些帮助在 MinGW 下使用 GCC 进行编译。
假设我有 2 个文件: a.c 包含 2 个函数 a1 和 a2 b.c 包含 2 个函数 b1 和 b2。
然后我link将这2个对象放到一个共享库中。使用的命令如下:
gcc -c a.c
gcc -c b.c
gcc -shared -Wl, --version-script v.ver -Wl, -Map=out.map -Wl, --strip-all -o mydll.dll a.o b.o
v.ver 看起来像:
mylib {
global: a1;
a2;
local: *;
}
用于控制导出哪些函数
通过检查映射文件,我可以看到 b.c 中的 2 个函数也包含在 dll 的 .text 部分中。
因为这个 dll 只导出 a1 和 a2,而 b1 和 b2 只在 b.c 中定义,但从未在任何地方使用过。有没有我可以在 gcc 或 ld 中添加的选项,这样 b1 和 b2 就不会内置到 dll 中,这样我就可以在 dll 中保存一些 space?
谢谢
是的,这是可能的。为此,在将 C 源代码编译为对象时添加以下两个标志:
-ffunction-sections -fdata-sections
这将生成更大的目标文件,但会为链接器添加大量信息。调用链接器时添加以下标志:
--gc-sections
链接器现在将丢弃所有未使用的函数和部分。
另请参阅此问题:Query on -ffunction-section & -fdata-sections options of gcc 了解更多信息。