在Windows上从目标文件中删除符号

伊戈尔

有什么方法可以删除(或本地化)目标文件中的符号?我正在寻找类似objcopy --keep-global-symbollinux的东西

也许有一种方法可以告诉链接器哪些符号应该隐藏?我找到了此页面:https : //msdn.microsoft.com/zh-cn/library/28d6s79h.aspx描述了.Def文件,我从阅读中得到的印象是,我不仅可以将这些文件用于dll,而且可以用于静态文件。库。这是真的?

我需要这样做,因为我链接了两个库A和B,它们输出相同的符号。A是动态链接的,而B是静态链接的。如果A和BI都导出了符号,则我的应用程序希望使用A中的符号,而且我想使用B中的某些符号(仅在B中)。

迈克·金汉

如果安装Mingw GCC端口之一,例如mingw-w64,则还将获得binutilsWindows PE二进制文件的端口,并且可以使用familar objcopy --keep-global-symbol

bin您选择的安装目录中找到它,例如C:\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev0\mingw64\bin

然而...

您可能在这里有一个XY问题,因为链接器将从输入序列中第一个定义符号的库中解析出一个符号,而忽略后面库中的定义。因此,仅通过在静态库之前进行链接,您就可以优先选择DLL中的定义。插图:

foo_static.c

#include <stdio.h>

void foo(void)
{
    puts("foo_static");
}

bar_static.c

#include <stdio.h>

void bar(void)
{
    puts("bar_static");
}

foo_dynamic.c

#include <stdio.h>

__declspec(dllexport) void foo(void)
{
    puts("foo_dynamic");
}

gum_dynamic.c

#include <stdio.h>

__declspec(dllexport) void gum(void)
{
    puts("gum_dynamic");
}

编译*_static.c源文件并将目标文件归档在静态库中static.lib

>cl -c *_static.c
Microsoft (R) C/C++ Optimizing Compiler Version 19.11.25547 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

bar_static.c
foo_static.c
Generating Code...

>lib -out:static.lib *_static.obj
Microsoft (R) Library Manager Version 14.11.25547.0
Copyright (C) Microsoft Corporation.  All rights reserved.

编译*_dynamic.c源文件并将目标文件链接到DLL中dynamic.dll

>cl -c *_dynamic.c
Microsoft (R) C/C++ Optimizing Compiler Version 19.11.25547 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

foo_dynamic.c
gum_dynamic.c
Generating Code...

>link -dll -out:dynamic.dll *_dynamic.obj
Microsoft (R) Incremental Linker Version 14.11.25547.0
Copyright (C) Microsoft Corporation.  All rights reserved.

   Creating library dynamic.lib and object dynamic.exp

请注意,函数foostatic.lib和中定义(不同)dynamic.dllbar仅在中定义static.libgum仅在dynamic.dll

以下是节目源的呼叫foobar并且gum

main.c

extern void foo();
extern void bar();
extern void gum();

int main()
{
    foo();
    bar();
    gum();
    return 0;
}

我们编译:

>cl -c main.c
Microsoft (R) C/C++ Optimizing Compiler Version 19.11.25547 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

main.c

然后我们链接这样的程序prog

>link -out:prog.exe main.obj static.lib dynamic.lib
Microsoft (R) Incremental Linker Version 14.11.25547.0
Copyright (C) Microsoft Corporation.  All rights reserved.

static.lib第一次。程序输出:

>prog.exe
foo_static
bar_static
gum_dynamic

因此foo从处解决,static.lib从处的定义dynamic.dll被忽略。

现在,让我们以相反的顺序重新链接库,然后prog再次运行

>link -out:prog.exe main.obj dynamic.lib static.lib
Microsoft (R) Incremental Linker Version 14.11.25547.0
Copyright (C) Microsoft Corporation.  All rights reserved.


>prog.exe
foo_dynamic
bar_static
gum_dynamic

这次,foo从解析,dynamic.dllstatic.lib忽略的定义

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何查看目标文件中的符号?

Ant无法删除Windows上的某些文件

目标文件中未解析的外部符号

使用nm(1)列出OS X上为arm64构建的目标文件中的符号

究竟什么是目标文件中的符号引用?

如何在Gitlab CI脚本中删除符号链接的目标?

如何从给定文件C中删除“#”符号

如何复制和重命名目标文件中的符号?

从目标成员资格中删除文件后生成失败

如何从WebAssembly文件中删除调试符号

在COFF目标文件中检测C ++内联符号

R:插入符号中的upSample正在完全删除目标变量

如何从Linux文件中删除特定符号?

从z / OS上的C语言可执行文件中删除符号信息

我无法在Maven生成的Windows 7上删除“目标”文件夹

Rsync --delete选项不会删除目标目录中的文件

在Windows上从文件末尾添加/删除字节

在Windows 7中删除符号链接

从Windows上的lib文件中删除符号

在Windows 7中删除符号链接的字体

Eclipse上的Maven创建不可删除的目标文件夹

从文件外壳中删除“ /”符号

git checkout-<文件名>无法恢复Windows 10上本地删除的符号链接

如何在Windows中更改符号链接的目标

如何从詹金斯上的Maven目标文件夹中删除旧的子文件夹?

镜像时,Robocopy会删除目标中跳过的文件

在 Windows 中删除损坏的文件

防止在 macOS 上创建 ._ 文件,或从 macOS/Windows 中删除它们

NASM + GoLink:“目标文件中未定义以下符号”