The MASM Forum Archive 2004 to 2012

General Forums => The Workshop => Topic started by: Gustav on March 11, 2006, 11:13:50 AM

Title: removing .debug$S sections from object files created by MASM
Post by: Gustav on March 11, 2006, 11:13:50 AM

Hello,

has anyone already written such a tool which removes the ".debug$S" section from object files created by MASM 6.15/7.00? This absolutely useless section is added by MASM in any case, not just when option "-Zi" has been added in the command line. It bloats object libraries with many small modules included.

Title: Re: removing .debug$S sections from object files created by MASM
Post by: Vortex on March 11, 2006, 08:10:19 PM
What's the percentage of the bloating code?
Title: Re: removing .debug$S sections from object files created by MASM
Post by: Gustav on March 11, 2006, 09:38:37 PM

that depends how big the module would be without the .debug$S section. For a library with very small modules (average size 100 bytes) the bloat is almost 100%, size doubles.
Title: Re: removing .debug$S sections from object files created by MASM
Post by: MichaelW on March 11, 2006, 10:24:25 PM
Testing using one of my source files, the object modules were 7557 bytes for ML 6.14, 7695 bytes for ML 6.15, and 7743 bytes for ML 7.00. The 7.00 output was 186 bytes larger than the 6.14 output, but the 7.00 .debug$ section appeared to be only 40 bytes long (mostly zeros), followed by a .drectve section that was also present in the 6.14 output.

Title: Re: removing .debug$S sections from object files created by MASM
Post by: Gustav on March 12, 2006, 12:18:05 AM

Here's the output of a very small MASM test program, assembled with masm 7.0:

dumped with open watcom wdis:

----------------------------------------------------------------------------------------

            .new_section .text, "crx2"
0000                          _main:
0000    16                        push        ss
0001    1F                        pop         ds
0002    B4 09                     mov         ah,0x09
0004    BA 00 00 00 00            mov         edx,str1
0009    CD 21                     int         0x21
000B    66 B8 00 4C               mov         ax,0x4c00
000F    CD 21                     int         0x21

Routine Size: 17 bytes,    Routine Base: .text + 0000

No disassembly errors

            .new_section .data, "drw2"

            .new_section STACK, "drw2"

            .new_section .rdata, "dr2"
0000                          str1:
0000    0D 0A 48 65 6C 6C 6F 2C 20 77 6F 72 6C 64 21 0D ..Hello, world!.
0010    0A 24                                           .$

            .new_section .debug$S, "dnr0"
0000    04 00 00 00 F1 00 00 00 00 00 00 00 16 00 01 11 ................
0010    00 00 00 00 43 3A 5C 54 45 4D 50 32 5C 74 32 2E ....C:\TEMP2\t2.
0020    6F 62 6A 00 34 00 16 11 03 02 00 00 03 00 00 00 obj.4...........
0030    00 00 00 00 07 00 00 00 FA 24 4D 69 63 72 6F 73 .........$Micros
0040    6F 66 74 20 28 52 29 20 4D 61 63 72 6F 20 41 73 oft (R) Macro As
0050    73 65 6D 62 6C 65 72 00 00 00                   sembler...

            .new_section .drectve, "iR4"
0000    2D 65 6E 74 72 79 3A 6D 61 69 6E 20             -entry:main

------------------------------------------------------------------------------------------------------------

the content of the debug section is 5Ah + string ".debug$S" + 4, that's still about 100 bytes/module

Masm 6.15 is almost the same in size.

Title: Re: removing .debug$S sections from object files created by MASM
Post by: zcoder on March 12, 2006, 04:03:37 AM
I am running MASM 6.15 And I wrote a program
just to display the SECTION data area in a small
normal app I found only these .text .rdata .data .rsrc

And when I test it on other apps that I know have more sections
is shows those too.

but I never seen .debug$S or anything like that
until I used the /Zi when assembling.

So I am not sure what you mean.

Zcoder....
Title: Re: removing .debug$S sections from object files created by MASM
Post by: Gustav on March 12, 2006, 06:38:39 AM

