This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
> The patch below is a first draft of a fix for PR binutils/23016; hoping > to solicit comments. Thanks, Than, for the analysis and proposed patch. We really want to do both of the things you were considering: (1) canonicalize the .eh_frame section types and combine them even when mixed, and (2) maintain separate relocation sections where the data sections are separate. In the attached patch, I've done both of these. > For relocatable links, this add some logic to avoid merging two input > relocation sections if the sections targeted by said relocations have > different section types. The motivating example for this change is a > relocatable link on X86_64 that includes objects compiled by > Clang/LLVM (which uses a section type of X86_64_UNWIND for the > .eh_frame section) and GCC (which uses a section type of PROGBITS), > resulting in an assert in output.h. This isn't quite what we want to do. I've simplified the logic by keeping track of the associated reloc section for each output data section. When we layout a reloc section, we look to see if the output data section already has an output reloc section, and use that if it has one. Otherwise, we simply create a new output reloc section. For .eh_frame sections, I've added logic in Sized_relobj_file::do_layout to force the section type to SHT_X86_64_UNWIND if it's not already, so we'll always get that section type in the output file. Unfortunately, making the decision there necessitated passing the overridden section type down through a couple of layers, but the scope of the change wasn't too bad. (I could have made the decision later in Layout::layout, avoiding some interface changes, but I felt that was the wrong place to make that decision.) For non-dash-r links, where we send the .eh_frame sections through Layout::layout_eh_frame, I've also changed Layout::make_eh_frame_section to use the unwind section type for the new output sections. It's wrong to use a processor-specific section type in the common parts of gold, so I added a target interface to select what section type to use for .eh_frame, and fixed the few places where we were referencing SHT_X86_64_UNWIND improperly. > I would welcome suggestions on how to write a test for this fix: in > order to trigger the problematic scenario there needs to be a > relocatable link with two input files each containing an input section > (with relocations) with the same name/flags but different section > types-- not sure how to accomplish that short of writing in assembler > (maybe there is some C compiler option I could use that would > perturb section types?). I've added a couple of simple test cases that manufacture this scenario in the regular case (where we want to keep the sections separate), and in the .eh_frame case (where we want to combine them). I just wrote some short assembly code. I'm committing the attached patch. -cary Fix problem where mixed section types can cause internal error during a -r link. During a -r (or --emit-relocs) link, if two sections had the same name but different section types, gold would put relocations for both sections into the same relocation section even though the data sections remained separate. For .eh_frame sections, when one section is PROGBITS and another is X86_64_UNWIND, we really should be using the UNWIND section type and combining the sections anyway. For other sections, we should be creating one relocation section for each output data section. 2018-04-02 Cary Coutant <ccoutant@gmail.com> gold/ PR gold/23016 * incremental.cc (can_incremental_update): Check for unwind section type. * layout.h (Layout::layout): Add sh_type parameter. * layout.cc (Layout::layout): Likewise. (Layout::layout_reloc): Create new output reloc section if data section does not already have one. (Layout::layout_eh_frame): Check for unwind section type. (Layout::make_eh_frame_section): Use unwind section type for .eh_frame and .eh_frame_hdr. * object.h (Sized_relobj_file::Shdr_write): New typedef. (Sized_relobj_file::layout_section): Add sh_type parameter. (Sized_relobj_file::Deferred_layout::Deferred_layout): Add sh_type parameter. * object.cc (Sized_relobj_file::check_eh_frame_flags): Check for unwind section type. (Sized_relobj_file::layout_section): Add sh_type parameter; pass it to Layout::layout. (Sized_relobj_file::do_layout): Make local copy of sh_type. Force .eh_frame sections to unwind section type. Pass sh_type to layout_section. (Sized_relobj_file<size, big_endian>::do_layout_deferred_sections): Pass sh_type to layout_section. * output.cc (Output_section::Output_section): Initialize reloc_section_. * output.h (Output_section::reloc_section): New method. (Output_section::set_reloc_section): New method. (Output_section::reloc_section_): New data member. * target.h (Target::unwind_section_type): New method. (Target::Target_info::unwind_section_type): New data member. * aarch64.cc (aarch64_info): Add unwind_section_type. * arm.cc (arm_info, arm_nacl_info): Likewise. * i386.cc (i386_info, i386_nacl_info, iamcu_info): Likewise. * mips.cc (mips_info, mips_nacl_info): Likewise. * powerpc.cc (powerpc_info): Likewise. * s390.cc (s390_info): Likewise. * sparc.cc (sparc_info): Likewise. * tilegx.cc (tilegx_info): Likewise. * x86_64.cc (x86_64_info, x86_64_nacl_info): Likewise. * testsuite/Makefile.am (pr23016_1, pr23016_2): New test cases. * testsuite/Makefile.in: Regenerate. * testsuite/testfile.cc: Add unwind_section_type. * testsuite/pr23016_1.sh: New test script. * testsuite/pr23016_1a.s: New source file. * testsuite/pr23016_1b.s: New source file. * testsuite/pr23016_2.sh: New test script. * testsuite/pr23016_2a.s: New source file. * testsuite/pr23016_2b.s: New source file.
Attachment:
pr23016.patch
Description: Binary data
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |