在 C++ 中查找静态初始化器和析构器

发布于 2024-10-16 00:11:32 字数 202 浏览 8 评论 0原文

我的程序有太多静态初始化程序和析构函数。我想摆脱他们所有人。所以我需要一种方法来找到他们。

在可执行文件上运行 nm 会得到如下结果: 0004bfc0 t _Z41_static_initialization_and_destruction_0ii

有没有一种好方法可以从包含 static_initializers 的位置获取文件列表?

I have a program with way too many static initializers and destructors. I want to get rid of all of them. So i need a way to find them.

Running nm on the executable gives something like this:
0004bfc0 t _Z41_static_initialization_and_destruction_0ii

Is there a good way to get a list of files from where static_initializers are being included?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

横笛休吹塞上声 2024-10-23 00:11:32

您可以在目标文件上运行 nm,该文件随后链接到最终的可执行文件中。或者创建一个脚本来为您解析 nm 的输出(如果您有很多事情要做)。

根据数据的定义,您可能还会发现有重复项,这些重复项可以减少为一个对象。

you could run nm on an object file which is later linked into the final executable. or create a script to parse nm's output for you if you've a lot to go through.

depending on the definitions of the data, you may also find you have duplicates which could be reduced to one object.

女中豪杰 2024-10-23 00:11:32

如果您在 Windows 上使用 Microsoft Visual C++ 的 PDB 文件格式,则可以使用此脚本:

llvm-pdbutil dump --globals file.pdb | awk '/addr = / { if (sym) { off = $0; sub(/.*addr = [0-9]*:/, "", off); syms[sym] = +off; inv[+off] = sym; } } { sym = ""; } /`.*`/ { sym = $0; sub(/`[ \t]*$/, "", sym); sub(/.*`/, "", sym); } END { for (k in inv) { if (syms["__xc_a"] < +k && +k < syms["__xc_z"]) { print(inv[k]); } } }'

它将打印所有 C++ 初始值设定项。

或者,如果您在 Visual Studio 中,则可以观看此表达式:

__xc_a+1,[__xc_z - __xc_a - 1]

当您展开数组时,它将列出所有 C++ 初始值设定项。

If you're using Microsoft Visual C++'s PDB file format on Windows, you can use this script:

llvm-pdbutil dump --globals file.pdb | awk '/addr = / { if (sym) { off = $0; sub(/.*addr = [0-9]*:/, "", off); syms[sym] = +off; inv[+off] = sym; } } { sym = ""; } /`.*`/ { sym = $0; sub(/`[ \t]*$/, "", sym); sub(/.*`/, "", sym); } END { for (k in inv) { if (syms["__xc_a"] < +k && +k < syms["__xc_z"]) { print(inv[k]); } } }'

It will print all C++ initializers.

Alternatively, if you're inside Visual Studio, you can Watch this expression:

__xc_a+1,[__xc_z - __xc_a - 1]

It will list all C++ initializers when you expand the array.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文