gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:12:39 28 4
gpt4 key购买 nike

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

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

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

最佳答案

如果您安装Mingw GCC端口之一,例如mingw-w64
然后您还将获得Windows PE二进制文件的binutils的端口,并且可以使用
熟悉的objcopy --keep-global-symbol

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

您可能在这里有一个XY problem
因为链接器将解析输入序列中第一个库中的符号
定义它并忽略以后的库中的定义;这样您就可以
只需通过在静态链接之前将其链接即可优先选择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.dll函数。 bar仅在 static.lib中定义。 gum仅在 dynamic.dll中定义

这是一个调用 foobargum的程序源:

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

因此 foostatic.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.dll,并从 static.lib解析了定义
被忽略了。

关于windows - 在Windows上从目标文件中删除符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52759479/

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