https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94504
Bug ID: 94504 Summary: On powerpc, -ffunction-sections -fdata-sections is not as effective as expected for PIE executables. Product: gcc Version: 9.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: gcc-bugzilla at mkarcher dot dialup.fu-berlin.de Target Milestone: --- I try to compile the following test program using gcc -ffunction-sections -fdata-sections -pie -Wl,--gc-sections input.c The linking step fails, because g is not defined. On most architectures except powerpc (32 bit), the garbage collection is able to discard both fptr and f, and so the reference to g vanishes. This is not the case on powerpc, where f is referencing fptr through a GOT entry in the .got2 section. This issue (I don't dare to call it "bug" yet) is the cause of of https://bugs.debian.org/955845. The librsvg build process is quirky and building the tests only works if garbage collection is able to collect a hughe amount of dead code. Garbage collection is able to do that on all architectures Debian tried it on except for powerpc (and possibly ppc64, see https://bugs.debian.org/895723). The attached example program does compile fine on ppc64, though. /* dead code */ extern void g(int x, ...); extern void (*fptr)(); void f() { /* using fptr creates a GOT entry for fptr */ g(0, fptr); } /* fptr is reference from the GOT. Let's reference f from fptr */ void (*fptr)() = f; /* Non-dead code */ int x = 5; int main(void) { /* using x goes through the GOT. This prevents the GC to kill it */ return x; }