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