x86: fold sections in final binaries

Especially when linking a PE binary (xen.efi), standalone output
sections are expensive: Often the linker will align the subsequent one
on the section alignment boundary (2Mb) when the linker script doesn't
otherwise place it. (I haven't been able to derive from observed
behavior under what conditions it would not do so.)

With gcov enabled (and with gcc11) I'm observing enough sections that,
as of quite recently, the resulting image doesn't fit in 16Mb anymore,
failing the final ASSERT() in the linker script. (That assertion is
slated to go away, but that's a separate change.)

Any destructor related sections can be discarded, as we never "exit"
the hypervisor. This includes .text.exit, which is referenced from
.dtors.*. Constructor related sections need to all be taken care of, not
just those with historically used names: .ctors.* and .text.startup is
what gcc11 populates. While there re-arrange ordering / sorting to match
that used by the linker provided scripts.

Finally, for xen.efi only, also discard .note.gnu.*. These are
meaningless in a PE binary. Quite likely, while not meaningless there,
the section is also of no use in ELF, but keep it there for now.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
This commit is contained in:
Jan Beulich committed 2022-03-02 09:29:55 +01:00
1 parent 97b80c7881
commit 4b7fd8153d
1 file changed
+8 -2
+8 -2
View File
@@ -194,6 +194,7 @@ SECTIONS
#endif
_sinittext = .;
*(.init.text)
*(.text.startup)
_einittext = .;
/*
* Here are the replacement instructions. The linker sticks them
@@ -258,9 +259,10 @@ SECTIONS
. = ALIGN(8);
__ctors_start = .;
*(.ctors)
*(SORT_BY_INIT_PRIORITY(.init_array.*))
*(SORT_BY_INIT_PRIORITY(.ctors.*))
*(.init_array)
*(SORT(.init_array.*))
*(.ctors)
__ctors_end = .;
} PHDR(text)
@@ -404,16 +406,20 @@ SECTIONS
/* Sections to be discarded */
/DISCARD/ : {
*(.text.exit)
*(.exit.text)
*(.exit.data)
*(.exitcall.exit)
*(.discard)
*(.discard.*)
*(.eh_frame)
*(.dtors)
*(.dtors.*)
#ifdef EFI
*(.comment)
*(.comment.*)
*(.note.Xen)
*(.note.gnu.*)
#endif
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.