https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104617
--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Untested fix: 2022-02-21 Jakub Jelinek <ja...@redhat.com> PR lto/104617 * simple-object-elf.c (simple_object_elf_match): Fix up URL in comment. (simple_object_elf_copy_lto_debug_sections): Remap sh_info and sh_link even if they are in the SHN_LORESERVE .. SHN_HIRESERVE range (inclusive). --- libiberty/simple-object-elf.c.jj 2022-01-11 23:11:23.967267993 +0100 +++ libiberty/simple-object-elf.c 2022-02-21 20:37:12.815202845 +0100 @@ -528,7 +528,7 @@ simple_object_elf_match (unsigned char h not handle objects with more than SHN_LORESERVE sections correctly. All large section indexes were offset by 0x100. There is more information at - http://sourceware.org/bugzilla/show_bug.cgi?id-5900 . + http://sourceware.org/bugzilla/show_bug.cgi?id=5900 . Fortunately these object files are easy to detect, as the GNU binutils always put the section header string table near the end of the list of sections. Thus if the @@ -1559,17 +1559,13 @@ simple_object_elf_copy_lto_debug_section { sh_info = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, shdr, sh_info, Elf_Word); - if (sh_info < SHN_LORESERVE - || sh_info > SHN_HIRESERVE) - sh_info = sh_map[sh_info]; + sh_info = sh_map[sh_info]; ELF_SET_FIELD (type_functions, ei_class, Shdr, shdr, sh_info, Elf_Word, sh_info); } sh_link = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, shdr, sh_link, Elf_Word); - if (sh_link < SHN_LORESERVE - || sh_link > SHN_HIRESERVE) - sh_link = sh_map[sh_link]; + sh_link = sh_map[sh_link]; ELF_SET_FIELD (type_functions, ei_class, Shdr, shdr, sh_link, Elf_Word, sh_link); } SHN_LORESERVE .. SHN_HIRESERVE is something only relevant for the 16-bit field, i.e. st_shndx, e_shnum and e_shstrndx. The latter two are moved to sh_size and sh_link of the shdr[0], the first one into .symtab_shndx section.