https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88627
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|WAITING |RESOLVED Resolution|--- |MOVED --- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> --- for binutils bfd based ld : bfd/elf.c has: /* If we have a .interp section, then create a PT_PHDR segment for the program headers and a PT_INTERP segment for the .interp section. */ s = bfd_get_section_by_name (abfd, ".interp"); ... gold has this (so that might be an issue): if (!parameters->options().relocatable() && !parameters->doing_static_link()) { // There was a dynamic object in the link. We need to create // some information for the dynamic linker. // Create the PT_PHDR segment which will hold the program // headers. if (!this->script_options_->saw_phdrs_clause()) phdr_seg = this->make_output_segment(elfcpp::PT_PHDR, elfcpp::PF_R); --- CUT --- // Now we have seen all the input files. const bool doing_static_link = (!input_objects->any_dynamic() && !parameters->options().output_is_position_independent()); set_parameters_doing_static_link(doing_static_link); Hmm, so gold is broken. It only creates a PT_PHDR segment when there are shared libraries present or the output is a (static) pie executable. Please report it to binutils that gold does not add a PT_PHDR when .interp/PT_INTERP exists but no shared library.