[efi] Fix *.efi linking
authorPiotr Jaroszyński <p.jaroszynski@gmail.com>
Tue, 30 Mar 2010 16:18:43 +0000 (18:18 +0200)
committerJoshua Oreman <oremanj@rwcr.net>
Thu, 27 May 2010 01:38:41 +0000 (18:38 -0700)
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. Use EFI-specific
LD_FLAGS with more --defsym magic to work around that.

Signed-off-by: Piotr Jaroszyński <p.jaroszynski@gmail.com>
Signed-off-by: Joshua Oreman <oremanj@rwcr.net>
src/Makefile.housekeeping
src/arch/x86/Makefile.efi
src/arch/x86/prefix/efidrvprefix.c
src/arch/x86/prefix/efiprefix.c

index a573356..40bd878 100644 (file)
@@ -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,\
                    -u $(SYM) --defsym check_$(SYM)=$(SYM) ) \
-                 $(patsubst %,--defsym %,$(TGT_LD_IDS))
+                 $(patsubst %,--defsym %,$(TGT_LD_IDS)) \
+                 $(TGT_LD_FLAGS_PRE)
 
 # Calculate makerom flags for the specific target
 # (e.g. "bin/dfe538--prism2_pci.zrom.tmp") and derive the variables:
index bef8d59..8a5b559 100644 (file)
@@ -13,6 +13,9 @@ LDFLAGS               += -q -S
 NON_AUTO_MEDIA += efi
 NON_AUTO_MEDIA += efidrv
 
+# Extra LD FLAGS
+TGT_LD_FLAGS_PRE = --defsym _start=_$(TGT_PREFIX)_start
+
 # Rules for building EFI files
 #
 $(BIN)/%.efi : $(BIN)/%.efi.tmp $(ELF2EFI)
index 36d5650..b556120 100644 (file)
@@ -29,8 +29,8 @@ FILE_LICENCE ( GPL2_OR_LATER );
  * @v systab           System table
  * @ret efirc          EFI return status code
  */
-EFI_STATUS EFIAPI _start ( EFI_HANDLE image_handle,
-                          EFI_SYSTEM_TABLE *systab ) {
+EFI_STATUS EFIAPI _efidrv_start ( EFI_HANDLE image_handle,
+                                 EFI_SYSTEM_TABLE *systab ) {
        EFI_STATUS efirc;
 
        /* Initialise EFI environment */
index 4cc9e04..742c8b1 100644 (file)
@@ -28,8 +28,8 @@ FILE_LICENCE ( GPL2_OR_LATER );
  * @v systab           System table
  * @ret efirc          EFI return status code
  */
-EFI_STATUS EFIAPI _start ( EFI_HANDLE image_handle,
-                          EFI_SYSTEM_TABLE *systab ) {
+EFI_STATUS EFIAPI _efi_start ( EFI_HANDLE image_handle,
+                              EFI_SYSTEM_TABLE *systab ) {
        EFI_STATUS efirc;
 
        /* Initialise EFI environment */