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: 45bb278934
master date: 2026-02-02 09:03:05 +0100
This commit is contained in:
Jan Beulich committed 2026-02-11 12:21:47 +01:00
1 parent 991f480a8f
commit 7f9cde0f97
1 file changed
+19
+19
View File
@@ -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
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.