20

Is there a way—much like viewing the result of preprocessing with gcc -E—to see what my objects look like once compiled into object files?

I am talking about GCC, but a solution including MSVC would be fine.

user257620
  • 223
  • 2
  • 5
  • Good point John. The constructor will be code, and like all code belongs to the class, not individual objects. Hence you won't find it in the object layout. – MSalters Jan 26 '10 at 11:20
  • 1
    You can use `g++ -S file.cpp` to get assembler output in `file.s`. Is this what you want? – clstrfsck Jan 26 '10 at 11:23

7 Answers7

31

For Visual C++:

I finally managed to dig up the (well-hidden!) undocumented compiler flags that MSVC++ supports using information from here and here. Here they are:

/d1reportSingleClassLayoutXXX
/d1reportAllClassLayout

(replace XXX with the class name)

Sahil Singh
  • 3,352
  • 39
  • 62
j_random_hacker
  • 50,331
  • 10
  • 105
  • 169
  • 1
    Note for others who may land into this quest: This switch will output directly to build output window. So add it in .cpp properties 'Command Line > Additional options'. If your desired class/struct did not show up in the list (despite it is declared in header file), I declared a new class in cpp and make it inherit from that class, that did the job for me. – Wappenull Sep 27 '19 at 10:03
7

For GCC compiled executables, checkout Pahole. It will show you how the compiler laid out your structs/classes and whether or not they have "holes" in them. Holes are padding due to memory alignment rules.

oz10
  • 153,307
  • 27
  • 93
  • 128
0

Object files contain binary data - the only higher level that most compilers can output is assembler, so if you can't read that you are out of luck. However, take a look at this question for more info in this area.

Community
  • 1
  • 1
0

You can inspect the layout of binaries and their contents using map files. Use /MAP for VC and -Map or --print-map for gcc.

Georg Fritzsche
  • 97,545
  • 26
  • 194
  • 236
0

Your question is a little confusing.

If you want to see the result of preprocessing with MSVC, you can use /E, /P/, or /EP.

There's an undocumented option in MSVC to show the data layout of structures and classes. I'm having trouble finding it right now.

Adrian McCarthy
  • 45,555
  • 16
  • 123
  • 175
  • >There's an undocumented option in MSVC to show the data layout of structures and classes. I'm having trouble finding it right now. this is exactly what i am looking for! – user257620 Jan 27 '10 at 16:39
  • 2
    I finally managed to dig up those switches: `/d1reportSingleClassLayoutXXX` and `/d1reportAllClassLayout`. – j_random_hacker May 25 '10 at 05:12
0

A constructor is just another function (unless it's in-lined). Object files contain a lot of info for the linker; so you should be able to find the function in the .a file (the function names will be mangled though).

Hassan Syed
  • 20,075
  • 11
  • 87
  • 171
0

If you are asking about seeing the memory layout of an object's field (as other answers seems to hint) then there is a visual studio extension that does just that: Struct Layout by Ramon Viladomat (also available via Github)

This will add a contextual item when you right click on a struct definition, that will open a memory layout visualizer window.

The display looks like this:

enter image description here

It has it's quirks, and I've been struggling to set it up correctly on some large projects, but when it works it's extremely useful.

There is also an open feature request ticket on the MS developer community forums to add the feature to the editor by default. Please upvote it if you want that to get traction.