https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85801
Bug ID: 85801
Summary: LTO linking fails to reconcile symbol from common an
data sections (-fPIE -Wl,--as-needed -flto):
unresolvable R_ARM_REL32 relocation against symbol
`progname'
Product: gcc
Version: 8.0.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: lto
Assignee: unassigned at gcc dot gnu.org
Reporter: slyfox at inbox dot ru
CC: marxin at gcc dot gnu.org
Target Milestone: ---
This failure is not arm-specific but architecture-specific. It was found on
slightly patched xfsprogs in https://bugs.gentoo.org/655638
Here is a complete example that illustrates the failure:
// $ cat libxfs.c
char * progname = "libxfs"; /* tools will override it */
const char * my_name(void) { return progname; }
// $ cat xfs_io.c
#include <stdio.h>
// this would be more precise:
// extern char * progname;
// but libxfs uses this:
char * progname;
// from libxfs
const char * my_name(void);
int main(int argc, char ** argv) {
progname = argv[0];
fprintf(stderr, "I am %s\n", my_name());
return progname[0];
}
// $ cat mk.sh
#!/bin/bash
export LANG=C
: ${CC:=gcc}
$CC -flto -fPIC -shared libxfs.c -o libxfs.so
$CC -flto -Wl,--as-needed -fPIE -pie xfs_io.c -o bug_tool -L . -lxfs
Note:
- 'char * progname' is defined in both units. Is it valid C? Is it OK to rely
on linker to resolve this ambiguity?
- Both -Wl,--as-needed and -flto seem to be required to trigger the bug
Broken targets:
CC=/usr/bin/aarch64-unknown-linux-gnu-gcc ./mk.sh
ld: relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `progname' which
may bind externally can not be used when making a shared object; recompile with
-fPIC
ld: unresolvable R_AARCH64_ADR_PREL_PG_HI21 relocation against symbol
`progname'
CC=/usr/bin/alpha-unknown-linux-gnu-gcc ./mk.sh
ld: gp-relative relocation against dynamic symbol progname
CC=/usr/bin/armv5tel-softfloat-linux-gnueabi-gcc ./mk.sh
CC=/usr/bin/armv7a-hardfloat-linux-gnueabi-gcc ./mk.sh
ld: unresolvable R_ARM_REL32 relocation against symbol `progname'
CC=/usr/bin/ia64-unknown-linux-gnu-gcc ./mk.sh
ld: @gprel relocation against dynamic symbol progname
CC=/usr/bin/powerpc64-unknown-linux-gnu-gcc ./mk.sh
CC=/usr/bin/powerpc64le-unknown-linux-gnu-gcc ./mk.sh
ld: final link failed: Symbol needs debug section which does not exist
CC=/usr/bin/riscv64-unknown-linux-gnu-gcc ./mk.sh
ld: unresolvable R_RISCV_PCREL_HI20 relocation against symbol `progname'
CC=/usr/bin/s390x-unknown-linux-gnu-gcc ./mk.sh
ld: `progname' non-PLT reloc for symbol defined in shared library and
accessed from executable (rebuild file with -fPIC ?)
CC=/usr/bin/sh4-unknown-linux-gnu-gcc ./mk.sh
ld: unresolvable R_SH_GOTOFF relocation against symbol `progname'
CC=/usr/bin/x86_64-pc-linux-gnu-gcc ./mk.sh
Seemingly working targets (by chance or lack support for one of modes):
CC=/usr/bin/hppa-unknown-linux-gnu-gcc ./mk.sh
CC=/usr/bin/hppa2.0-unknown-linux-gnu-gcc ./mk.sh
CC=/usr/bin/m68k-unknown-linux-gnu-gcc ./mk.sh
CC=/usr/bin/mips-unknown-linux-gnu-gcc ./mk.sh
CC=/usr/bin/mips64-unknown-linux-gnu-gcc ./mk.sh
CC=/usr/bin/mips64el-unknown-linux-gnu-gcc ./mk.sh
CC=/usr/bin/mipsel-unknown-linux-gnu-gcc ./mk.sh
CC=/usr/bin/nios2-unknown-linux-gnu-gcc ./mk.sh
CC=/usr/bin/powerpc-unknown-linux-gnu-gcc ./mk.sh
CC=/usr/bin/s390-unknown-linux-gnu-gcc ./mk.sh
CC=/usr/bin/sparc-unknown-linux-gnu-gcc ./mk.sh
CC=/usr/bin/sparc64-unknown-linux-gnu-gcc ./mk.sh
Should xfsprogs be fixed to specify correct declarations?
Should gcc be fixed to handle this case for all(most) targets uniformly?
Thanks!