Commit 14c47b54 authored by Mikulas Patocka's avatar Mikulas Patocka Committed by Ingo Molnar

objtool: Fix 64-bit build on 32-bit host

The new ORC unwinder breaks the build of a 64-bit kernel on a 32-bit
host.  Building the kernel on a i386 or x32 host fails with:

  orc_dump.c: In function 'orc_dump':
  orc_dump.c:105:26: error: passing argument 2 of 'elf_getshdrnum' from incompatible pointer type [-Werror=incompatible-pointer-types]
    if (elf_getshdrnum(elf, &nr_sections)) {
  In file included from /usr/local/include/gelf.h:32:0,
                   from elf.h:22,
                   from warn.h:26,
                   from orc_dump.c:20:
  /usr/local/include/libelf.h:304:12: note: expected 'size_t * {aka unsigned int *}' but argument is of type 'long unsigned int *'
   extern int elf_getshdrnum (Elf *__elf, size_t *__dst);
  orc_dump.c:190:17: error: format '%lx' expects argument of type 'long unsigned int', but argument 3 has type 'Elf64_Sxword {aka long long int}' [-Werror=format=]
      printf("%s+%lx:", name, rela.r_addend);
                 ~~^          ~~~~~~~~~~~~~

Fix the build failure.

Another problem is that if the user specifies HOSTCC or HOSTLD
variables, they are ignored in the objtool makefile.  Change the
Makefile to respect these variables.
Signed-off-by: default avatarMikulas Patocka <>
Signed-off-by: default avatarJosh Poimboeuf <>
Cc: Linus Torvalds <>
Cc: Peter Zijlstra <>
Cc: Sven Joachim <>
Cc: Thomas Gleixner <>
Fixes: 627fce14 ("objtool: Add ORC unwind table generation")
Link: default avatarIngo Molnar <>
parent 5b1ead68
......@@ -7,9 +7,11 @@ ARCH := x86
# always use the host compiler
CC = gcc
LD = ld
AR = ar
HOSTCC ?= gcc
HOSTLD ?= ld
AR = ar
ifeq ($(srctree),)
srctree := $(patsubst %/,%,$(dir $(CURDIR)))
......@@ -76,7 +76,8 @@ int orc_dump(const char *_objname)
int fd, nr_entries, i, *orc_ip = NULL, orc_size = 0;
struct orc_entry *orc = NULL;
char *name;
unsigned long nr_sections, orc_ip_addr = 0;
size_t nr_sections;
Elf64_Addr orc_ip_addr = 0;
size_t shstrtab_idx;
Elf *elf;
Elf_Scn *scn;
......@@ -187,10 +188,10 @@ int orc_dump(const char *_objname)
return -1;
printf("%s+%lx:", name, rela.r_addend);
printf("%s+%llx:", name, (unsigned long long)rela.r_addend);
} else {
printf("%lx:", orc_ip_addr + (i * sizeof(int)) + orc_ip[i]);
printf("%llx:", (unsigned long long)(orc_ip_addr + (i * sizeof(int)) + orc_ip[i]));
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment