From c68839d4d69742ac21c430aca8a9a4de81dd6ca5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Piotr=20Jaroszy=C5=84ski?=
Date: Tue, 30 Mar 2010 18:18:43 +0200
Subject: [PATCH] [efi] Fix .efi and .efidrv linking
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
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
Signed-off-by: Joshua Oreman
Modified-by: Michael Brown
Signed-off-by: Michael Brown
---
src/Makefile.housekeeping | 3 ++-
src/arch/x86/Makefile.efi | 4 ++++
src/arch/x86/prefix/efidrvprefix.c | 4 ++--
src/arch/x86/prefix/efiprefix.c | 4 ++--
src/arch/x86/scripts/efi.lds | 2 --
5 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/src/Makefile.housekeeping b/src/Makefile.housekeeping
index 81396724..fbb274ff 100644
--- a/src/Makefile.housekeeping
+++ b/src/Makefile.housekeeping
@@ -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 list of debugging versions of objects to be included in
# the target.
diff --git a/src/arch/x86/Makefile.efi b/src/arch/x86/Makefile.efi
index bef8d59d..4f0c1b24 100644
--- a/src/arch/x86/Makefile.efi
+++ b/src/arch/x86/Makefile.efi
@@ -13,6 +13,10 @@ LDFLAGS += -q -S
NON_AUTO_MEDIA += efi
NON_AUTO_MEDIA += efidrv
+# Specify entry point
+#
+TGT_LD_FLAGS_PRE = -e _$(TGT_PREFIX)_start
+
# Rules for building EFI files
#
$(BIN)/%.efi : $(BIN)/%.efi.tmp $(ELF2EFI)
diff --git a/src/arch/x86/prefix/efidrvprefix.c b/src/arch/x86/prefix/efidrvprefix.c
index 1de08a37..2215104b 100644
--- a/src/arch/x86/prefix/efidrvprefix.c
+++ b/src/arch/x86/prefix/efidrvprefix.c
@@ -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 */
diff --git a/src/arch/x86/prefix/efiprefix.c b/src/arch/x86/prefix/efiprefix.c
index 61a9fc64..1515c6fc 100644
--- a/src/arch/x86/prefix/efiprefix.c
+++ b/src/arch/x86/prefix/efiprefix.c
@@ -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 */
diff --git a/src/arch/x86/scripts/efi.lds b/src/arch/x86/scripts/efi.lds
index 7525b81b..4368f732 100644
--- a/src/arch/x86/scripts/efi.lds
+++ b/src/arch/x86/scripts/efi.lds
@@ -5,8 +5,6 @@
*
*/
-ENTRY ( _start )
-
SECTIONS {
/* The file starts at a virtual address of zero, and sections are