diff options
author | Alan Modra <amodra@gmail.com> | 2017-01-10 10:24:09 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2017-01-10 11:50:07 +1030 |
commit | f159cdb61155d699f5aff2a9fbad8b787a7fe10c (patch) | |
tree | f86a44b39d08ad07be0349eaf3cb8b1f11588833 /gold | |
parent | eaa38cfd42fe323fb7868e676ced7419bc5eec12 (diff) | |
download | gdb-f159cdb61155d699f5aff2a9fbad8b787a7fe10c.zip gdb-f159cdb61155d699f5aff2a9fbad8b787a7fe10c.tar.gz gdb-f159cdb61155d699f5aff2a9fbad8b787a7fe10c.tar.bz2 |
[GOLD] Add --secure-plt option for ppc32
Added just to accept, and ignore. gcc since 2015-10-21, when
configured with --enable-secureplt passes this option to the linker.
As powerpc gold cannot link --bss-plt code successfully, gold needs to
accept the option or the gcc specs file needs to be changed.
The patch also make gold detect --bss-plt code and error out rather
than producing a binary that crashes.
* options.h: Add --secure-plt option.
* powerpc.cc (Target_powerpc::Scan::local): Detect and error
on -fPIC -mbss-plt code.
(Target_powerpc::Scan::global): Likewise.
Diffstat (limited to 'gold')
-rw-r--r-- | gold/ChangeLog | 7 | ||||
-rw-r--r-- | gold/options.h | 3 | ||||
-rw-r--r-- | gold/powerpc.cc | 38 |
3 files changed, 48 insertions, 0 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 1159f9c..bf834f8 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,10 @@ +2017-01-10 Alan Modra <amodra@gmail.com> + + * options.h: Add --secure-plt option. + * powerpc.cc (Target_powerpc::Scan::local): Detect and error + on -fPIC -mbss-plt code. + (Target_powerpc::Scan::global): Likewise. + 2017-01-09 Alan Modra <amodra@gmail.com> * powerpc.cc (Target_powerpc::make_plt_section): Point sh_info of diff --git a/gold/options.h b/gold/options.h index d7ac6cd..a8b1d46 100644 --- a/gold/options.h +++ b/gold/options.h @@ -1203,6 +1203,9 @@ class General_options DEFINE_special(section_start, options::TWO_DASHES, '\0', N_("Set address of section"), N_("SECTION=ADDRESS")); + DEFINE_bool(secure_plt, options::TWO_DASHES , '\0', true, + N_("(PowerPC only) Use new-style PLT"), NULL); + DEFINE_optional_string(sort_common, options::TWO_DASHES, '\0', NULL, N_("Sort common symbols by alignment"), N_("[={ascending,descending}]")); diff --git a/gold/powerpc.cc b/gold/powerpc.cc index 6d6d0dd..b91fb4b 100644 --- a/gold/powerpc.cc +++ b/gold/powerpc.cc @@ -5972,6 +5972,30 @@ Target_powerpc<size, big_endian>::Scan::local( break; } + if (size == 32) + { + switch (r_type) + { + case elfcpp::R_POWERPC_REL32: + if (ppc_object->got2_shndx() != 0 + && parameters->options().output_is_position_independent()) + { + unsigned int shndx = lsym.get_st_shndx(); + unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info()); + bool is_ordinary; + shndx = ppc_object->adjust_sym_shndx(r_sym, shndx, &is_ordinary); + if (is_ordinary && shndx == ppc_object->got2_shndx() + && (ppc_object->section_flags(data_shndx) + & elfcpp::SHF_EXECINSTR) != 0) + gold_error(_("%s: unsupported -mbss-plt code"), + ppc_object->name().c_str()); + } + break; + default: + break; + } + } + switch (r_type) { case elfcpp::R_POWERPC_GOT_TLSLD16: @@ -6473,6 +6497,20 @@ Target_powerpc<size, big_endian>::Scan::global( break; } + if (size == 32) + { + switch (r_type) + { + case elfcpp::R_PPC_LOCAL24PC: + if (strcmp(gsym->name(), "_GLOBAL_OFFSET_TABLE_") == 0) + gold_error(_("%s: unsupported -mbss-plt code"), + ppc_object->name().c_str()); + break; + default: + break; + } + } + switch (r_type) { case elfcpp::R_POWERPC_GOT_TLSLD16: |