Can't link crt0-efi-x86_64.o to create an EFI application

Bug #1664725 reported by Donald A. Dade

This bug report was converted into a question: question #473153: Can't link crt0-efi-x86_64.o to create an EFI application.

6
This bug affects 1 person
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://us.archive.ubuntu.com/ubuntu xenial/main amd64 Packages
        100 /var/lib/dpkg/status

$ make
ld -nostdlib -znocombreloc -T /usr/lib/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
ld: /usr/lib/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

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/crt0-efi-x86_64.o
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)
Revision history for this message
Donald A. Dade (donald-dade) wrote :

$ cat main.cpp
#include <efi.h>
#include <efilib.h>

EFI_STATUS
EFIAPI
efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
   InitializeLib(ImageHandle, SystemTable);
   Print(L"Hello, world!\n");

   return EFI_SUCCESS;
}

$ cat Makefile
ARCH = $(shell uname -m | sed s,i[3456789]86,ia32,)

OBJS = main.o
TARGET = hello.efi

EFIINC = /usr/include/efi
EFIINCS = -I$(EFIINC) -I$(EFIINC)/$(ARCH) -I$(EFIINC)/protocol
LIB = /usr/lib
EFILIB = /usr/lib
EFI_CRT_OBJS = $(EFILIB)/crt0-efi-$(ARCH).o
EFI_LDS = $(EFILIB)/elf_$(ARCH)_efi.lds

CXXFLAGS = $(EFIINCS) -fno-stack-protector -fpic \
                  -fshort-wchar -mno-red-zone -Wall
ifeq ($(ARCH),x86_64)
  CFLAGS += -DEFI_FUNCTION_WRAPPER
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
        objcopy -j .text -j .sdata -j .data -j .dynamic \
                -j .dynsym -j .rel -j .rela -j .reloc \
                --target=efi-app-$(ARCH) $^ $@

clean :
        rm -rf $(TARGET) $(OBJS)

realclean: clean

$ make
ld -nostdlib -znocombreloc -T /usr/lib/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
ld: /usr/lib/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: final link failed: Bad value
Makefile:25: recipe for target 'hello.so' failed
make: *** [hello.so] Error 1

Revision history for this message
Donald A. Dade (donald-dade) wrote :

Why does the library file crt0-efi-x86_64.o contain R_X86_64_PC32 relocation records, and not R_X86_64_PC64?

Changed in gnu-efi (Ubuntu):
status: New → Invalid
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Related questions

Remote bug watches

Bug watches keep track of this bug in other bug trackers.