|
Sources Bugzilla – Full Text Bug Listing |
| Summary: | ld --gc-sections should work for PE-COFF on MinGW | ||
|---|---|---|---|
| Product: | binutils | Reporter: | Andrea Gray <andrea.e.gray> |
| Component: | ld | Assignee: | unassigned |
| Status: | NEW --- | ||
| Severity: | normal | CC: | bug-binutils, gillou.ray, hjl.tools, ktietz70, nickc, patrick.hanevold, realnc, vanboxem.ruben, xunxun1982 |
| Priority: | P2 | ||
| Version: | unspecified | ||
| Target Milestone: | --- | ||
| Host: | *-*-mingw32 | Target: | *-*-mingw32 |
| Build: | Last reconfirmed: | ||
| Attachments: |
implement --gc-sections for coff (first shot)
Add KEEPs to the linker script template |
||
|
Description
Andrea Gray
2010-04-26 04:36:01 UTC
Created attachment 5301 [details]
implement --gc-sections for coff (first shot)
- Mostly a copy and paste from elflink.c to cofflink.c
- This is only a first try; however, it reduces the size of a statically compiled wxWidgets app from 5.1 MB to 3.8 MB, so it does something useful for me; YMMV
- I’m by far no COFF export; some linker guru will need to review the patch and comment on all the "FIXME" comments
- I have not yet tried to generate a DLL with gc enabled
- Somehow the entry symbol does not get into _bfd_coff_gc_keep so no gc mark root is available; as a workaround, "-Wl,--undefined=_WinMainCRTStartup" should be used
I changed the Host/Target/Build to include x86_64 and removed the Build specification, because it's not relevant. This is very useful. A static Qt binary gets from 12MB to 8MB with this. I found problem with the patch: it will remove the .rsrc section too. This section should be kept, as it contains the application icon, version information, etc. Created attachment 5960 [details]
Add KEEPs to the linker script template
Very nice. The patch saves me from some boring works splitting source files per function.
- entry symbol
I think "-Wl,-e" works and is better than "-Wl,--undefined" in this case.
For PE-COFF targets, the default entry symbol is used according to the subsystem,
unless explicitly specified by a command-line or a linker script.
And the code setting the gc root (search gc_sym_list in ldlang.c) ignores the linker's default.
MinGW-GCC's default specs file gives -e option to the linker only if the
generating file is a DLL, so for now the linker's default is used for EXE
unless you specify the explicit one.
I don't know whether ignoring the default entry symbol makes sense.
Anyway the current manual says --gc-sections requires -Wl,-e or -Wl,-u
or using KEEPs in a linker script to keep sections.
- .rsrc section
Default linker scripts(generated from pe.sc) lack KEEP commands.
The attached patch may fix it.
It seems to dll build can't use the patches, even if using -Wl,--undefined=_DllMainCRTStartup. Though the dll is generated successfully, we can't use other exes to link the dll (running the exe can't show anything). How do we make the patches generate the dll correctly? I try to keep eh_frame section, then the dll build can work (I test it in wxWidgets 2.8.12 Release Mono Unicode Dll). So we should find some methods to keep some sections of eh_frame. test |