> So I am not sure what you mean.

We are talking about COFF *object* modules, not COFF PE binaries. The .debug$S section is not marked as "removeable" though, so I don't know why it is not part of the final binary.

Gustav

Title: Re: removing .debug$S sections from object files created by MASM
Post by: zcoder on March 12, 2006, 07:50:16 AM
Oh, ok, well I don't think there is away to stop it
I looked at the options and switches there is none
that would appear to stop this action.

I think it is auto, like the way it adds the path
to where the source file was at the time the obj
was created.

I am not sure but it just maybe there for when you
ever link to them and in the main obj of your app
you set it for using debug.

Zcoder....
Title: Re: removing .debug$S sections from object files created by MASM
Post by: Vortex on March 12, 2006, 08:04:13 AM
Pelle's macro assembler Poasm doesn't create sections with a name like .debug$S
Title: Re: removing .debug$S sections from object files created by MASM
Post by: MichaelW on March 12, 2006, 08:10:41 AM
Taking a closer look, it is the IMAGE_SECTION_HEADER that is 40 bytes in length. Using this source:

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    include \masm32\include\masm32rt.inc
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    .data
    .code
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
start:
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    inkey "Press any key to exit..."
    exit
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
end start

For the object module produced by ML 7.00, the IMAGE_SECTION_HEADER for the .debug$S section occupies 40 bytes, the raw data for the section 112 bytes, and the two symbol table entries for the section 36 bytes, for a total of 188 bytes. The ML 7.00 object module is 1165 bytes, exactly 188 bytes more than the ML 6.14 object module at 977 bytes.

Looking at the structure of the file I think a tool to remove the section header, raw data, and symbol table entries would not be too difficult.

BTW for the .debug$S section, for IMAGE_SECTION_HEADER.Characteristics, the IMAGE_SCN_MEM_DISCARDABLE bit is set.

Title: Re: removing .debug$S sections from object files created by MASM
Post by: Gustav on March 12, 2006, 05:49:44 PM
> BTW for the .debug$S section, for IMAGE_SECTION_HEADER.Characteristics, the
> IMAGE_SCN_MEM_DISCARDABLE bit is set.

isn't this bit intended for the program loader, but not for the linker?

Title: Re: removing .debug$S sections from object files created by MASM
Post by: MichaelW on March 12, 2006, 09:24:32 PM
Quoteisn't this bit intended for the program loader, but not for the linker?

According to  this (http://www.windowsitlibrary.com/Content/356/11/6.html), yes.

I was essentially guessing from the MSDN information  here (http://msdn.microsoft.com/library/?url=/library/en-us/debug/base/image_section_header_str.asp) that IMAGE_SCN_MEM_DISCARDABLE was directing the linker to skip the section, because the more likely IMAGE_SCN_LNK_REMOVE is for some reason missing.

Title: Re: removing .debug$S sections from object files created by MASM
Post by: Mincho Georgiev on March 12, 2006, 11:14:03 PM
Wow, What a wonderful site, that i didn't knew about, 10x  :U
Title: Re: removing .debug$S sections from object files created by MASM
Post by: Gustav on March 13, 2006, 12:29:31 PM
> Looking at the structure of the file I think a tool to remove the section header, raw data, and symbol table entries > would not be too difficult.

Yes, one would think so. After a second look it's a bit more complicated, at least if one wants to delete the symbol table entries. That's because a section can contain relocation infos, and these entries may refer to entries in the symbol table , so they have to be adjusted as well ........

Title: Re: removing .debug$S sections from object files created by MASM
Post by: Gustav on March 14, 2006, 10:28:12 AM

Here's a solution. It's a quick hack, added to a public domain coff file viewer, and I don't know if it works for any kind of coff object modules. For MASM 6.15 it seems to work, though, and that's what I needed.

the .debug$S section is deleted, but the name of the symbol in the symbol table remains. Deleting this entry as well would have been far too much effort, but at least it's type is changed to a debug symbol.

It's the binary only!


[attachment deleted by admin]