Can't link crt0-efi-x86_64.o to create an EFI application
This bug report was converted into a question: question #473153: Can't link crt0-efi-x86_64.o to create an EFI application.
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
gnu-efi (Ubuntu) |
Invalid
|
Undecided
|
Unassigned |
Bug Description
$ uname -a
Linux x6 4.4.0-59-generic #80-Ubuntu SMP Fri Jan 6 17:47:47 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
$ lsb_release -rd
Description: Ubuntu 16.04.2 LTS
Release: 16.04
$ apt-cache policy gnu-efi
gnu-efi:
Installed: 3.0.2-1ubuntu1
Candidate: 3.0.2-1ubuntu1
Version table:
*** 3.0.2-1ubuntu1 500
500 http://
100 /var/lib/
$ make
ld -nostdlib -znocombreloc -T /usr/lib/
ld: /usr/lib/
I expected the link to succeed, but it fails with the above error.
Sure enough, the object code has PC32 relocation records:
$ readelf -r /usr/lib/
Relocation section '.rela.text' at offset 0x238 contains 4 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000009 000900000002 R_X86_64_PC32 0000000000000000 ImageBase - 4
000000000010 000a00000002 R_X86_64_PC32 0000000000000000 _DYNAMIC - 4
000000000019 000b00000002 R_X86_64_PC32 0000000000000000 _relocate - 4
000000000020 000c00000002 R_X86_64_PC32 0000000000000000 efi_main - 4
Relocation section '.rela.reloc' at offset 0x298 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000000 000200000002 R_X86_64_PC32 0000000000000000 .data + 0
affects: | sbsigntool (Ubuntu) → gnu-efi (Ubuntu) |
$ cat main.cpp
#include <efi.h>
#include <efilib.h>
EFI_STATUS b(ImageHandle, SystemTable);
EFIAPI
efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
InitializeLi
Print(L"Hello, world!\n");
return EFI_SUCCESS;
}
$ cat Makefile 86,ia32, )
ARCH = $(shell uname -m | sed s,i[3456789]
OBJS = main.o
TARGET = hello.efi
EFIINC = /usr/include/efi /protocol /crt0-efi- $(ARCH) .o /elf_$( ARCH)_efi. lds
EFIINCS = -I$(EFIINC) -I$(EFIINC)/$(ARCH) -I$(EFIINC)
LIB = /usr/lib
EFILIB = /usr/lib
EFI_CRT_OBJS = $(EFILIB)
EFI_LDS = $(EFILIB)
CXXFLAGS = $(EFIINCS) -fno-stack- protector -fpic \
-fshort- wchar -mno-red-zone -Wall WRAPPER
ifeq ($(ARCH),x86_64)
CFLAGS += -DEFI_FUNCTION_
endif
LDFLAGS = -nostdlib -znocombreloc -T $(EFI_LDS) -shared \
-Bsymbolic -L $(EFILIB) -L $(LIB) $(EFI_CRT_OBJS)
all: $(TARGET)
hello.so: $(OBJS)
ld $(LDFLAGS) $(OBJS) -o $@ -lefi -lgnuefi
%.efi: %.so
--target= efi-app- $(ARCH) $^ $@
objcopy -j .text -j .sdata -j .data -j .dynamic \
-j .dynsym -j .rel -j .rela -j .reloc \
clean :
rm -rf $(TARGET) $(OBJS)
realclean: clean
$ make elf_x86_ 64_efi. lds -shared -Bsymbolic -L /usr/lib -L /usr/lib /usr/lib/ crt0-efi- x86_64. o main.o -o hello.so -lefi -lgnuefi crt0-efi- x86_64. o: relocation R_X86_64_PC32 against undefined symbol `efi_main' can not be used when making a shared object; recompile with -fPIC
ld -nostdlib -znocombreloc -T /usr/lib/
ld: /usr/lib/
ld: final link failed: Bad value
Makefile:25: recipe for target 'hello.so' failed
make: *** [hello.so] Error 1