mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-04-12 14:33:06 +08:00
Fix an internal error in the constructor of Target_arm.
gold/ * arm.cc (Target_arm::Target_arm): Move initialization code ... (Target_arm::do_select_as_default_target): ... to here. * testsuite/Makefile.am (arm_target_lazy_init): New test case. * testsuite/Makefile.in: Regenerate. * testsuite/arm_target_lazy_init.s: New source file. * testsuite/arm_target_lazy_init.t: New linker script.
This commit is contained in:
parent
89ede9f53b
commit
ee7ef219cb
@ -1,3 +1,12 @@
|
||||
2016-12-19 Igor Kudrin <ikudrin@accesssoftek.com>
|
||||
|
||||
* arm.cc (Target_arm::Target_arm): Move initialization code ...
|
||||
(Target_arm::do_select_as_default_target): ... to here.
|
||||
* testsuite/Makefile.am (arm_target_lazy_init): New test case.
|
||||
* testsuite/Makefile.in: Regenerate.
|
||||
* testsuite/arm_target_lazy_init.s: New source file.
|
||||
* testsuite/arm_target_lazy_init.t: New linker script.
|
||||
|
||||
2016-12-19 Cary Coutant <ccoutant@gmail.com>
|
||||
|
||||
PR gold/20976
|
||||
|
51
gold/arm.cc
51
gold/arm.cc
@ -2132,32 +2132,7 @@ class Target_arm : public Sized_target<32, big_endian>
|
||||
target1_reloc_(elfcpp::R_ARM_ABS32),
|
||||
// This can be any reloc type but usually is R_ARM_GOT_PREL.
|
||||
target2_reloc_(elfcpp::R_ARM_GOT_PREL)
|
||||
{
|
||||
if (parameters->options().user_set_target1_rel())
|
||||
{
|
||||
// FIXME: This is not strictly compatible with ld, which allows both
|
||||
// --target1-abs and --target-rel to be given.
|
||||
if (parameters->options().user_set_target1_abs())
|
||||
gold_error(_("Cannot use both --target1-abs and --target1-rel."));
|
||||
else
|
||||
this->target1_reloc_ = elfcpp::R_ARM_REL32;
|
||||
}
|
||||
// We don't need to handle --target1-abs because target1_reloc_ is set
|
||||
// to elfcpp::R_ARM_ABS32 in the member initializer list.
|
||||
|
||||
if (parameters->options().user_set_target2())
|
||||
{
|
||||
const char* target2 = parameters->options().target2();
|
||||
if (strcmp(target2, "rel") == 0)
|
||||
this->target2_reloc_ = elfcpp::R_ARM_REL32;
|
||||
else if (strcmp(target2, "abs") == 0)
|
||||
this->target2_reloc_ = elfcpp::R_ARM_ABS32;
|
||||
else if (strcmp(target2, "got-rel") == 0)
|
||||
this->target2_reloc_ = elfcpp::R_ARM_GOT_PREL;
|
||||
else
|
||||
gold_unreachable();
|
||||
}
|
||||
}
|
||||
{ }
|
||||
|
||||
// Whether we force PCI branch veneers.
|
||||
bool
|
||||
@ -2571,6 +2546,30 @@ class Target_arm : public Sized_target<32, big_endian>
|
||||
// as the default.
|
||||
gold_assert(arm_reloc_property_table == NULL);
|
||||
arm_reloc_property_table = new Arm_reloc_property_table();
|
||||
if (parameters->options().user_set_target1_rel())
|
||||
{
|
||||
// FIXME: This is not strictly compatible with ld, which allows both
|
||||
// --target1-abs and --target-rel to be given.
|
||||
if (parameters->options().user_set_target1_abs())
|
||||
gold_error(_("Cannot use both --target1-abs and --target1-rel."));
|
||||
else
|
||||
this->target1_reloc_ = elfcpp::R_ARM_REL32;
|
||||
}
|
||||
// We don't need to handle --target1-abs because target1_reloc_ is set
|
||||
// to elfcpp::R_ARM_ABS32 in the member initializer list.
|
||||
|
||||
if (parameters->options().user_set_target2())
|
||||
{
|
||||
const char* target2 = parameters->options().target2();
|
||||
if (strcmp(target2, "rel") == 0)
|
||||
this->target2_reloc_ = elfcpp::R_ARM_REL32;
|
||||
else if (strcmp(target2, "abs") == 0)
|
||||
this->target2_reloc_ = elfcpp::R_ARM_ABS32;
|
||||
else if (strcmp(target2, "got-rel") == 0)
|
||||
this->target2_reloc_ = elfcpp::R_ARM_GOT_PREL;
|
||||
else
|
||||
gold_unreachable();
|
||||
}
|
||||
}
|
||||
|
||||
// Virtual function which is set to return true by a target if
|
||||
|
@ -3721,6 +3721,14 @@ arm_target2.o: arm_target2.s
|
||||
MOSTLYCLEANFILES += arm_target1_abs arm_target1_rel \
|
||||
arm_target2_rel arm_target2_abs arm_target2_got_rel
|
||||
|
||||
# The test demonstrates why the constructor of a target object should not access options.
|
||||
check_DATA += arm_target_lazy_init
|
||||
MOSTLYCLEANFILES += arm_target_lazy_init
|
||||
arm_target_lazy_init: arm_target_lazy_init.o arm_target_lazy_init.t ../ld-new
|
||||
../ld-new -T $(srcdir)/arm_target_lazy_init.t -o $@ $<
|
||||
arm_target_lazy_init.o: arm_target_lazy_init.s
|
||||
$(TEST_AS) -EL -o $@ $<
|
||||
|
||||
endif DEFAULT_TARGET_ARM
|
||||
|
||||
if DEFAULT_TARGET_AARCH64
|
||||
|
@ -854,6 +854,8 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_target2_rel.sh \
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_target2_abs.sh \
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_target2_got_rel.sh
|
||||
|
||||
# The test demonstrates why the constructor of a target object should not access options.
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@am__append_93 = arm_abs_global.stdout \
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_bl_in_range.stdout \
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_bl_out_of_range.stdout \
|
||||
@ -903,7 +905,8 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_target1_rel.stdout \
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_target2_rel.stdout \
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_target2_abs.stdout \
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_target2_got_rel.stdout
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_target2_got_rel.stdout \
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_target_lazy_init
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@am__append_94 = arm_abs_global \
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_bl_in_range \
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_bl_out_of_range \
|
||||
@ -951,7 +954,8 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_target1_rel \
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_target2_rel \
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_target2_abs \
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_target2_got_rel
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_target2_got_rel \
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_target_lazy_init
|
||||
@DEFAULT_TARGET_AARCH64_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@am__append_95 = aarch64_reloc_none.sh \
|
||||
@DEFAULT_TARGET_AARCH64_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ aarch64_relocs.sh
|
||||
@DEFAULT_TARGET_AARCH64_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@am__append_96 = aarch64_reloc_none.stdout \
|
||||
@ -7763,6 +7767,10 @@ uninstall-am:
|
||||
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_target2.o: arm_target2.s
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -o $@ $<
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_target_lazy_init: arm_target_lazy_init.o arm_target_lazy_init.t ../ld-new
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new -T $(srcdir)/arm_target_lazy_init.t -o $@ $<
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_target_lazy_init.o: arm_target_lazy_init.s
|
||||
@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -EL -o $@ $<
|
||||
@DEFAULT_TARGET_AARCH64_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@aarch64_reloc_none.o: aarch64_reloc_none.s
|
||||
@DEFAULT_TARGET_AARCH64_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -o $@ $<
|
||||
@DEFAULT_TARGET_AARCH64_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@aarch64_reloc_none: aarch64_reloc_none.o ../ld-new
|
||||
|
2
gold/testsuite/arm_target_lazy_init.s
Normal file
2
gold/testsuite/arm_target_lazy_init.s
Normal file
@ -0,0 +1,2 @@
|
||||
.text
|
||||
nop
|
1
gold/testsuite/arm_target_lazy_init.t
Normal file
1
gold/testsuite/arm_target_lazy_init.t
Normal file
@ -0,0 +1 @@
|
||||
OUTPUT_FORMAT("elf32-littlearm")
|
Loading…
x
Reference in New Issue
Block a user