unsigned int i;
unsigned int func_desc_offset;
unsigned int num_fidx;
+ unsigned int num_fidx_deleted = 0;
struct sframe_dec_info *sfd_info;
changed = false;
/* FIXME - if relocatable link and changed = true, how does the final
.rela.sframe get updated ?. */
keep = false;
+ sec->rawsize = sec->size;
sfd_info = (struct sframe_dec_info *) elf_section_data (sec)->sec_info;
if (!keep)
{
sframe_decoder_mark_func_deleted (sfd_info, i);
+ num_fidx_deleted++;
changed = true;
}
}
+
+ /* PR libsframe/33127
+ Set section size to zero if all FDE are to be deleted. Using size,
+ later bfd_elf_discard_info will mark this section as SEC_EXCLUDE. */
+ if (changed && num_fidx_deleted == num_fidx)
+ bfd_set_section_size (sec, 0);
}
return changed;
}
{
if (i->size != i->rawsize)
changed = 1;
+ if (i->size == 0)
+ i->flags |= SEC_EXCLUDE;
}
}
fini_reloc_cookie_for_section (&cookie, i);
--- /dev/null
+#name: SFrame relocatable link - discarded section (PR ld/33127)
+#source: ../ld-elf/eh-group1.s
+#source: ../ld-elf/eh-group2.s
+#as: --gsframe
+#ld: -r
+#readelf: -rW
+
+#failif
+#...
+[0-9a-f]+ +[0-9a-f]+ +R_X86_64_NONE *0?
+#...
if { ![skip_sframe_tests] } {
run_dump_test "sframe-simple-1"
run_dump_test "sframe-reloc-1"
+ run_dump_test "sframe-reloc-2"
run_dump_test "sframe-plt-1"
run_dump_test "sframe-ibt-plt-1"
run_dump_test "sframe-pltgot-1"