On 12/05/13 22:20, Don Slutz wrote:
On 12/05/13 16:24, Richard Henderson wrote:
On 12/06/2013 04:18 AM, Paolo Bonzini wrote:
$ gcc -shared -o f.so f.c -fPIE -fPIC
/usr/bin/ld: /tmp/ccQc9els.o: relocation R_X86_64_PC32 against `f' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: ld returned 1 exit status


The bug is simply that "-fPIE -fPIC" counts as -fPIE rather than -fPIC:

$ gcc -S -o - f.c -fPIE |grep call
    call    f                      # PC32 relocation
$ gcc -S -o - f.c -fPIC |grep call
    call    f@PLT                  # PLT32 relocation
The easy workaround is to drop -fPIE when we're adding -fPIC.


r~
[snip]

Attached is a much better version. It drops -fPIE and adds -fPIC for libtool.

   -Don Slutz
>From 82bc02f2bd5e02e341f9c86c9915707dc4edb778 Mon Sep 17 00:00:00 2001
From: Don Slutz <dsl...@verizon.com>
Date: Sat, 7 Dec 2013 17:33:52 +0000
Subject: [PATCH] configure: Switch libtool from -fPIE to -fPIC (bug #1257099)

Add new config-host variable LIBTOOL_CFLAGS

Signed-off-by: Don Slutz <dsl...@verizon.com>
---
 configure | 2 ++
 rules.mak | 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/configure b/configure
index 18fa608..7d32364 100755
--- a/configure
+++ b/configure
@@ -4113,11 +4113,13 @@ echo "WINDRES=$windres" >> $config_host_mak
 echo "LIBTOOL=$libtool" >> $config_host_mak
 echo "CFLAGS=$CFLAGS" >> $config_host_mak
 echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
+echo "LIBTOOL_CFLAGS="$(echo $QEMU_CFLAGS | sed -e 's/-fPIE -DPIE/-fPIC -DPIC/') >>$config_host_mak
 echo "QEMU_INCLUDES=$QEMU_INCLUDES" >> $config_host_mak
 if test "$sparse" = "yes" ; then
   echo "CC           := REAL_CC=\"\$(CC)\" cgcc"       >> $config_host_mak
   echo "HOST_CC      := REAL_CC=\"\$(HOST_CC)\" cgcc"  >> $config_host_mak
   echo "QEMU_CFLAGS  += -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-non-pointer-null" >> $config_host_mak
+  echo "LIBTOOL_CFLAGS += -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-non-pointer-null" >> $config_host_mak
 fi
 if test "$cross_prefix" != ""; then
   echo "AUTOCONF_HOST := --host=${cross_prefix%-}"     >> $config_host_mak
diff --git a/rules.mak b/rules.mak
index 4499745..e4dea9c 100644
--- a/rules.mak
+++ b/rules.mak
@@ -29,7 +29,7 @@ LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ \
 else
 LIBTOOL += $(if $(V),,--quiet)
 %.lo: %.c
-	$(call quiet-command,$(LIBTOOL) --mode=compile --tag=CC $(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) -c -o $@ $<,"  lt CC $@")
+	$(call quiet-command,$(LIBTOOL) --mode=compile --tag=CC $(CC) $(QEMU_INCLUDES) $(LIBTOOL_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) -c -o $@ $<,"  lt CC $@")
 %.lo: %.rc
 	$(call quiet-command,$(LIBTOOL) --mode=compile --tag=RC $(WINDRES) -I. -o $@ $<,"lt RC   $(TARGET_DIR)$@")
 %.lo: %.dtrace
-- 
1.7.11.7

Reply via email to