mirror of https://github.com/ipxe/ipxe.git
[efi] Fix .efi and .efidrv linking
The linker chooses to look for _start first and always picks efidrvprefix.o to satisfy it (probably because it's earlier in the archive) which causes a multiple definition error when the linker later has to pick efiprefix.o for other symbols. Fix by using EFI-specific TGT_LD_FLAGS with an explicit entry point. Signed-off-by: Piotr Jaroszyński <p.jaroszynski@gmail.com> Signed-off-by: Joshua Oreman <oremanj@rwcr.net> Modified-by: Michael Brown <mcb30@ipxe.org> Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/1/head
parent
7c6d3752c9
commit
c68839d4d6
|
@ -612,7 +612,8 @@ TGT_LD_IDS = pci_vendor_id=$(firstword $(TGT_PCI_VENDOR) 0) \
|
||||||
#
|
#
|
||||||
TGT_LD_FLAGS = $(foreach SYM,$(TGT_LD_PREFIX) $(TGT_LD_DRIVERS) obj_config,\
|
TGT_LD_FLAGS = $(foreach SYM,$(TGT_LD_PREFIX) $(TGT_LD_DRIVERS) obj_config,\
|
||||||
-u $(SYM) --defsym check_$(SYM)=$(SYM) ) \
|
-u $(SYM) --defsym check_$(SYM)=$(SYM) ) \
|
||||||
$(patsubst %,--defsym %,$(TGT_LD_IDS))
|
$(patsubst %,--defsym %,$(TGT_LD_IDS)) \
|
||||||
|
$(TGT_LD_FLAGS_PRE)
|
||||||
|
|
||||||
# Calculate list of debugging versions of objects to be included in
|
# Calculate list of debugging versions of objects to be included in
|
||||||
# the target.
|
# the target.
|
||||||
|
|
|
@ -13,6 +13,10 @@ LDFLAGS += -q -S
|
||||||
NON_AUTO_MEDIA += efi
|
NON_AUTO_MEDIA += efi
|
||||||
NON_AUTO_MEDIA += efidrv
|
NON_AUTO_MEDIA += efidrv
|
||||||
|
|
||||||
|
# Specify entry point
|
||||||
|
#
|
||||||
|
TGT_LD_FLAGS_PRE = -e _$(TGT_PREFIX)_start
|
||||||
|
|
||||||
# Rules for building EFI files
|
# Rules for building EFI files
|
||||||
#
|
#
|
||||||
$(BIN)/%.efi : $(BIN)/%.efi.tmp $(ELF2EFI)
|
$(BIN)/%.efi : $(BIN)/%.efi.tmp $(ELF2EFI)
|
||||||
|
|
|
@ -29,7 +29,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||||
* @v systab System table
|
* @v systab System table
|
||||||
* @ret efirc EFI return status code
|
* @ret efirc EFI return status code
|
||||||
*/
|
*/
|
||||||
EFI_STATUS EFIAPI _start ( EFI_HANDLE image_handle,
|
EFI_STATUS EFIAPI _efidrv_start ( EFI_HANDLE image_handle,
|
||||||
EFI_SYSTEM_TABLE *systab ) {
|
EFI_SYSTEM_TABLE *systab ) {
|
||||||
EFI_STATUS efirc;
|
EFI_STATUS efirc;
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||||
* @v systab System table
|
* @v systab System table
|
||||||
* @ret efirc EFI return status code
|
* @ret efirc EFI return status code
|
||||||
*/
|
*/
|
||||||
EFI_STATUS EFIAPI _start ( EFI_HANDLE image_handle,
|
EFI_STATUS EFIAPI _efi_start ( EFI_HANDLE image_handle,
|
||||||
EFI_SYSTEM_TABLE *systab ) {
|
EFI_SYSTEM_TABLE *systab ) {
|
||||||
EFI_STATUS efirc;
|
EFI_STATUS efirc;
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,6 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ENTRY ( _start )
|
|
||||||
|
|
||||||
SECTIONS {
|
SECTIONS {
|
||||||
|
|
||||||
/* The file starts at a virtual address of zero, and sections are
|
/* The file starts at a virtual address of zero, and sections are
|
||||||
|
|
Loading…
Reference in New Issue