diff mbox series

[kvm-unit-tests] Makefile: do not use "libgcc" for clang

Message ID 20210309045250.3333311-1-morbo@google.com (mailing list archive)
State New, archived
Headers show
Series [kvm-unit-tests] Makefile: do not use "libgcc" for clang | expand

Commit Message

Bill Wendling March 9, 2021, 4:52 a.m. UTC
The -nostdlib flag disables the driver from adding libclang_rt.*.a
during linking. Adding a specific library to the command line then
causes the linker to report unresolved symbols, because the libraries
that resolve those symbols aren't automatically added. Turns out clang
doesn't need to specify that library.

Signed-off-by: Bill Wendling <morbo@google.com>
---
 Makefile            | 6 ++++++
 arm/Makefile.common | 2 ++
 x86/Makefile.common | 2 ++
 3 files changed, 10 insertions(+)

Comments

Bill Wendling April 27, 2021, 9:15 p.m. UTC | #1
Ping.

On Mon, Mar 8, 2021 at 8:53 PM Bill Wendling <morbo@google.com> wrote:
>
> The -nostdlib flag disables the driver from adding libclang_rt.*.a
> during linking. Adding a specific library to the command line then
> causes the linker to report unresolved symbols, because the libraries
> that resolve those symbols aren't automatically added. Turns out clang
> doesn't need to specify that library.
>
> Signed-off-by: Bill Wendling <morbo@google.com>
> ---
>  Makefile            | 6 ++++++
>  arm/Makefile.common | 2 ++
>  x86/Makefile.common | 2 ++
>  3 files changed, 10 insertions(+)
>
> diff --git a/Makefile b/Makefile
> index e0828fe..61a1276 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -22,10 +22,16 @@ DESTDIR := $(PREFIX)/share/kvm-unit-tests/
>  cc-option = $(shell if $(CC) -Werror $(1) -S -o /dev/null -xc /dev/null \
>                > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
>
> +# cc-name
> +# Expands to either gcc or clang
> +cc-name = $(shell $(CC) -v 2>&1 | grep -q "clang version" && echo clang || echo gcc)
> +
>  #make sure env CFLAGS variable is not used
>  CFLAGS =
>
> +ifneq ($(cc-name),clang)
>  libgcc := $(shell $(CC) --print-libgcc-file-name)
> +endif
>
>  libcflat := lib/libcflat.a
>  cflatobjs := \
> diff --git a/arm/Makefile.common b/arm/Makefile.common
> index a123e85..94922aa 100644
> --- a/arm/Makefile.common
> +++ b/arm/Makefile.common
> @@ -58,7 +58,9 @@ OBJDIRS += lib/arm
>  libeabi = lib/arm/libeabi.a
>  eabiobjs = lib/arm/eabi_compat.o
>
> +ifneq ($(cc-name),clang)
>  libgcc := $(shell $(CC) $(machine) --print-libgcc-file-name)
> +endif
>
>  FLATLIBS = $(libcflat) $(LIBFDT_archive) $(libgcc) $(libeabi)
>  %.elf: LDFLAGS = -nostdlib $(arch_LDFLAGS)
> diff --git a/x86/Makefile.common b/x86/Makefile.common
> index 55f7f28..a96b236 100644
> --- a/x86/Makefile.common
> +++ b/x86/Makefile.common
> @@ -37,7 +37,9 @@ COMMON_CFLAGS += -O1
>  # stack.o relies on frame pointers.
>  KEEP_FRAME_POINTER := y
>
> +ifneq ($(cc-name),clang)
>  libgcc := $(shell $(CC) -m$(bits) --print-libgcc-file-name)
> +endif
>
>  # We want to keep intermediate file: %.elf and %.o
>  .PRECIOUS: %.elf %.o
> --
> 2.30.1.766.gb4fecdf3b7-goog
>
Jim Mattson May 4, 2021, 5:07 p.m. UTC | #2
On Mon, Mar 8, 2021 at 8:53 PM Bill Wendling <morbo@google.com> wrote:
>
> The -nostdlib flag disables the driver from adding libclang_rt.*.a
> during linking. Adding a specific library to the command line then
> causes the linker to report unresolved symbols, because the libraries
> that resolve those symbols aren't automatically added. Turns out clang
> doesn't need to specify that library.
>
> Signed-off-by: Bill Wendling <morbo@google.com>
Reviewed-by: Jim Mattson <jmattson@google.com>
Paolo Bonzini May 5, 2021, 12:31 p.m. UTC | #3
On 09/03/21 05:52, Bill Wendling wrote:
> The -nostdlib flag disables the driver from adding libclang_rt.*.a
> during linking. Adding a specific library to the command line then
> causes the linker to report unresolved symbols, because the libraries
> that resolve those symbols aren't automatically added. Turns out clang
> doesn't need to specify that library.

This breaks 32-bit build with clang due to __udivdi3/__umoddi3.  Let me 
post an alternative.

Paolo

> Signed-off-by: Bill Wendling <morbo@google.com>
> ---
>   Makefile            | 6 ++++++
>   arm/Makefile.common | 2 ++
>   x86/Makefile.common | 2 ++
>   3 files changed, 10 insertions(+)
> 
> diff --git a/Makefile b/Makefile
> index e0828fe..61a1276 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -22,10 +22,16 @@ DESTDIR := $(PREFIX)/share/kvm-unit-tests/
>   cc-option = $(shell if $(CC) -Werror $(1) -S -o /dev/null -xc /dev/null \
>                 > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
>   
> +# cc-name
> +# Expands to either gcc or clang
> +cc-name = $(shell $(CC) -v 2>&1 | grep -q "clang version" && echo clang || echo gcc)
> +
>   #make sure env CFLAGS variable is not used
>   CFLAGS =
>   
> +ifneq ($(cc-name),clang)
>   libgcc := $(shell $(CC) --print-libgcc-file-name)
> +endif
>   
>   libcflat := lib/libcflat.a
>   cflatobjs := \
> diff --git a/arm/Makefile.common b/arm/Makefile.common
> index a123e85..94922aa 100644
> --- a/arm/Makefile.common
> +++ b/arm/Makefile.common
> @@ -58,7 +58,9 @@ OBJDIRS += lib/arm
>   libeabi = lib/arm/libeabi.a
>   eabiobjs = lib/arm/eabi_compat.o
>   
> +ifneq ($(cc-name),clang)
>   libgcc := $(shell $(CC) $(machine) --print-libgcc-file-name)
> +endif
>   
>   FLATLIBS = $(libcflat) $(LIBFDT_archive) $(libgcc) $(libeabi)
>   %.elf: LDFLAGS = -nostdlib $(arch_LDFLAGS)
> diff --git a/x86/Makefile.common b/x86/Makefile.common
> index 55f7f28..a96b236 100644
> --- a/x86/Makefile.common
> +++ b/x86/Makefile.common
> @@ -37,7 +37,9 @@ COMMON_CFLAGS += -O1
>   # stack.o relies on frame pointers.
>   KEEP_FRAME_POINTER := y
>   
> +ifneq ($(cc-name),clang)
>   libgcc := $(shell $(CC) -m$(bits) --print-libgcc-file-name)
> +endif
>   
>   # We want to keep intermediate file: %.elf and %.o
>   .PRECIOUS: %.elf %.o
>
diff mbox series

Patch

diff --git a/Makefile b/Makefile
index e0828fe..61a1276 100644
--- a/Makefile
+++ b/Makefile
@@ -22,10 +22,16 @@  DESTDIR := $(PREFIX)/share/kvm-unit-tests/
 cc-option = $(shell if $(CC) -Werror $(1) -S -o /dev/null -xc /dev/null \
               > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
 
+# cc-name
+# Expands to either gcc or clang
+cc-name = $(shell $(CC) -v 2>&1 | grep -q "clang version" && echo clang || echo gcc)
+
 #make sure env CFLAGS variable is not used
 CFLAGS =
 
+ifneq ($(cc-name),clang)
 libgcc := $(shell $(CC) --print-libgcc-file-name)
+endif
 
 libcflat := lib/libcflat.a
 cflatobjs := \
diff --git a/arm/Makefile.common b/arm/Makefile.common
index a123e85..94922aa 100644
--- a/arm/Makefile.common
+++ b/arm/Makefile.common
@@ -58,7 +58,9 @@  OBJDIRS += lib/arm
 libeabi = lib/arm/libeabi.a
 eabiobjs = lib/arm/eabi_compat.o
 
+ifneq ($(cc-name),clang)
 libgcc := $(shell $(CC) $(machine) --print-libgcc-file-name)
+endif
 
 FLATLIBS = $(libcflat) $(LIBFDT_archive) $(libgcc) $(libeabi)
 %.elf: LDFLAGS = -nostdlib $(arch_LDFLAGS)
diff --git a/x86/Makefile.common b/x86/Makefile.common
index 55f7f28..a96b236 100644
--- a/x86/Makefile.common
+++ b/x86/Makefile.common
@@ -37,7 +37,9 @@  COMMON_CFLAGS += -O1
 # stack.o relies on frame pointers.
 KEEP_FRAME_POINTER := y
 
+ifneq ($(cc-name),clang)
 libgcc := $(shell $(CC) -m$(bits) --print-libgcc-file-name)
+endif
 
 # We want to keep intermediate file: %.elf and %.o 
 .PRECIOUS: %.elf %.o