https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108515
--- Comment #10 from Richard Earnshaw <rearnsha at gcc dot gnu.org> --- Almost certainly this is related to the need for a copyreloc and presumably the linker has not created one for some reason. So I suspect this is most likely a binutils issue rather than a compiler one. The code generated for the simple test is just main: @ args = 0, pretend = 0, frame = 0 @ frame_needed = 0, uses_anonymous_args = 0 movw r3, #:lower16:stderr movt r3, #:upper16:stderr push {r4, lr} movw r0, #:lower16:.LC0 movt r0, #:upper16:.LC0 ldr r1, [r3] bl printf mov r0, #0 pop {r4, pc} And the references to stderr will require the definition to be moved from the shared library to the static image during linking.