Joachim Ante
Joachim Ante

Reputation: 81

Finding static initializers and destructors in C++

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?

Upvotes: 8

Views: 341

Answers (2)

user541686
user541686

Reputation: 210573

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.

Upvotes: 0

justin
justin

Reputation: 104698

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.

Upvotes: 3

Related Questions