mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/EFI: correct symbol table generation with older GNU ld
See the extensive code comment. This isn't really nice, but unless I'm overlooking something there doesn't look to be a way to have the linker strip individual symbols while doing its work. Fixes:bf6501a62e("x86-64: EFI boot code") Reported-by: Roger Pau Monné <roger.pau@citrix.com> Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Daniel P. Smith <dpsmith@apertussolutions.com> master commit:45bb278934master date: 2026-02-02 09:03:05 +0100
This commit is contained in:
1 parent
991f480a8f
commit
7f9cde0f97
1 file changed
+19
@@ -346,6 +346,25 @@ SECTIONS
|
||||
*(.reloc)
|
||||
__base_relocs_end = .;
|
||||
}
|
||||
|
||||
/*
|
||||
* When efi/relocs-dummy.o is linked into the first-pass binary, the two
|
||||
* symbols supplied by it (for ./Makefile to use) may appear in the symbol
|
||||
* table (GNU ld 2.37 and newer strip them, for not being properly
|
||||
* representable). No such symbols would appear during subsequent passes.
|
||||
* At least some of those older ld versions emit VIRT_START as absolute, but
|
||||
* ALT_START as if it was part of .text. The symbols tool generating our
|
||||
* own symbol table would hence not ignore it when passed --all-symbols,
|
||||
* leading to the 2nd pass binary having one more symbol than the final (3rd
|
||||
* pass) one.
|
||||
*
|
||||
* Arrange for both (just in case) symbols to always be there, and to always
|
||||
* be absolute (zero).
|
||||
*/
|
||||
PROVIDE(VIRT_START = 0);
|
||||
PROVIDE(ALT_START = 0);
|
||||
VIRT_START &= 0;
|
||||
ALT_START &= 0;
|
||||
#elif defined(XEN_BUILD_EFI)
|
||||
/*
|
||||
* Due to the way EFI support is currently implemented, these two symbols
|
||||
|
||||