2006-12-01 07:52:50 +08:00
|
|
|
// testfile.cc -- Dummy ELF objects for testing purposes.
|
|
|
|
|
2017-01-02 11:36:43 +08:00
|
|
|
// Copyright (C) 2006-2017 Free Software Foundation, Inc.
|
2007-09-23 05:02:10 +08:00
|
|
|
// Written by Ian Lance Taylor <iant@google.com>.
|
|
|
|
|
|
|
|
// This file is part of gold.
|
|
|
|
|
|
|
|
// This program is free software; you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation; either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program; if not, write to the Free Software
|
|
|
|
// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
|
|
|
// MA 02110-1301, USA.
|
|
|
|
|
2006-12-01 07:52:50 +08:00
|
|
|
#include "gold.h"
|
|
|
|
|
|
|
|
#include "target.h"
|
|
|
|
#include "target-select.h"
|
|
|
|
|
|
|
|
#include "test.h"
|
|
|
|
#include "testfile.h"
|
|
|
|
|
|
|
|
namespace gold_testsuite
|
|
|
|
{
|
|
|
|
|
|
|
|
using namespace gold;
|
|
|
|
|
|
|
|
// A Target used for testing purposes.
|
|
|
|
|
2007-10-03 08:34:49 +08:00
|
|
|
template<int size, bool big_endian>
|
|
|
|
class Target_test : public Sized_target<size, big_endian>
|
2006-12-01 07:52:50 +08:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
Target_test()
|
2007-10-03 08:34:49 +08:00
|
|
|
: Sized_target<size, big_endian>(&test_target_info)
|
2006-12-01 07:52:50 +08:00
|
|
|
{ }
|
|
|
|
|
2009-01-28 10:25:33 +08:00
|
|
|
void
|
2011-05-25 05:41:10 +08:00
|
|
|
gc_process_relocs(Symbol_table*, Layout*,
|
|
|
|
Sized_relobj_file<size, big_endian>*,
|
* object.h (class Relobj): Drop options parameter from
gc_process_relocs, scan_relocs, relocate, do_gc_process_relocs,
do_scan_relocs, do_relocate. Change all callers.
(class Sized_relobj): Drop options parameters from
do_gc_process_relocs, do_scan_relocs, do_relocate,
do_relocate_sections, relocate_sections, emit_relocs_scan,
emit_relocs_scan_reltype. Change all callers.
(struct Relocate_info): Remove options field and all references to
it.
* reloc.h (class Read_relocs): Remove options constructor
parameter and options_ field. Change all callers.
(class Gc_process_relocs, class Scan_relocs): Likewise.
(class Relocate_task): Likewise.
* target-reloc.h (scan_relocs): Remove options parameter. Change
all callers.
(scan_relocatable_relocs): Likewise.
* target.h (class Sized_target): Remove options parameter from
gc_process_relocs, scan_relocs, scan_relocatable_relocs. Change
all callers.
* gc.h (gc_process_relocs): Remove options parameter. Change all
callers.
* arm.cc: Update functions to remove options parameters.
* i386.cc: Likewise.
* powerpc.cc: Likewise.
* sparc.cc: Likewise.
* x86_64.cc: Likewise.
* testsuite/testfile.cc: Likewise.
2009-10-29 13:16:23 +08:00
|
|
|
unsigned int, unsigned int, const unsigned char*, size_t,
|
|
|
|
Output_section*, bool, size_t, const unsigned char*)
|
2009-01-28 10:25:33 +08:00
|
|
|
{ ERROR("call to Target_test::gc_process_relocs"); }
|
|
|
|
|
2006-12-01 07:52:50 +08:00
|
|
|
void
|
2011-05-25 05:41:10 +08:00
|
|
|
scan_relocs(Symbol_table*, Layout*, Sized_relobj_file<size, big_endian>*,
|
* object.h (class Relobj): Drop options parameter from
gc_process_relocs, scan_relocs, relocate, do_gc_process_relocs,
do_scan_relocs, do_relocate. Change all callers.
(class Sized_relobj): Drop options parameters from
do_gc_process_relocs, do_scan_relocs, do_relocate,
do_relocate_sections, relocate_sections, emit_relocs_scan,
emit_relocs_scan_reltype. Change all callers.
(struct Relocate_info): Remove options field and all references to
it.
* reloc.h (class Read_relocs): Remove options constructor
parameter and options_ field. Change all callers.
(class Gc_process_relocs, class Scan_relocs): Likewise.
(class Relocate_task): Likewise.
* target-reloc.h (scan_relocs): Remove options parameter. Change
all callers.
(scan_relocatable_relocs): Likewise.
* target.h (class Sized_target): Remove options parameter from
gc_process_relocs, scan_relocs, scan_relocatable_relocs. Change
all callers.
* gc.h (gc_process_relocs): Remove options parameter. Change all
callers.
* arm.cc: Update functions to remove options parameters.
* i386.cc: Likewise.
* powerpc.cc: Likewise.
* sparc.cc: Likewise.
* x86_64.cc: Likewise.
* testsuite/testfile.cc: Likewise.
2009-10-29 13:16:23 +08:00
|
|
|
unsigned int, unsigned int, const unsigned char*, size_t,
|
|
|
|
Output_section*, bool, size_t, const unsigned char*)
|
2006-12-01 07:52:50 +08:00
|
|
|
{ ERROR("call to Target_test::scan_relocs"); }
|
|
|
|
|
|
|
|
void
|
2007-10-03 08:34:49 +08:00
|
|
|
relocate_section(const Relocate_info<size, big_endian>*, unsigned int,
|
2007-11-09 15:00:15 +08:00
|
|
|
const unsigned char*, size_t, Output_section*, bool,
|
|
|
|
unsigned char*, typename elfcpp::Elf_types<size>::Elf_Addr,
|
2009-10-07 06:58:27 +08:00
|
|
|
section_size_type, const Reloc_symbol_changes*)
|
2006-12-01 07:52:50 +08:00
|
|
|
{ ERROR("call to Target_test::relocate_section"); }
|
|
|
|
|
2008-02-06 16:13:50 +08:00
|
|
|
void
|
* object.h (class Relobj): Drop options parameter from
gc_process_relocs, scan_relocs, relocate, do_gc_process_relocs,
do_scan_relocs, do_relocate. Change all callers.
(class Sized_relobj): Drop options parameters from
do_gc_process_relocs, do_scan_relocs, do_relocate,
do_relocate_sections, relocate_sections, emit_relocs_scan,
emit_relocs_scan_reltype. Change all callers.
(struct Relocate_info): Remove options field and all references to
it.
* reloc.h (class Read_relocs): Remove options constructor
parameter and options_ field. Change all callers.
(class Gc_process_relocs, class Scan_relocs): Likewise.
(class Relocate_task): Likewise.
* target-reloc.h (scan_relocs): Remove options parameter. Change
all callers.
(scan_relocatable_relocs): Likewise.
* target.h (class Sized_target): Remove options parameter from
gc_process_relocs, scan_relocs, scan_relocatable_relocs. Change
all callers.
* gc.h (gc_process_relocs): Remove options parameter. Change all
callers.
* arm.cc: Update functions to remove options parameters.
* i386.cc: Likewise.
* powerpc.cc: Likewise.
* sparc.cc: Likewise.
* x86_64.cc: Likewise.
* testsuite/testfile.cc: Likewise.
2009-10-29 13:16:23 +08:00
|
|
|
scan_relocatable_relocs(Symbol_table*, Layout*,
|
2011-05-25 05:41:10 +08:00
|
|
|
Sized_relobj_file<size, big_endian>*, unsigned int,
|
2008-02-06 16:13:50 +08:00
|
|
|
unsigned int, const unsigned char*,
|
|
|
|
size_t, Output_section*, bool, size_t,
|
|
|
|
const unsigned char*, Relocatable_relocs*)
|
|
|
|
{ ERROR("call to Target_test::scan_relocatable_relocs"); }
|
|
|
|
|
Refactor gold to enable support for MIPS-64 relocation format.
For MIPS-64, the r_info field in the relocation format is
replaced by several individual fields, including r_sym and
r_type. To enable support for this format, I've refactored
target-independent code to remove almost all uses of the r_info
field. (I've left alone a couple of routines used only for
incremental linking, which I can update if/when the MIPS target
adds support for incremental linking.)
For routines that are already templated on a Classify_reloc class
(namely, gc_process_relocs, relocate_section, and
relocate_relocs), I've extended the Classify_reloc interface to
include sh_type (which no longer needs to be a separate template
parameter) as well as get_r_sym() and get_r_type() methods for
extracting the r_sym and r_type fields. For
scan_relocatable_relocs, I've extended the
Default_scan_relocatable_relocs class by converting it to a class
template with Classify_reloc as a template parameter. For the
remaining routines that need to access r_sym, I've added a
virtual Target::get_r_sym() method with an override for the MIPS
target.
In elfcpp, I've added Mips64_rel, etc., accessor classes and
corresponding internal data structures. The MIPS target uses
these new classes within its own Mips_classify_reloc class.
The Mips64_ accessor classes also expose the r_ssym, r_type2,
and r_type3 fields from the relocation.
These changes should be functionally the same for all but the
MIPS target.
elfcpp/
* elfcpp.h (Mips64_rel, Mips64_rel_write): New classes.
(Mips64_rela, Mips64_rela_write): New classes.
* elfcpp_internal.h (Mips64_rel_data, Mips64_rela_data): New structs.
gold/
* gc.h (get_embedded_addend_size): Remove sh_type parameter.
(gc_process_relocs): Remove sh_type template parameter.
Use Classify_reloc to access r_sym, r_type, and r_addend fields.
* object.h (Sized_relobj_file::split_stack_adjust): Add target
parameter.
(Sized_relobj_file::split_stack_adjust_reltype): Likewise.
* reloc-types.h (Reloc_types::copy_reloc_addend): (SHT_REL and SHT_RELA
specializations) Remove.
* reloc.cc (Emit_relocs_strategy): Rename and move to target-reloc.h.
(Sized_relobj_file::emit_relocs_scan): Call Target::emit_relocs_scan().
(Sized_relobj_file::emit_relocs_scan_reltype): Remove.
(Sized_relobj_file::split_stack_adjust): Add target parameter.
Adjust all callers.
(Sized_relobj_file::split_stack_adjust_reltype): Likewise. Call
Target::get_r_sym() to get r_sym field from relocations.
(Track_relocs::next_symndx): Call Target::get_r_sym().
* target-reloc.h (scan_relocs): Remove sh_type template parameter;
add Classify_reloc template parameter. Use for accessing r_sym and
r_type.
(relocate_section): Likewise.
(Default_classify_reloc): New class (renamed and moved from reloc.cc).
(Default_scan_relocatable_relocs): Remove sh_type template parameter.
(Default_scan_relocatable_relocs::Reltype): New typedef.
(Default_scan_relocatable_relocs::reloc_size): New const.
(Default_scan_relocatable_relocs::sh_type): New const.
(Default_scan_relocatable_relocs::get_r_sym): New method.
(Default_scan_relocatable_relocs::get_r_type): New method.
(Default_emit_relocs_strategy): New class.
(scan_relocatable_relocs): Replace sh_type template parameter with
Scan_relocatable_relocs class. Use it to access r_sym and r_type
fields.
(relocate_relocs): Replace sh_type template parameter with
Classify_reloc class. Use it to access r_sym and r_type fields.
* target.h (Target::is_call_to_non_split): Replace r_type parameter
with pointer to relocation. Adjust all callers.
(Target::do_is_call_to_non_split): Likewise.
(Target::emit_relocs_scan): New virtual method.
(Sized_target::get_r_sym): New virtual method.
* target.cc (Target::do_is_call_to_non_split): Replace r_type parameter
with pointer to relocation.
* aarch64.cc (Target_aarch64::emit_relocs_scan): New method.
(Target_aarch64::Relocatable_size_for_reloc): Remove.
(Target_aarch64::gc_process_relocs): Use Default_classify_reloc.
(Target_aarch64::scan_relocs): Likewise.
(Target_aarch64::relocate_section): Likewise.
(Target_aarch64::Relocatable_size_for_reloc::get_size_for_reloc):
Remove.
(Target_aarch64::scan_relocatable_relocs): Use Default_classify_reloc.
(Target_aarch64::relocate_relocs): Use Default_classify_reloc.
* arm.cc (Target_arm::Arm_scan_relocatable_relocs): Remove sh_type
template parameter.
(Target_arm::emit_relocs_scan): New method.
(Target_arm::Relocatable_size_for_reloc): Replace with...
(Target_arm::Classify_reloc): ...this.
(Target_arm::gc_process_relocs): Use Classify_reloc.
(Target_arm::scan_relocs): Likewise.
(Target_arm::relocate_section): Likewise.
(Target_arm::scan_relocatable_relocs): Likewise.
(Target_arm::relocate_relocs): Likewise.
* i386.cc (Target_i386::emit_relocs_scan): New method.
(Target_i386::Relocatable_size_for_reloc): Replace with...
(Target_i386::Classify_reloc): ...this.
(Target_i386::gc_process_relocs): Use Classify_reloc.
(Target_i386::scan_relocs): Likewise.
(Target_i386::relocate_section): Likewise.
(Target_i386::scan_relocatable_relocs): Likewise.
(Target_i386::relocate_relocs): Likewise.
* mips.cc (Mips_scan_relocatable_relocs): Remove sh_type template
parameter.
(Mips_reloc_types): New class template.
(Mips_classify_reloc): New class template.
(Target_mips::Reltype): New typedef.
(Target_mips::Relatype): New typedef.
(Target_mips::emit_relocs_scan): New method.
(Target_mips::get_r_sym): New method.
(Target_mips::Relocatable_size_for_reloc): Replace with
Mips_classify_reloc.
(Target_mips::copy_reloc): Use Mips_classify_reloc.
(Target_mips::gc_process_relocs): Likewise.
(Target_mips::scan_relocs): Likewise.
(Target_mips::relocate_section): Likewise.
(Target_mips::scan_relocatable_relocs): Likewise.
(Target_mips::relocate_relocs): Likewise.
(mips_get_size_for_reloc): New function, factored out from
Relocatable_size_for_reloc::get_size_for_reloc.
(Target_mips::Scan::local): Use Mips_classify_reloc.
(Target_mips::Scan::global): Likewise.
(Target_mips::Relocate::relocate): Likewise.
* powerpc.cc (Target_powerpc::emit_relocs_scan): New method.
(Target_powerpc::Relocatable_size_for_reloc): Remove.
(Target_powerpc::gc_process_relocs): Use Default_classify_reloc.
(Target_powerpc::scan_relocs): Likewise.
(Target_powerpc::relocate_section): Likewise.
(Powerpc_scan_relocatable_reloc): Convert to class template.
(Powerpc_scan_relocatable_reloc::Reltype): New typedef.
(Powerpc_scan_relocatable_reloc::reloc_size): New const.
(Powerpc_scan_relocatable_reloc::sh_type): New const.
(Powerpc_scan_relocatable_reloc::get_r_sym): New method.
(Powerpc_scan_relocatable_reloc::get_r_type): New method.
(Target_powerpc::scan_relocatable_relocs): Use
Powerpc_scan_relocatable_reloc.
(Target_powerpc::relocate_relocs): Use Default_classify_reloc.
* s390.cc (Target_s390::emit_relocs_scan): New method.
(Target_s390::Relocatable_size_for_reloc): Remove.
(Target_s390::gc_process_relocs): Use Default_classify_reloc.
(Target_s390::scan_relocs): Likewise.
(Target_s390::relocate_section): Likewise.
(Target_s390::Relocatable_size_for_reloc::get_size_for_reloc):
Remove.
(Target_s390::scan_relocatable_relocs): Use Default_classify_reloc.
(Target_s390::relocate_relocs): Use Default_classify_reloc.
* sparc.cc (Target_sparc::emit_relocs_scan): New method.
(Target_sparc::Relocatable_size_for_reloc): Remove.
(Target_sparc::gc_process_relocs): Use Default_classify_reloc.
(Target_sparc::scan_relocs): Likewise.
(Target_sparc::relocate_section): Likewise.
(Target_sparc::Relocatable_size_for_reloc::get_size_for_reloc):
Remove.
(Target_sparc::scan_relocatable_relocs): Use Default_classify_reloc.
(Target_sparc::relocate_relocs): Use Default_classify_reloc.
* tilegx.cc (Target_tilegx::emit_relocs_scan): New method.
(Target_tilegx::Relocatable_size_for_reloc): Remove.
(Target_tilegx::gc_process_relocs): Use Default_classify_reloc.
(Target_tilegx::scan_relocs): Likewise.
(Target_tilegx::relocate_section): Likewise.
(Target_tilegx::Relocatable_size_for_reloc::get_size_for_reloc):
Remove.
(Target_tilegx::scan_relocatable_relocs): Use Default_classify_reloc.
(Target_tilegx::relocate_relocs): Use Default_classify_reloc.
* x86_64.cc (Target_x86_64::emit_relocs_scan): New method.
(Target_x86_64::Relocatable_size_for_reloc): Remove.
(Target_x86_64::gc_process_relocs): Use Default_classify_reloc.
(Target_x86_64::scan_relocs): Likewise.
(Target_x86_64::relocate_section): Likewise.
(Target_x86_64::Relocatable_size_for_reloc::get_size_for_reloc):
Remove.
(Target_x86_64::scan_relocatable_relocs): Use Default_classify_reloc.
(Target_x86_64::relocate_relocs): Use Default_classify_reloc.
* testsuite/testfile.cc (Target_test::emit_relocs_scan): New method.
2015-12-11 23:43:59 +08:00
|
|
|
void
|
|
|
|
emit_relocs_scan(Symbol_table*, Layout*,
|
|
|
|
Sized_relobj_file<size, big_endian>*, unsigned int,
|
|
|
|
unsigned int, const unsigned char*,
|
|
|
|
size_t, Output_section*, bool, size_t,
|
|
|
|
const unsigned char*, Relocatable_relocs*)
|
|
|
|
{ ERROR("call to Target_test::emit_relocs_scan"); }
|
|
|
|
|
2008-02-06 16:13:50 +08:00
|
|
|
void
|
2012-09-05 08:34:20 +08:00
|
|
|
relocate_relocs(const Relocate_info<size, big_endian>*,
|
|
|
|
unsigned int, const unsigned char*, size_t,
|
2012-11-02 07:27:00 +08:00
|
|
|
Output_section*, typename elfcpp::Elf_types<size>::Elf_Off,
|
[GOLD] Relocate::relocate() params
Some linker code editing needs to change multiple insns. In some
cases multiple relocations are involved and it is not sufficient to
make the changes independently as relocations are processed, because
doing so might lead to a partial edit. So in order to safely edit we
need all the relocations available in relocate(). Also, to emit
edited relocs corresponding to the edited code sequence we need some
way to pass information from relocate() to relocate_relocs(),
particularly if the edit depends on insns. We can't modify input
relocs in relocate() as they are mmapped PROT_READ, nor it is
particularly clean to write relocs to the output at that stage. So
add a Relocatable_relocs* field to relinfo to mark edited relocs.
Given that relocate is passed the raw reloc pointer, it makes sense to
remove the rel/rela parameter and r_type too. However, that means the
mips relocate() needs to know whether SHT_REL or SHT_RELA relocs are
being processed. So add a rel_type for mips, which also has the
benefit of removing relocate() overloading there.
This patch adds the infrastructure without making use of it.
Note that relinfo->rr will be NULL if not outputting relocations.
* object.h (struct Relocate_info): Add "rr".
* reloc.h (Relocatable_relocs::set_strategy): New accessor.
* reloc.cc (Sized_relobj_file::do_relocate_sections): Init
relinfo.rr for relocate_section and relocate_relocs.
* powerpc.cc (relocate): Add rel_type and preloc parameters.
Delete rela and r_type params, instead recalculate these from
preloc.
(relocate_relocs): Delete Relocatable_relocs* param, instead
use relinfo->rr.
* aarch64.cc: Likewise.
* arm.cc: Likewise.
* i386.cc: Likewise.
* mips.cc: Likewise.
* s390.cc: Likewise.
* sparc.cc: Likewise.
* target.h: Likewise.
* tilegx.cc: Likewise.
* x86_64.cc: Likewise.
* testsuite/testfile.cc: Likewise.
* target-reloc.h (relocate_section): Adjust to suit.
(apply_relocation, relocate_relocs): Likewise.
2015-12-09 07:48:30 +08:00
|
|
|
unsigned char*,
|
2012-09-05 08:34:20 +08:00
|
|
|
typename elfcpp::Elf_types<size>::Elf_Addr,
|
|
|
|
section_size_type, unsigned char*,
|
|
|
|
section_size_type)
|
|
|
|
{ ERROR("call to Target_test::relocate_relocs"); }
|
2008-02-06 16:13:50 +08:00
|
|
|
|
2006-12-01 07:52:50 +08:00
|
|
|
static const Target::Target_info test_target_info;
|
|
|
|
};
|
|
|
|
|
2007-10-03 08:34:49 +08:00
|
|
|
template<int size, bool big_endian>
|
|
|
|
const Target::Target_info Target_test<size, big_endian>::test_target_info =
|
2006-12-01 07:52:50 +08:00
|
|
|
{
|
2007-10-03 08:34:49 +08:00
|
|
|
size, // size
|
|
|
|
big_endian, // is_big_endian
|
2006-12-01 07:52:50 +08:00
|
|
|
static_cast<elfcpp::EM>(0xffff), // machine_code
|
|
|
|
false, // has_make_symbol
|
|
|
|
false, // has_resolve
|
2007-09-21 14:25:35 +08:00
|
|
|
false, // has_code_fill
|
2007-10-23 13:05:48 +08:00
|
|
|
false, // is_default_stack_executable
|
2011-06-29 05:15:42 +08:00
|
|
|
false, // can_icf_inline_merge_sections
|
2008-04-09 08:48:13 +08:00
|
|
|
'\0', // wrap_char
|
2006-12-01 07:52:50 +08:00
|
|
|
"/dummy", // dynamic_linker
|
2007-10-17 06:38:36 +08:00
|
|
|
0x08000000, // default_text_segment_address
|
2006-12-01 07:52:50 +08:00
|
|
|
0x1000, // abi_pagesize
|
2009-06-22 14:51:53 +08:00
|
|
|
0x1000, // common_pagesize
|
* configure.ac (ENABLE_GOLD): Consider *-*-nacl* targets ELF.
* configure: Regenerate.
gold/
* nacl.cc: New file.
* nacl.h: New file.
* Makefile.am (CCFILES, HFILES): Add them.
* Makefile.in: Regenerate.
* i386.cc (Output_data_plt_i386_nacl): New class.
(Output_data_plt_i386_nacl_exec): New class.
(Output_data_plt_i386_nacl_dyn): New class.
(Target_i386_nacl): New class.
(Target_selector_i386_nacl): New class.
(target_selector_i386): Use it instead of Target_selector_i386.
* x86_64.cc (Output_data_plt_x86_64_nacl): New class.
(Target_x86_64_nacl): New class.
(Target_selector_x86_64_nacl): New class.
(target_selector_x86_64, target_selector_x32): Use it instead of
Target_selector_x86_64.
* arm.cc (Output_data_plt_arm_nacl): New class.
(Target_arm_nacl): New class.
(Target_selector_arm_nacl): New class.
(target_selector_arm, target_selector_armbe): Use it instead of
Target_selector_arm.
* target-select.cc (select_target): Take new Input_file* and off_t
arguments, pass them on to recognize method of selector.
* object.cc (make_elf_sized_object): Update caller.
* parameters.cc (parameters_force_valid_target): Likewise.
* incremental.cc (make_sized_incremental_binary): Likewise.
* target-select.h: Update decl.
(Target_selector::recognize): Take new Input_file* argument,
pass it on to do_recognize.
(Target_selector::do_recognize): Take new Input_file* argument.
* freebsd.h (Target_selector_freebsd::do_recognize): Likewise.
* powerpc.cc (Target_selector_powerpc::do_recognize): Likewise.
* sparc.cc (Target_selector_sparc::do_recognize): Likewise.
* testsuite/testfile.cc (Target_selector::do_recognize): Likewise.
* target.h (Target::Target_info): New members isolate_execinstr
and rosegment_gap.
(Target::isolate_execinstr, Target::rosegment_gap): New methods.
* arm.cc (Target_arm::arm_info): Update initializer.
* i386.cc (Target_i386::i386_info): Likewise.
* powerpc.cc (Target_powerpc::powerpc_info): Likewise.
* sparc.cc (Target_sparc::sparc_info): Likewise.
* x86_64.cc (Target_x86_64::x86_64_info): Likewise.
* testsuite/testfile.cc (Target_test::test_target_info): Likewise.
* layout.cc (Layout::attach_allocated_section_to_segment):
Take new const Target* argument. If target->isolate_execinstr(), act
like --rosegment.
(Layout::find_first_load_seg): Take new const Target* argument;
if target->isolate_execinstr(), reject PF_X segments.
(Layout::relaxation_loop_body): Update caller.
(Layout::set_segment_offsets): If target->isolate_execinstr(),
reset file offset to zero when we hit LOAD_SEG, and then do a second
loop over the segments before LOAD_SEG to reassign offsets after
addresses have been determined. Handle target->rosegment_gap().
(Layout::attach_section_to_segment): Take new const Target* argument;
pass it to attach_allocated_section_to_segment.
(Layout::make_output_section): Update caller.
(Layout::attach_sections_to_segments): Take new const Target* argument;
pass it to attach_section_to_segment.
* gold.cc (queue_middle_tasks): Update caller.
* layout.h (Layout): Update method decls with new arguments.
* arm.cc (Target_arm::Target_arm): Take optional argument for the
Target_info pointer to use.
(Target_arm::do_make_data_plt): New virtual method.
(Target_arm::make_data_plt): New method that calls it.
(Target_arm::make_plt_entry): Use it.
(Output_data_plt_arm::Output_data_plt_arm): Take additional argument
for the section alignment.
(Output_data_plt_arm::do_first_plt_entry_offset): New abstract virtual
method.
(Output_data_plt_arm::first_plt_entry_offset): Call it.
(Output_data_plt_arm::do_get_plt_entry_size): New abstract virtual
method.
(Output_data_plt_arm::get_plt_entry_size): Call it.
(Output_data_plt_arm::do_fill_plt_entry): New abstract virtual method.
(Output_data_plt_arm::fill_plt_entry): New method that calls it.
(Output_data_plt_arm::do_fill_first_plt_entry): New abstract virtual
method.
(Output_data_plt_arm::fill_first_plt_entry): New method that calls it.
(Output_data_plt_arm::set_final_data_size): Use get_plt_entry_size
method instead of sizeof(plt_entry).
(Output_data_plt_arm::add_entry): Likewise.
Use first_plt_entry_offset method instead of sizeof(first_plt_entry).
(Target_arm::first_plt_entry_offset): Call method on this->plt_ rather
than static method.
(Target_arm::plt_entry_size): Likewise.
(Output_data_plt_arm::first_plt_entry, Output_data_plt_arm::plt_entry):
Move to ...
(Output_data_plt_arm_standard): ... here, new class.
(Output_data_plt_arm::do_write): Move guts of PLT filling to...
(Output_data_plt_arm_standard::do_fill_first_plt_entry): ... here ...
(Output_data_plt_arm_standard::do_fill_plt_entry): ... and here.
* x86_64.cc (Output_data_plt_x86_64::Output_data_plt_x86_64):
Take additional argument for the PLT entry size.
(Output_data_plt_x86_64::get_tlsdesc_plt_offset):
Use get_plt_entry_size method rather than plt_entry_size variable.
(Output_data_plt_x86_64::reserve_slot): Likewise.
(Output_data_plt_x86_64::do_adjust_output_section): Likewise.
(Output_data_plt_x86_64::add_entry): Likewise.
(Output_data_plt_x86_64::add_local_ifunc_entry): Likewise.
(Output_data_plt_x86_64::address_for_global): Likewise.
(Output_data_plt_x86_64::address_for_local): Likewise.
(Output_data_plt_x86_64::set_final_data_size): Likewise.
(Output_data_plt_x86_64::first_plt_entry_offset): Likewise.
Make method non-static.
(Output_data_plt_x86_64::do_get_plt_entry_size): New abstract virtual
method.
(Output_data_plt_x86_64::get_plt_entry_size): Just call that.
(Output_data_plt_x86_64::do_add_eh_frame): New abstract virtual method.
(Output_data_plt_x86_64::add_eh_frame): New method to call it.
(Output_data_plt_x86_64::do_fill_first_plt_entry): New abstract
virtual method.
(Output_data_plt_x86_64::fill_first_plt_entry): New method to call it.
(Output_data_plt_x86_64::do_fill_plt_entry): New abstract
virtual method.
(Output_data_plt_x86_64::fill_plt_entry): New method to call it.
(Output_data_plt_x86_64::do_fill_tlsdesc_entry): New abstract
virtual method.
(Output_data_plt_x86_64::fill_tlsdesc_entry): New method to call it.
(Output_data_plt_x86_64::plt_entry_size)
(Output_data_plt_x86_64::first_plt_entry)
(Output_data_plt_x86_64::plt_entry)
(Output_data_plt_x86_64::tlsdesc_plt_entry)
(Output_data_plt_x86_64::plt_eh_frame_fde_size)
(Output_data_plt_x86_64::plt_eh_frame_fde): Move to ...
(Output_data_plt_x86_64_standard): ... here, new class.
(Target_x86_64::Target_x86_64): Take optional argument for the
Target_info pointer to use.
(Target_x86_64::do_make_data_plt): New virtual method.
(Target_x86_64::make_data_plt): New method to call it.
(Target_x86_64::init_got_plt_for_update): Use that.
Call this->plt_->add_eh_frame method here.
(Output_data_plt_x86_64::init): Don't do add_eh_frame_for_plt here.
(Target_x86_64::first_plt_entry_offset): Call method on this->plt_
rather than static method.
(Target_x86_64::plt_entry_size): Likewise.
(Output_data_plt_x86_64::do_write): Use get_plt_entry_size method
rather than plt_entry_size variable. Move guts of PLT filling to...
(Output_data_plt_x86_64_standard::do_fill_first_plt_entry): ... here ...
(Output_data_plt_x86_64_standard::do_fill_plt_entry): ... and here ...
(Output_data_plt_x86_64_standard::do_fill_tlsdesc_entry): ... and here.
* i386.cc (Output_data_plt_i386::Output_data_plt_i386): Take
additional argument for the section alignment.
Don't do add_eh_frame_for_plt here.
(Output_data_plt_i386::first_plt_entry_offset): Make the method
non-static. Use get_plt_entry_size method rather than plt_entry_size
variable.
(Output_data_plt_i386::do_get_plt_entry_size): New abstract virtual
method.
(Output_data_plt_i386::get_plt_entry_size): Call it.
(Output_data_plt_i386::do_add_eh_frame): New abstract virtual method.
(Output_data_plt_i386::add_eh_frame): New method to call it.
(Output_data_plt_i386::do_fill_first_plt_entry): New abstract virtual
method.
(Output_data_plt_i386::fill_first_plt_entry): New method to call it.
(Output_data_plt_i386::do_fill_plt_entry): New abstract virtual
method.
(Output_data_plt_i386::fill_plt_entry): New method to call it.
(Output_data_plt_i386::set_final_data_size): Use get_plt_entry_size
method instead of plt_entry_size.
(Output_data_plt_i386::plt_entry_size)
(Output_data_plt_i386::plt_eh_frame_fde_size)
(Output_data_plt_i386::plt_eh_frame_fde): Move to ...
(Output_data_plt_i386_standard): ... here, new class.
(Output_data_plt_i386_exec): New class.
(Output_data_plt_i386::exec_first_plt_entry): Move to ...
(Output_data_plt_i386_exec::first_plt_entry): ... here.
(Output_data_plt_i386::exec_plt_entry): Move to ...
(Output_data_plt_i386_exec::plt_entry): ... here.
(Output_data_plt_i386_dyn): New class.
(Output_data_plt_i386::first_plt_entry): Move to ...
(Output_data_plt_i386_dyn::first_plt_entry): ... here.
(Output_data_plt_i386::dyn_plt_entry): Move to ...
(Output_data_plt_i386_dyn::plt_entry): ... here.
(Target_i386::Target_i386): Take optional argument for the Target_info
pointer to use.
(Target_i386::do_make_data_plt): New virtual method.
(Target_i386::make_data_plt): New method to call it.
(Target_i386::make_plt_section): Use that.
Call this->plt_->add_eh_frame method here.
(Output_data_plt_i386::add_entry): Use get_plt_entry_size method
rather than plt_entry_size variable.
(Output_data_plt_i386::add_local_ifunc_entry): Likewise.
(Output_data_plt_i386::address_for_local): Likewise.
(Output_data_plt_i386::do_write): Likewise.
Move guts of PLT filling to...
(Output_data_plt_i386_exec::do_fill_first_plt_entry): ... here ...
(Output_data_plt_i386_exec::do_fill_plt_entry): ... and here ...
(Output_data_plt_i386_dyn::do_fill_first_plt_entry): ... and here ...
(Output_data_plt_i386_dyn::do_fill_plt_entry): ... and here.
Change-Id: Id24b95600489835ff5e860a39c147203d4380c2b
2012-05-03 05:37:24 +08:00
|
|
|
false, // isolate_execinstr
|
|
|
|
0, // rosegment_gap
|
2009-06-22 14:51:53 +08:00
|
|
|
elfcpp::SHN_UNDEF, // small_common_shndx
|
|
|
|
elfcpp::SHN_UNDEF, // large_common_shndx
|
|
|
|
0, // small_common_section_flags
|
2009-12-06 10:49:46 +08:00
|
|
|
0, // large_common_section_flags
|
|
|
|
NULL, // attributes_section
|
2013-07-31 05:26:53 +08:00
|
|
|
NULL, // attributes_vendor
|
2015-10-05 22:57:11 +08:00
|
|
|
"_start", // entry_symbol_name
|
|
|
|
32, // hash_entry_size
|
2006-12-01 07:52:50 +08:00
|
|
|
};
|
|
|
|
|
2007-10-03 08:34:49 +08:00
|
|
|
// The test targets.
|
2006-12-01 07:52:50 +08:00
|
|
|
|
2007-10-03 08:34:49 +08:00
|
|
|
#ifdef HAVE_TARGET_32_LITTLE
|
|
|
|
Target_test<32, false> target_test_32_little;
|
|
|
|
#endif
|
2006-12-01 07:52:50 +08:00
|
|
|
|
2007-10-03 08:34:49 +08:00
|
|
|
#ifdef HAVE_TARGET_32_BIG
|
|
|
|
Target_test<32, true> target_test_32_big;
|
|
|
|
#endif
|
2006-12-01 07:52:50 +08:00
|
|
|
|
2007-10-03 08:34:49 +08:00
|
|
|
#ifdef HAVE_TARGET_64_LITTLE
|
|
|
|
Target_test<64, false> target_test_64_little;
|
|
|
|
#endif
|
2006-12-01 07:52:50 +08:00
|
|
|
|
2007-10-03 08:34:49 +08:00
|
|
|
#ifdef HAVE_TARGET_64_BIG
|
|
|
|
Target_test<64, true> target_test_64_big;
|
|
|
|
#endif
|
2006-12-01 07:52:50 +08:00
|
|
|
|
2007-10-03 08:34:49 +08:00
|
|
|
// A pointer to the test targets. This is used in CHECKs.
|
|
|
|
|
|
|
|
#ifdef HAVE_TARGET_32_LITTLE
|
|
|
|
Target* target_test_pointer_32_little = &target_test_32_little;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef HAVE_TARGET_32_BIG
|
|
|
|
Target* target_test_pointer_32_big = &target_test_32_big;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef HAVE_TARGET_64_LITTLE
|
|
|
|
Target* target_test_pointer_64_little = &target_test_64_little;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef HAVE_TARGET_64_BIG
|
|
|
|
Target* target_test_pointer_64_big = &target_test_64_big;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// Select the test targets.
|
|
|
|
|
|
|
|
template<int size, bool big_endian>
|
2006-12-01 07:52:50 +08:00
|
|
|
class Target_selector_test : public Target_selector
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Target_selector_test()
|
2011-06-29 07:12:31 +08:00
|
|
|
: Target_selector(0xffff, size, big_endian, NULL, NULL)
|
2006-12-01 07:52:50 +08:00
|
|
|
{ }
|
|
|
|
|
* configure.ac (ENABLE_GOLD): Consider *-*-nacl* targets ELF.
* configure: Regenerate.
gold/
* nacl.cc: New file.
* nacl.h: New file.
* Makefile.am (CCFILES, HFILES): Add them.
* Makefile.in: Regenerate.
* i386.cc (Output_data_plt_i386_nacl): New class.
(Output_data_plt_i386_nacl_exec): New class.
(Output_data_plt_i386_nacl_dyn): New class.
(Target_i386_nacl): New class.
(Target_selector_i386_nacl): New class.
(target_selector_i386): Use it instead of Target_selector_i386.
* x86_64.cc (Output_data_plt_x86_64_nacl): New class.
(Target_x86_64_nacl): New class.
(Target_selector_x86_64_nacl): New class.
(target_selector_x86_64, target_selector_x32): Use it instead of
Target_selector_x86_64.
* arm.cc (Output_data_plt_arm_nacl): New class.
(Target_arm_nacl): New class.
(Target_selector_arm_nacl): New class.
(target_selector_arm, target_selector_armbe): Use it instead of
Target_selector_arm.
* target-select.cc (select_target): Take new Input_file* and off_t
arguments, pass them on to recognize method of selector.
* object.cc (make_elf_sized_object): Update caller.
* parameters.cc (parameters_force_valid_target): Likewise.
* incremental.cc (make_sized_incremental_binary): Likewise.
* target-select.h: Update decl.
(Target_selector::recognize): Take new Input_file* argument,
pass it on to do_recognize.
(Target_selector::do_recognize): Take new Input_file* argument.
* freebsd.h (Target_selector_freebsd::do_recognize): Likewise.
* powerpc.cc (Target_selector_powerpc::do_recognize): Likewise.
* sparc.cc (Target_selector_sparc::do_recognize): Likewise.
* testsuite/testfile.cc (Target_selector::do_recognize): Likewise.
* target.h (Target::Target_info): New members isolate_execinstr
and rosegment_gap.
(Target::isolate_execinstr, Target::rosegment_gap): New methods.
* arm.cc (Target_arm::arm_info): Update initializer.
* i386.cc (Target_i386::i386_info): Likewise.
* powerpc.cc (Target_powerpc::powerpc_info): Likewise.
* sparc.cc (Target_sparc::sparc_info): Likewise.
* x86_64.cc (Target_x86_64::x86_64_info): Likewise.
* testsuite/testfile.cc (Target_test::test_target_info): Likewise.
* layout.cc (Layout::attach_allocated_section_to_segment):
Take new const Target* argument. If target->isolate_execinstr(), act
like --rosegment.
(Layout::find_first_load_seg): Take new const Target* argument;
if target->isolate_execinstr(), reject PF_X segments.
(Layout::relaxation_loop_body): Update caller.
(Layout::set_segment_offsets): If target->isolate_execinstr(),
reset file offset to zero when we hit LOAD_SEG, and then do a second
loop over the segments before LOAD_SEG to reassign offsets after
addresses have been determined. Handle target->rosegment_gap().
(Layout::attach_section_to_segment): Take new const Target* argument;
pass it to attach_allocated_section_to_segment.
(Layout::make_output_section): Update caller.
(Layout::attach_sections_to_segments): Take new const Target* argument;
pass it to attach_section_to_segment.
* gold.cc (queue_middle_tasks): Update caller.
* layout.h (Layout): Update method decls with new arguments.
* arm.cc (Target_arm::Target_arm): Take optional argument for the
Target_info pointer to use.
(Target_arm::do_make_data_plt): New virtual method.
(Target_arm::make_data_plt): New method that calls it.
(Target_arm::make_plt_entry): Use it.
(Output_data_plt_arm::Output_data_plt_arm): Take additional argument
for the section alignment.
(Output_data_plt_arm::do_first_plt_entry_offset): New abstract virtual
method.
(Output_data_plt_arm::first_plt_entry_offset): Call it.
(Output_data_plt_arm::do_get_plt_entry_size): New abstract virtual
method.
(Output_data_plt_arm::get_plt_entry_size): Call it.
(Output_data_plt_arm::do_fill_plt_entry): New abstract virtual method.
(Output_data_plt_arm::fill_plt_entry): New method that calls it.
(Output_data_plt_arm::do_fill_first_plt_entry): New abstract virtual
method.
(Output_data_plt_arm::fill_first_plt_entry): New method that calls it.
(Output_data_plt_arm::set_final_data_size): Use get_plt_entry_size
method instead of sizeof(plt_entry).
(Output_data_plt_arm::add_entry): Likewise.
Use first_plt_entry_offset method instead of sizeof(first_plt_entry).
(Target_arm::first_plt_entry_offset): Call method on this->plt_ rather
than static method.
(Target_arm::plt_entry_size): Likewise.
(Output_data_plt_arm::first_plt_entry, Output_data_plt_arm::plt_entry):
Move to ...
(Output_data_plt_arm_standard): ... here, new class.
(Output_data_plt_arm::do_write): Move guts of PLT filling to...
(Output_data_plt_arm_standard::do_fill_first_plt_entry): ... here ...
(Output_data_plt_arm_standard::do_fill_plt_entry): ... and here.
* x86_64.cc (Output_data_plt_x86_64::Output_data_plt_x86_64):
Take additional argument for the PLT entry size.
(Output_data_plt_x86_64::get_tlsdesc_plt_offset):
Use get_plt_entry_size method rather than plt_entry_size variable.
(Output_data_plt_x86_64::reserve_slot): Likewise.
(Output_data_plt_x86_64::do_adjust_output_section): Likewise.
(Output_data_plt_x86_64::add_entry): Likewise.
(Output_data_plt_x86_64::add_local_ifunc_entry): Likewise.
(Output_data_plt_x86_64::address_for_global): Likewise.
(Output_data_plt_x86_64::address_for_local): Likewise.
(Output_data_plt_x86_64::set_final_data_size): Likewise.
(Output_data_plt_x86_64::first_plt_entry_offset): Likewise.
Make method non-static.
(Output_data_plt_x86_64::do_get_plt_entry_size): New abstract virtual
method.
(Output_data_plt_x86_64::get_plt_entry_size): Just call that.
(Output_data_plt_x86_64::do_add_eh_frame): New abstract virtual method.
(Output_data_plt_x86_64::add_eh_frame): New method to call it.
(Output_data_plt_x86_64::do_fill_first_plt_entry): New abstract
virtual method.
(Output_data_plt_x86_64::fill_first_plt_entry): New method to call it.
(Output_data_plt_x86_64::do_fill_plt_entry): New abstract
virtual method.
(Output_data_plt_x86_64::fill_plt_entry): New method to call it.
(Output_data_plt_x86_64::do_fill_tlsdesc_entry): New abstract
virtual method.
(Output_data_plt_x86_64::fill_tlsdesc_entry): New method to call it.
(Output_data_plt_x86_64::plt_entry_size)
(Output_data_plt_x86_64::first_plt_entry)
(Output_data_plt_x86_64::plt_entry)
(Output_data_plt_x86_64::tlsdesc_plt_entry)
(Output_data_plt_x86_64::plt_eh_frame_fde_size)
(Output_data_plt_x86_64::plt_eh_frame_fde): Move to ...
(Output_data_plt_x86_64_standard): ... here, new class.
(Target_x86_64::Target_x86_64): Take optional argument for the
Target_info pointer to use.
(Target_x86_64::do_make_data_plt): New virtual method.
(Target_x86_64::make_data_plt): New method to call it.
(Target_x86_64::init_got_plt_for_update): Use that.
Call this->plt_->add_eh_frame method here.
(Output_data_plt_x86_64::init): Don't do add_eh_frame_for_plt here.
(Target_x86_64::first_plt_entry_offset): Call method on this->plt_
rather than static method.
(Target_x86_64::plt_entry_size): Likewise.
(Output_data_plt_x86_64::do_write): Use get_plt_entry_size method
rather than plt_entry_size variable. Move guts of PLT filling to...
(Output_data_plt_x86_64_standard::do_fill_first_plt_entry): ... here ...
(Output_data_plt_x86_64_standard::do_fill_plt_entry): ... and here ...
(Output_data_plt_x86_64_standard::do_fill_tlsdesc_entry): ... and here.
* i386.cc (Output_data_plt_i386::Output_data_plt_i386): Take
additional argument for the section alignment.
Don't do add_eh_frame_for_plt here.
(Output_data_plt_i386::first_plt_entry_offset): Make the method
non-static. Use get_plt_entry_size method rather than plt_entry_size
variable.
(Output_data_plt_i386::do_get_plt_entry_size): New abstract virtual
method.
(Output_data_plt_i386::get_plt_entry_size): Call it.
(Output_data_plt_i386::do_add_eh_frame): New abstract virtual method.
(Output_data_plt_i386::add_eh_frame): New method to call it.
(Output_data_plt_i386::do_fill_first_plt_entry): New abstract virtual
method.
(Output_data_plt_i386::fill_first_plt_entry): New method to call it.
(Output_data_plt_i386::do_fill_plt_entry): New abstract virtual
method.
(Output_data_plt_i386::fill_plt_entry): New method to call it.
(Output_data_plt_i386::set_final_data_size): Use get_plt_entry_size
method instead of plt_entry_size.
(Output_data_plt_i386::plt_entry_size)
(Output_data_plt_i386::plt_eh_frame_fde_size)
(Output_data_plt_i386::plt_eh_frame_fde): Move to ...
(Output_data_plt_i386_standard): ... here, new class.
(Output_data_plt_i386_exec): New class.
(Output_data_plt_i386::exec_first_plt_entry): Move to ...
(Output_data_plt_i386_exec::first_plt_entry): ... here.
(Output_data_plt_i386::exec_plt_entry): Move to ...
(Output_data_plt_i386_exec::plt_entry): ... here.
(Output_data_plt_i386_dyn): New class.
(Output_data_plt_i386::first_plt_entry): Move to ...
(Output_data_plt_i386_dyn::first_plt_entry): ... here.
(Output_data_plt_i386::dyn_plt_entry): Move to ...
(Output_data_plt_i386_dyn::plt_entry): ... here.
(Target_i386::Target_i386): Take optional argument for the Target_info
pointer to use.
(Target_i386::do_make_data_plt): New virtual method.
(Target_i386::make_data_plt): New method to call it.
(Target_i386::make_plt_section): Use that.
Call this->plt_->add_eh_frame method here.
(Output_data_plt_i386::add_entry): Use get_plt_entry_size method
rather than plt_entry_size variable.
(Output_data_plt_i386::add_local_ifunc_entry): Likewise.
(Output_data_plt_i386::address_for_local): Likewise.
(Output_data_plt_i386::do_write): Likewise.
Move guts of PLT filling to...
(Output_data_plt_i386_exec::do_fill_first_plt_entry): ... here ...
(Output_data_plt_i386_exec::do_fill_plt_entry): ... and here ...
(Output_data_plt_i386_dyn::do_fill_first_plt_entry): ... and here ...
(Output_data_plt_i386_dyn::do_fill_plt_entry): ... and here.
Change-Id: Id24b95600489835ff5e860a39c147203d4380c2b
2012-05-03 05:37:24 +08:00
|
|
|
virtual Target*
|
2008-03-26 05:39:01 +08:00
|
|
|
do_instantiate_target()
|
|
|
|
{
|
|
|
|
gold_unreachable();
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
* configure.ac (ENABLE_GOLD): Consider *-*-nacl* targets ELF.
* configure: Regenerate.
gold/
* nacl.cc: New file.
* nacl.h: New file.
* Makefile.am (CCFILES, HFILES): Add them.
* Makefile.in: Regenerate.
* i386.cc (Output_data_plt_i386_nacl): New class.
(Output_data_plt_i386_nacl_exec): New class.
(Output_data_plt_i386_nacl_dyn): New class.
(Target_i386_nacl): New class.
(Target_selector_i386_nacl): New class.
(target_selector_i386): Use it instead of Target_selector_i386.
* x86_64.cc (Output_data_plt_x86_64_nacl): New class.
(Target_x86_64_nacl): New class.
(Target_selector_x86_64_nacl): New class.
(target_selector_x86_64, target_selector_x32): Use it instead of
Target_selector_x86_64.
* arm.cc (Output_data_plt_arm_nacl): New class.
(Target_arm_nacl): New class.
(Target_selector_arm_nacl): New class.
(target_selector_arm, target_selector_armbe): Use it instead of
Target_selector_arm.
* target-select.cc (select_target): Take new Input_file* and off_t
arguments, pass them on to recognize method of selector.
* object.cc (make_elf_sized_object): Update caller.
* parameters.cc (parameters_force_valid_target): Likewise.
* incremental.cc (make_sized_incremental_binary): Likewise.
* target-select.h: Update decl.
(Target_selector::recognize): Take new Input_file* argument,
pass it on to do_recognize.
(Target_selector::do_recognize): Take new Input_file* argument.
* freebsd.h (Target_selector_freebsd::do_recognize): Likewise.
* powerpc.cc (Target_selector_powerpc::do_recognize): Likewise.
* sparc.cc (Target_selector_sparc::do_recognize): Likewise.
* testsuite/testfile.cc (Target_selector::do_recognize): Likewise.
* target.h (Target::Target_info): New members isolate_execinstr
and rosegment_gap.
(Target::isolate_execinstr, Target::rosegment_gap): New methods.
* arm.cc (Target_arm::arm_info): Update initializer.
* i386.cc (Target_i386::i386_info): Likewise.
* powerpc.cc (Target_powerpc::powerpc_info): Likewise.
* sparc.cc (Target_sparc::sparc_info): Likewise.
* x86_64.cc (Target_x86_64::x86_64_info): Likewise.
* testsuite/testfile.cc (Target_test::test_target_info): Likewise.
* layout.cc (Layout::attach_allocated_section_to_segment):
Take new const Target* argument. If target->isolate_execinstr(), act
like --rosegment.
(Layout::find_first_load_seg): Take new const Target* argument;
if target->isolate_execinstr(), reject PF_X segments.
(Layout::relaxation_loop_body): Update caller.
(Layout::set_segment_offsets): If target->isolate_execinstr(),
reset file offset to zero when we hit LOAD_SEG, and then do a second
loop over the segments before LOAD_SEG to reassign offsets after
addresses have been determined. Handle target->rosegment_gap().
(Layout::attach_section_to_segment): Take new const Target* argument;
pass it to attach_allocated_section_to_segment.
(Layout::make_output_section): Update caller.
(Layout::attach_sections_to_segments): Take new const Target* argument;
pass it to attach_section_to_segment.
* gold.cc (queue_middle_tasks): Update caller.
* layout.h (Layout): Update method decls with new arguments.
* arm.cc (Target_arm::Target_arm): Take optional argument for the
Target_info pointer to use.
(Target_arm::do_make_data_plt): New virtual method.
(Target_arm::make_data_plt): New method that calls it.
(Target_arm::make_plt_entry): Use it.
(Output_data_plt_arm::Output_data_plt_arm): Take additional argument
for the section alignment.
(Output_data_plt_arm::do_first_plt_entry_offset): New abstract virtual
method.
(Output_data_plt_arm::first_plt_entry_offset): Call it.
(Output_data_plt_arm::do_get_plt_entry_size): New abstract virtual
method.
(Output_data_plt_arm::get_plt_entry_size): Call it.
(Output_data_plt_arm::do_fill_plt_entry): New abstract virtual method.
(Output_data_plt_arm::fill_plt_entry): New method that calls it.
(Output_data_plt_arm::do_fill_first_plt_entry): New abstract virtual
method.
(Output_data_plt_arm::fill_first_plt_entry): New method that calls it.
(Output_data_plt_arm::set_final_data_size): Use get_plt_entry_size
method instead of sizeof(plt_entry).
(Output_data_plt_arm::add_entry): Likewise.
Use first_plt_entry_offset method instead of sizeof(first_plt_entry).
(Target_arm::first_plt_entry_offset): Call method on this->plt_ rather
than static method.
(Target_arm::plt_entry_size): Likewise.
(Output_data_plt_arm::first_plt_entry, Output_data_plt_arm::plt_entry):
Move to ...
(Output_data_plt_arm_standard): ... here, new class.
(Output_data_plt_arm::do_write): Move guts of PLT filling to...
(Output_data_plt_arm_standard::do_fill_first_plt_entry): ... here ...
(Output_data_plt_arm_standard::do_fill_plt_entry): ... and here.
* x86_64.cc (Output_data_plt_x86_64::Output_data_plt_x86_64):
Take additional argument for the PLT entry size.
(Output_data_plt_x86_64::get_tlsdesc_plt_offset):
Use get_plt_entry_size method rather than plt_entry_size variable.
(Output_data_plt_x86_64::reserve_slot): Likewise.
(Output_data_plt_x86_64::do_adjust_output_section): Likewise.
(Output_data_plt_x86_64::add_entry): Likewise.
(Output_data_plt_x86_64::add_local_ifunc_entry): Likewise.
(Output_data_plt_x86_64::address_for_global): Likewise.
(Output_data_plt_x86_64::address_for_local): Likewise.
(Output_data_plt_x86_64::set_final_data_size): Likewise.
(Output_data_plt_x86_64::first_plt_entry_offset): Likewise.
Make method non-static.
(Output_data_plt_x86_64::do_get_plt_entry_size): New abstract virtual
method.
(Output_data_plt_x86_64::get_plt_entry_size): Just call that.
(Output_data_plt_x86_64::do_add_eh_frame): New abstract virtual method.
(Output_data_plt_x86_64::add_eh_frame): New method to call it.
(Output_data_plt_x86_64::do_fill_first_plt_entry): New abstract
virtual method.
(Output_data_plt_x86_64::fill_first_plt_entry): New method to call it.
(Output_data_plt_x86_64::do_fill_plt_entry): New abstract
virtual method.
(Output_data_plt_x86_64::fill_plt_entry): New method to call it.
(Output_data_plt_x86_64::do_fill_tlsdesc_entry): New abstract
virtual method.
(Output_data_plt_x86_64::fill_tlsdesc_entry): New method to call it.
(Output_data_plt_x86_64::plt_entry_size)
(Output_data_plt_x86_64::first_plt_entry)
(Output_data_plt_x86_64::plt_entry)
(Output_data_plt_x86_64::tlsdesc_plt_entry)
(Output_data_plt_x86_64::plt_eh_frame_fde_size)
(Output_data_plt_x86_64::plt_eh_frame_fde): Move to ...
(Output_data_plt_x86_64_standard): ... here, new class.
(Target_x86_64::Target_x86_64): Take optional argument for the
Target_info pointer to use.
(Target_x86_64::do_make_data_plt): New virtual method.
(Target_x86_64::make_data_plt): New method to call it.
(Target_x86_64::init_got_plt_for_update): Use that.
Call this->plt_->add_eh_frame method here.
(Output_data_plt_x86_64::init): Don't do add_eh_frame_for_plt here.
(Target_x86_64::first_plt_entry_offset): Call method on this->plt_
rather than static method.
(Target_x86_64::plt_entry_size): Likewise.
(Output_data_plt_x86_64::do_write): Use get_plt_entry_size method
rather than plt_entry_size variable. Move guts of PLT filling to...
(Output_data_plt_x86_64_standard::do_fill_first_plt_entry): ... here ...
(Output_data_plt_x86_64_standard::do_fill_plt_entry): ... and here ...
(Output_data_plt_x86_64_standard::do_fill_tlsdesc_entry): ... and here.
* i386.cc (Output_data_plt_i386::Output_data_plt_i386): Take
additional argument for the section alignment.
Don't do add_eh_frame_for_plt here.
(Output_data_plt_i386::first_plt_entry_offset): Make the method
non-static. Use get_plt_entry_size method rather than plt_entry_size
variable.
(Output_data_plt_i386::do_get_plt_entry_size): New abstract virtual
method.
(Output_data_plt_i386::get_plt_entry_size): Call it.
(Output_data_plt_i386::do_add_eh_frame): New abstract virtual method.
(Output_data_plt_i386::add_eh_frame): New method to call it.
(Output_data_plt_i386::do_fill_first_plt_entry): New abstract virtual
method.
(Output_data_plt_i386::fill_first_plt_entry): New method to call it.
(Output_data_plt_i386::do_fill_plt_entry): New abstract virtual
method.
(Output_data_plt_i386::fill_plt_entry): New method to call it.
(Output_data_plt_i386::set_final_data_size): Use get_plt_entry_size
method instead of plt_entry_size.
(Output_data_plt_i386::plt_entry_size)
(Output_data_plt_i386::plt_eh_frame_fde_size)
(Output_data_plt_i386::plt_eh_frame_fde): Move to ...
(Output_data_plt_i386_standard): ... here, new class.
(Output_data_plt_i386_exec): New class.
(Output_data_plt_i386::exec_first_plt_entry): Move to ...
(Output_data_plt_i386_exec::first_plt_entry): ... here.
(Output_data_plt_i386::exec_plt_entry): Move to ...
(Output_data_plt_i386_exec::plt_entry): ... here.
(Output_data_plt_i386_dyn): New class.
(Output_data_plt_i386::first_plt_entry): Move to ...
(Output_data_plt_i386_dyn::first_plt_entry): ... here.
(Output_data_plt_i386::dyn_plt_entry): Move to ...
(Output_data_plt_i386_dyn::plt_entry): ... here.
(Target_i386::Target_i386): Take optional argument for the Target_info
pointer to use.
(Target_i386::do_make_data_plt): New virtual method.
(Target_i386::make_data_plt): New method to call it.
(Target_i386::make_plt_section): Use that.
Call this->plt_->add_eh_frame method here.
(Output_data_plt_i386::add_entry): Use get_plt_entry_size method
rather than plt_entry_size variable.
(Output_data_plt_i386::add_local_ifunc_entry): Likewise.
(Output_data_plt_i386::address_for_local): Likewise.
(Output_data_plt_i386::do_write): Likewise.
Move guts of PLT filling to...
(Output_data_plt_i386_exec::do_fill_first_plt_entry): ... here ...
(Output_data_plt_i386_exec::do_fill_plt_entry): ... and here ...
(Output_data_plt_i386_dyn::do_fill_first_plt_entry): ... and here ...
(Output_data_plt_i386_dyn::do_fill_plt_entry): ... and here.
Change-Id: Id24b95600489835ff5e860a39c147203d4380c2b
2012-05-03 05:37:24 +08:00
|
|
|
virtual Target*
|
|
|
|
do_recognize(Input_file*, off_t, int, int, int)
|
2007-10-03 08:34:49 +08:00
|
|
|
{
|
|
|
|
if (size == 32)
|
|
|
|
{
|
|
|
|
if (!big_endian)
|
|
|
|
{
|
|
|
|
#ifdef HAVE_TARGET_32_LITTLE
|
|
|
|
return &target_test_32_little;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
#ifdef HAVE_TARGET_32_BIG
|
|
|
|
return &target_test_32_big;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (!big_endian)
|
|
|
|
{
|
|
|
|
#ifdef HAVE_TARGET_64_LITTLE
|
|
|
|
return &target_test_64_little;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
#ifdef HAVE_TARGET_64_BIG
|
|
|
|
return &target_test_64_big;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
2008-02-13 10:44:50 +08:00
|
|
|
|
* configure.ac (ENABLE_GOLD): Consider *-*-nacl* targets ELF.
* configure: Regenerate.
gold/
* nacl.cc: New file.
* nacl.h: New file.
* Makefile.am (CCFILES, HFILES): Add them.
* Makefile.in: Regenerate.
* i386.cc (Output_data_plt_i386_nacl): New class.
(Output_data_plt_i386_nacl_exec): New class.
(Output_data_plt_i386_nacl_dyn): New class.
(Target_i386_nacl): New class.
(Target_selector_i386_nacl): New class.
(target_selector_i386): Use it instead of Target_selector_i386.
* x86_64.cc (Output_data_plt_x86_64_nacl): New class.
(Target_x86_64_nacl): New class.
(Target_selector_x86_64_nacl): New class.
(target_selector_x86_64, target_selector_x32): Use it instead of
Target_selector_x86_64.
* arm.cc (Output_data_plt_arm_nacl): New class.
(Target_arm_nacl): New class.
(Target_selector_arm_nacl): New class.
(target_selector_arm, target_selector_armbe): Use it instead of
Target_selector_arm.
* target-select.cc (select_target): Take new Input_file* and off_t
arguments, pass them on to recognize method of selector.
* object.cc (make_elf_sized_object): Update caller.
* parameters.cc (parameters_force_valid_target): Likewise.
* incremental.cc (make_sized_incremental_binary): Likewise.
* target-select.h: Update decl.
(Target_selector::recognize): Take new Input_file* argument,
pass it on to do_recognize.
(Target_selector::do_recognize): Take new Input_file* argument.
* freebsd.h (Target_selector_freebsd::do_recognize): Likewise.
* powerpc.cc (Target_selector_powerpc::do_recognize): Likewise.
* sparc.cc (Target_selector_sparc::do_recognize): Likewise.
* testsuite/testfile.cc (Target_selector::do_recognize): Likewise.
* target.h (Target::Target_info): New members isolate_execinstr
and rosegment_gap.
(Target::isolate_execinstr, Target::rosegment_gap): New methods.
* arm.cc (Target_arm::arm_info): Update initializer.
* i386.cc (Target_i386::i386_info): Likewise.
* powerpc.cc (Target_powerpc::powerpc_info): Likewise.
* sparc.cc (Target_sparc::sparc_info): Likewise.
* x86_64.cc (Target_x86_64::x86_64_info): Likewise.
* testsuite/testfile.cc (Target_test::test_target_info): Likewise.
* layout.cc (Layout::attach_allocated_section_to_segment):
Take new const Target* argument. If target->isolate_execinstr(), act
like --rosegment.
(Layout::find_first_load_seg): Take new const Target* argument;
if target->isolate_execinstr(), reject PF_X segments.
(Layout::relaxation_loop_body): Update caller.
(Layout::set_segment_offsets): If target->isolate_execinstr(),
reset file offset to zero when we hit LOAD_SEG, and then do a second
loop over the segments before LOAD_SEG to reassign offsets after
addresses have been determined. Handle target->rosegment_gap().
(Layout::attach_section_to_segment): Take new const Target* argument;
pass it to attach_allocated_section_to_segment.
(Layout::make_output_section): Update caller.
(Layout::attach_sections_to_segments): Take new const Target* argument;
pass it to attach_section_to_segment.
* gold.cc (queue_middle_tasks): Update caller.
* layout.h (Layout): Update method decls with new arguments.
* arm.cc (Target_arm::Target_arm): Take optional argument for the
Target_info pointer to use.
(Target_arm::do_make_data_plt): New virtual method.
(Target_arm::make_data_plt): New method that calls it.
(Target_arm::make_plt_entry): Use it.
(Output_data_plt_arm::Output_data_plt_arm): Take additional argument
for the section alignment.
(Output_data_plt_arm::do_first_plt_entry_offset): New abstract virtual
method.
(Output_data_plt_arm::first_plt_entry_offset): Call it.
(Output_data_plt_arm::do_get_plt_entry_size): New abstract virtual
method.
(Output_data_plt_arm::get_plt_entry_size): Call it.
(Output_data_plt_arm::do_fill_plt_entry): New abstract virtual method.
(Output_data_plt_arm::fill_plt_entry): New method that calls it.
(Output_data_plt_arm::do_fill_first_plt_entry): New abstract virtual
method.
(Output_data_plt_arm::fill_first_plt_entry): New method that calls it.
(Output_data_plt_arm::set_final_data_size): Use get_plt_entry_size
method instead of sizeof(plt_entry).
(Output_data_plt_arm::add_entry): Likewise.
Use first_plt_entry_offset method instead of sizeof(first_plt_entry).
(Target_arm::first_plt_entry_offset): Call method on this->plt_ rather
than static method.
(Target_arm::plt_entry_size): Likewise.
(Output_data_plt_arm::first_plt_entry, Output_data_plt_arm::plt_entry):
Move to ...
(Output_data_plt_arm_standard): ... here, new class.
(Output_data_plt_arm::do_write): Move guts of PLT filling to...
(Output_data_plt_arm_standard::do_fill_first_plt_entry): ... here ...
(Output_data_plt_arm_standard::do_fill_plt_entry): ... and here.
* x86_64.cc (Output_data_plt_x86_64::Output_data_plt_x86_64):
Take additional argument for the PLT entry size.
(Output_data_plt_x86_64::get_tlsdesc_plt_offset):
Use get_plt_entry_size method rather than plt_entry_size variable.
(Output_data_plt_x86_64::reserve_slot): Likewise.
(Output_data_plt_x86_64::do_adjust_output_section): Likewise.
(Output_data_plt_x86_64::add_entry): Likewise.
(Output_data_plt_x86_64::add_local_ifunc_entry): Likewise.
(Output_data_plt_x86_64::address_for_global): Likewise.
(Output_data_plt_x86_64::address_for_local): Likewise.
(Output_data_plt_x86_64::set_final_data_size): Likewise.
(Output_data_plt_x86_64::first_plt_entry_offset): Likewise.
Make method non-static.
(Output_data_plt_x86_64::do_get_plt_entry_size): New abstract virtual
method.
(Output_data_plt_x86_64::get_plt_entry_size): Just call that.
(Output_data_plt_x86_64::do_add_eh_frame): New abstract virtual method.
(Output_data_plt_x86_64::add_eh_frame): New method to call it.
(Output_data_plt_x86_64::do_fill_first_plt_entry): New abstract
virtual method.
(Output_data_plt_x86_64::fill_first_plt_entry): New method to call it.
(Output_data_plt_x86_64::do_fill_plt_entry): New abstract
virtual method.
(Output_data_plt_x86_64::fill_plt_entry): New method to call it.
(Output_data_plt_x86_64::do_fill_tlsdesc_entry): New abstract
virtual method.
(Output_data_plt_x86_64::fill_tlsdesc_entry): New method to call it.
(Output_data_plt_x86_64::plt_entry_size)
(Output_data_plt_x86_64::first_plt_entry)
(Output_data_plt_x86_64::plt_entry)
(Output_data_plt_x86_64::tlsdesc_plt_entry)
(Output_data_plt_x86_64::plt_eh_frame_fde_size)
(Output_data_plt_x86_64::plt_eh_frame_fde): Move to ...
(Output_data_plt_x86_64_standard): ... here, new class.
(Target_x86_64::Target_x86_64): Take optional argument for the
Target_info pointer to use.
(Target_x86_64::do_make_data_plt): New virtual method.
(Target_x86_64::make_data_plt): New method to call it.
(Target_x86_64::init_got_plt_for_update): Use that.
Call this->plt_->add_eh_frame method here.
(Output_data_plt_x86_64::init): Don't do add_eh_frame_for_plt here.
(Target_x86_64::first_plt_entry_offset): Call method on this->plt_
rather than static method.
(Target_x86_64::plt_entry_size): Likewise.
(Output_data_plt_x86_64::do_write): Use get_plt_entry_size method
rather than plt_entry_size variable. Move guts of PLT filling to...
(Output_data_plt_x86_64_standard::do_fill_first_plt_entry): ... here ...
(Output_data_plt_x86_64_standard::do_fill_plt_entry): ... and here ...
(Output_data_plt_x86_64_standard::do_fill_tlsdesc_entry): ... and here.
* i386.cc (Output_data_plt_i386::Output_data_plt_i386): Take
additional argument for the section alignment.
Don't do add_eh_frame_for_plt here.
(Output_data_plt_i386::first_plt_entry_offset): Make the method
non-static. Use get_plt_entry_size method rather than plt_entry_size
variable.
(Output_data_plt_i386::do_get_plt_entry_size): New abstract virtual
method.
(Output_data_plt_i386::get_plt_entry_size): Call it.
(Output_data_plt_i386::do_add_eh_frame): New abstract virtual method.
(Output_data_plt_i386::add_eh_frame): New method to call it.
(Output_data_plt_i386::do_fill_first_plt_entry): New abstract virtual
method.
(Output_data_plt_i386::fill_first_plt_entry): New method to call it.
(Output_data_plt_i386::do_fill_plt_entry): New abstract virtual
method.
(Output_data_plt_i386::fill_plt_entry): New method to call it.
(Output_data_plt_i386::set_final_data_size): Use get_plt_entry_size
method instead of plt_entry_size.
(Output_data_plt_i386::plt_entry_size)
(Output_data_plt_i386::plt_eh_frame_fde_size)
(Output_data_plt_i386::plt_eh_frame_fde): Move to ...
(Output_data_plt_i386_standard): ... here, new class.
(Output_data_plt_i386_exec): New class.
(Output_data_plt_i386::exec_first_plt_entry): Move to ...
(Output_data_plt_i386_exec::first_plt_entry): ... here.
(Output_data_plt_i386::exec_plt_entry): Move to ...
(Output_data_plt_i386_exec::plt_entry): ... here.
(Output_data_plt_i386_dyn): New class.
(Output_data_plt_i386::first_plt_entry): Move to ...
(Output_data_plt_i386_dyn::first_plt_entry): ... here.
(Output_data_plt_i386::dyn_plt_entry): Move to ...
(Output_data_plt_i386_dyn::plt_entry): ... here.
(Target_i386::Target_i386): Take optional argument for the Target_info
pointer to use.
(Target_i386::do_make_data_plt): New virtual method.
(Target_i386::make_data_plt): New method to call it.
(Target_i386::make_plt_section): Use that.
Call this->plt_->add_eh_frame method here.
(Output_data_plt_i386::add_entry): Use get_plt_entry_size method
rather than plt_entry_size variable.
(Output_data_plt_i386::add_local_ifunc_entry): Likewise.
(Output_data_plt_i386::address_for_local): Likewise.
(Output_data_plt_i386::do_write): Likewise.
Move guts of PLT filling to...
(Output_data_plt_i386_exec::do_fill_first_plt_entry): ... here ...
(Output_data_plt_i386_exec::do_fill_plt_entry): ... and here ...
(Output_data_plt_i386_dyn::do_fill_first_plt_entry): ... and here ...
(Output_data_plt_i386_dyn::do_fill_plt_entry): ... and here.
Change-Id: Id24b95600489835ff5e860a39c147203d4380c2b
2012-05-03 05:37:24 +08:00
|
|
|
virtual Target*
|
2008-03-26 05:39:01 +08:00
|
|
|
do_recognize_by_name(const char*)
|
2008-02-13 10:44:50 +08:00
|
|
|
{ return NULL; }
|
2008-03-26 05:39:01 +08:00
|
|
|
|
* configure.ac (ENABLE_GOLD): Consider *-*-nacl* targets ELF.
* configure: Regenerate.
gold/
* nacl.cc: New file.
* nacl.h: New file.
* Makefile.am (CCFILES, HFILES): Add them.
* Makefile.in: Regenerate.
* i386.cc (Output_data_plt_i386_nacl): New class.
(Output_data_plt_i386_nacl_exec): New class.
(Output_data_plt_i386_nacl_dyn): New class.
(Target_i386_nacl): New class.
(Target_selector_i386_nacl): New class.
(target_selector_i386): Use it instead of Target_selector_i386.
* x86_64.cc (Output_data_plt_x86_64_nacl): New class.
(Target_x86_64_nacl): New class.
(Target_selector_x86_64_nacl): New class.
(target_selector_x86_64, target_selector_x32): Use it instead of
Target_selector_x86_64.
* arm.cc (Output_data_plt_arm_nacl): New class.
(Target_arm_nacl): New class.
(Target_selector_arm_nacl): New class.
(target_selector_arm, target_selector_armbe): Use it instead of
Target_selector_arm.
* target-select.cc (select_target): Take new Input_file* and off_t
arguments, pass them on to recognize method of selector.
* object.cc (make_elf_sized_object): Update caller.
* parameters.cc (parameters_force_valid_target): Likewise.
* incremental.cc (make_sized_incremental_binary): Likewise.
* target-select.h: Update decl.
(Target_selector::recognize): Take new Input_file* argument,
pass it on to do_recognize.
(Target_selector::do_recognize): Take new Input_file* argument.
* freebsd.h (Target_selector_freebsd::do_recognize): Likewise.
* powerpc.cc (Target_selector_powerpc::do_recognize): Likewise.
* sparc.cc (Target_selector_sparc::do_recognize): Likewise.
* testsuite/testfile.cc (Target_selector::do_recognize): Likewise.
* target.h (Target::Target_info): New members isolate_execinstr
and rosegment_gap.
(Target::isolate_execinstr, Target::rosegment_gap): New methods.
* arm.cc (Target_arm::arm_info): Update initializer.
* i386.cc (Target_i386::i386_info): Likewise.
* powerpc.cc (Target_powerpc::powerpc_info): Likewise.
* sparc.cc (Target_sparc::sparc_info): Likewise.
* x86_64.cc (Target_x86_64::x86_64_info): Likewise.
* testsuite/testfile.cc (Target_test::test_target_info): Likewise.
* layout.cc (Layout::attach_allocated_section_to_segment):
Take new const Target* argument. If target->isolate_execinstr(), act
like --rosegment.
(Layout::find_first_load_seg): Take new const Target* argument;
if target->isolate_execinstr(), reject PF_X segments.
(Layout::relaxation_loop_body): Update caller.
(Layout::set_segment_offsets): If target->isolate_execinstr(),
reset file offset to zero when we hit LOAD_SEG, and then do a second
loop over the segments before LOAD_SEG to reassign offsets after
addresses have been determined. Handle target->rosegment_gap().
(Layout::attach_section_to_segment): Take new const Target* argument;
pass it to attach_allocated_section_to_segment.
(Layout::make_output_section): Update caller.
(Layout::attach_sections_to_segments): Take new const Target* argument;
pass it to attach_section_to_segment.
* gold.cc (queue_middle_tasks): Update caller.
* layout.h (Layout): Update method decls with new arguments.
* arm.cc (Target_arm::Target_arm): Take optional argument for the
Target_info pointer to use.
(Target_arm::do_make_data_plt): New virtual method.
(Target_arm::make_data_plt): New method that calls it.
(Target_arm::make_plt_entry): Use it.
(Output_data_plt_arm::Output_data_plt_arm): Take additional argument
for the section alignment.
(Output_data_plt_arm::do_first_plt_entry_offset): New abstract virtual
method.
(Output_data_plt_arm::first_plt_entry_offset): Call it.
(Output_data_plt_arm::do_get_plt_entry_size): New abstract virtual
method.
(Output_data_plt_arm::get_plt_entry_size): Call it.
(Output_data_plt_arm::do_fill_plt_entry): New abstract virtual method.
(Output_data_plt_arm::fill_plt_entry): New method that calls it.
(Output_data_plt_arm::do_fill_first_plt_entry): New abstract virtual
method.
(Output_data_plt_arm::fill_first_plt_entry): New method that calls it.
(Output_data_plt_arm::set_final_data_size): Use get_plt_entry_size
method instead of sizeof(plt_entry).
(Output_data_plt_arm::add_entry): Likewise.
Use first_plt_entry_offset method instead of sizeof(first_plt_entry).
(Target_arm::first_plt_entry_offset): Call method on this->plt_ rather
than static method.
(Target_arm::plt_entry_size): Likewise.
(Output_data_plt_arm::first_plt_entry, Output_data_plt_arm::plt_entry):
Move to ...
(Output_data_plt_arm_standard): ... here, new class.
(Output_data_plt_arm::do_write): Move guts of PLT filling to...
(Output_data_plt_arm_standard::do_fill_first_plt_entry): ... here ...
(Output_data_plt_arm_standard::do_fill_plt_entry): ... and here.
* x86_64.cc (Output_data_plt_x86_64::Output_data_plt_x86_64):
Take additional argument for the PLT entry size.
(Output_data_plt_x86_64::get_tlsdesc_plt_offset):
Use get_plt_entry_size method rather than plt_entry_size variable.
(Output_data_plt_x86_64::reserve_slot): Likewise.
(Output_data_plt_x86_64::do_adjust_output_section): Likewise.
(Output_data_plt_x86_64::add_entry): Likewise.
(Output_data_plt_x86_64::add_local_ifunc_entry): Likewise.
(Output_data_plt_x86_64::address_for_global): Likewise.
(Output_data_plt_x86_64::address_for_local): Likewise.
(Output_data_plt_x86_64::set_final_data_size): Likewise.
(Output_data_plt_x86_64::first_plt_entry_offset): Likewise.
Make method non-static.
(Output_data_plt_x86_64::do_get_plt_entry_size): New abstract virtual
method.
(Output_data_plt_x86_64::get_plt_entry_size): Just call that.
(Output_data_plt_x86_64::do_add_eh_frame): New abstract virtual method.
(Output_data_plt_x86_64::add_eh_frame): New method to call it.
(Output_data_plt_x86_64::do_fill_first_plt_entry): New abstract
virtual method.
(Output_data_plt_x86_64::fill_first_plt_entry): New method to call it.
(Output_data_plt_x86_64::do_fill_plt_entry): New abstract
virtual method.
(Output_data_plt_x86_64::fill_plt_entry): New method to call it.
(Output_data_plt_x86_64::do_fill_tlsdesc_entry): New abstract
virtual method.
(Output_data_plt_x86_64::fill_tlsdesc_entry): New method to call it.
(Output_data_plt_x86_64::plt_entry_size)
(Output_data_plt_x86_64::first_plt_entry)
(Output_data_plt_x86_64::plt_entry)
(Output_data_plt_x86_64::tlsdesc_plt_entry)
(Output_data_plt_x86_64::plt_eh_frame_fde_size)
(Output_data_plt_x86_64::plt_eh_frame_fde): Move to ...
(Output_data_plt_x86_64_standard): ... here, new class.
(Target_x86_64::Target_x86_64): Take optional argument for the
Target_info pointer to use.
(Target_x86_64::do_make_data_plt): New virtual method.
(Target_x86_64::make_data_plt): New method to call it.
(Target_x86_64::init_got_plt_for_update): Use that.
Call this->plt_->add_eh_frame method here.
(Output_data_plt_x86_64::init): Don't do add_eh_frame_for_plt here.
(Target_x86_64::first_plt_entry_offset): Call method on this->plt_
rather than static method.
(Target_x86_64::plt_entry_size): Likewise.
(Output_data_plt_x86_64::do_write): Use get_plt_entry_size method
rather than plt_entry_size variable. Move guts of PLT filling to...
(Output_data_plt_x86_64_standard::do_fill_first_plt_entry): ... here ...
(Output_data_plt_x86_64_standard::do_fill_plt_entry): ... and here ...
(Output_data_plt_x86_64_standard::do_fill_tlsdesc_entry): ... and here.
* i386.cc (Output_data_plt_i386::Output_data_plt_i386): Take
additional argument for the section alignment.
Don't do add_eh_frame_for_plt here.
(Output_data_plt_i386::first_plt_entry_offset): Make the method
non-static. Use get_plt_entry_size method rather than plt_entry_size
variable.
(Output_data_plt_i386::do_get_plt_entry_size): New abstract virtual
method.
(Output_data_plt_i386::get_plt_entry_size): Call it.
(Output_data_plt_i386::do_add_eh_frame): New abstract virtual method.
(Output_data_plt_i386::add_eh_frame): New method to call it.
(Output_data_plt_i386::do_fill_first_plt_entry): New abstract virtual
method.
(Output_data_plt_i386::fill_first_plt_entry): New method to call it.
(Output_data_plt_i386::do_fill_plt_entry): New abstract virtual
method.
(Output_data_plt_i386::fill_plt_entry): New method to call it.
(Output_data_plt_i386::set_final_data_size): Use get_plt_entry_size
method instead of plt_entry_size.
(Output_data_plt_i386::plt_entry_size)
(Output_data_plt_i386::plt_eh_frame_fde_size)
(Output_data_plt_i386::plt_eh_frame_fde): Move to ...
(Output_data_plt_i386_standard): ... here, new class.
(Output_data_plt_i386_exec): New class.
(Output_data_plt_i386::exec_first_plt_entry): Move to ...
(Output_data_plt_i386_exec::first_plt_entry): ... here.
(Output_data_plt_i386::exec_plt_entry): Move to ...
(Output_data_plt_i386_exec::plt_entry): ... here.
(Output_data_plt_i386_dyn): New class.
(Output_data_plt_i386::first_plt_entry): Move to ...
(Output_data_plt_i386_dyn::first_plt_entry): ... here.
(Output_data_plt_i386::dyn_plt_entry): Move to ...
(Output_data_plt_i386_dyn::plt_entry): ... here.
(Target_i386::Target_i386): Take optional argument for the Target_info
pointer to use.
(Target_i386::do_make_data_plt): New virtual method.
(Target_i386::make_data_plt): New method to call it.
(Target_i386::make_plt_section): Use that.
Call this->plt_->add_eh_frame method here.
(Output_data_plt_i386::add_entry): Use get_plt_entry_size method
rather than plt_entry_size variable.
(Output_data_plt_i386::add_local_ifunc_entry): Likewise.
(Output_data_plt_i386::address_for_local): Likewise.
(Output_data_plt_i386::do_write): Likewise.
Move guts of PLT filling to...
(Output_data_plt_i386_exec::do_fill_first_plt_entry): ... here ...
(Output_data_plt_i386_exec::do_fill_plt_entry): ... and here ...
(Output_data_plt_i386_dyn::do_fill_first_plt_entry): ... and here ...
(Output_data_plt_i386_dyn::do_fill_plt_entry): ... and here.
Change-Id: Id24b95600489835ff5e860a39c147203d4380c2b
2012-05-03 05:37:24 +08:00
|
|
|
virtual void
|
2008-03-26 05:39:01 +08:00
|
|
|
do_supported_names(std::vector<const char*>*)
|
|
|
|
{ }
|
2006-12-01 07:52:50 +08:00
|
|
|
};
|
|
|
|
|
2007-10-03 08:34:49 +08:00
|
|
|
// Register the test target selectors. These don't need to be
|
|
|
|
// conditionally compiled, as they will return NULL if there is no
|
|
|
|
// support for them.
|
2006-12-01 07:52:50 +08:00
|
|
|
|
2007-10-03 08:34:49 +08:00
|
|
|
Target_selector_test<32, false> target_selector_test_32_little;
|
|
|
|
Target_selector_test<32, true> target_selector_test_32_big;
|
|
|
|
Target_selector_test<64, false> target_selector_test_64_little;
|
|
|
|
Target_selector_test<64, true> target_selector_test_64_big;
|
2006-12-01 07:52:50 +08:00
|
|
|
|
|
|
|
// A simple ELF object with one empty section, named ".test" and one
|
|
|
|
// globally visible symbol named "test".
|
|
|
|
|
2007-10-03 08:34:49 +08:00
|
|
|
const unsigned char test_file_1_32_little[] =
|
2006-12-01 07:52:50 +08:00
|
|
|
{
|
|
|
|
// Ehdr
|
|
|
|
// EI_MAG[0-3]
|
|
|
|
0x7f, 'E', 'L', 'F',
|
|
|
|
// EI_CLASS: 32 bit.
|
|
|
|
1,
|
|
|
|
// EI_DATA: little endian
|
|
|
|
1,
|
|
|
|
// EI_VERSION
|
|
|
|
1,
|
|
|
|
// EI_OSABI
|
|
|
|
0,
|
|
|
|
// EI_ABIVERSION
|
|
|
|
0,
|
|
|
|
// EI_PAD
|
|
|
|
0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// e_type: ET_REL
|
|
|
|
1, 0,
|
|
|
|
// e_machine: a magic value used for testing.
|
|
|
|
0xff, 0xff,
|
|
|
|
// e_version
|
|
|
|
1, 0, 0, 0,
|
|
|
|
// e_entry
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// e_phoff
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// e_shoff: starts right after file header
|
|
|
|
52, 0, 0, 0,
|
|
|
|
// e_flags
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// e_ehsize
|
|
|
|
52, 0,
|
|
|
|
// e_phentsize
|
|
|
|
32, 0,
|
|
|
|
// e_phnum
|
|
|
|
0, 0,
|
|
|
|
// e_shentsize
|
|
|
|
40, 0,
|
|
|
|
// e_shnum: dummy, .test, .symtab, .strtab, .shstrtab
|
|
|
|
5, 0,
|
|
|
|
// e_shstrndx
|
|
|
|
4, 0,
|
|
|
|
|
|
|
|
// Offset 52
|
|
|
|
// Shdr 0: dummy entry
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 92
|
|
|
|
// Shdr 1: .test
|
|
|
|
// sh_name: after initial null
|
|
|
|
1, 0, 0, 0,
|
|
|
|
// sh_type: SHT_PROGBITS
|
|
|
|
1, 0, 0, 0,
|
|
|
|
// sh_flags: SHF_ALLOC
|
|
|
|
2, 0, 0, 0,
|
|
|
|
// sh_addr
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_offset: after file header + 5 section headers
|
|
|
|
252, 0, 0, 0,
|
|
|
|
// sh_size
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_link
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_info
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_addralign
|
|
|
|
1, 0, 0, 0,
|
|
|
|
// sh_entsize
|
|
|
|
0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 132
|
|
|
|
// Shdr 2: .symtab
|
|
|
|
// sh_name: 1 null byte + ".test\0"
|
|
|
|
7, 0, 0, 0,
|
|
|
|
// sh_type: SHT_SYMTAB
|
|
|
|
2, 0, 0, 0,
|
|
|
|
// sh_flags
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_addr
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_offset: after file header + 5 section headers + empty section
|
|
|
|
252, 0, 0, 0,
|
|
|
|
// sh_size: two symbols: dummy symbol + test symbol
|
|
|
|
32, 0, 0, 0,
|
|
|
|
// sh_link: to .strtab
|
|
|
|
3, 0, 0, 0,
|
|
|
|
// sh_info: one local symbol, the dummy symbol
|
|
|
|
1, 0, 0, 0,
|
|
|
|
// sh_addralign
|
|
|
|
4, 0, 0, 0,
|
|
|
|
// sh_entsize: size of symbol
|
|
|
|
16, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 172
|
|
|
|
// Shdr 3: .strtab
|
|
|
|
// sh_name: 1 null byte + ".test\0" + ".symtab\0"
|
|
|
|
15, 0, 0, 0,
|
|
|
|
// sh_type: SHT_STRTAB
|
|
|
|
3, 0, 0, 0,
|
|
|
|
// sh_flags
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_addr
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_offset: after .symtab section. 284 == 0x11c
|
|
|
|
0x1c, 0x1, 0, 0,
|
|
|
|
// sh_size: 1 null byte + "test\0"
|
|
|
|
6, 0, 0, 0,
|
|
|
|
// sh_link
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_info
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_addralign
|
|
|
|
1, 0, 0, 0,
|
|
|
|
// sh_entsize
|
|
|
|
0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 212
|
|
|
|
// Shdr 4: .shstrtab
|
|
|
|
// sh_name: 1 null byte + ".test\0" + ".symtab\0" + ".strtab\0"
|
|
|
|
23, 0, 0, 0,
|
|
|
|
// sh_type: SHT_STRTAB
|
|
|
|
3, 0, 0, 0,
|
|
|
|
// sh_flags
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_addr
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_offset: after .strtab section. 290 == 0x122
|
|
|
|
0x22, 0x1, 0, 0,
|
|
|
|
// sh_size: all section names
|
|
|
|
33, 0, 0, 0,
|
|
|
|
// sh_link
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_info
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_addralign
|
|
|
|
1, 0, 0, 0,
|
|
|
|
// sh_entsize
|
|
|
|
0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 252
|
|
|
|
// Contents of .symtab section
|
|
|
|
// Symbol 0
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 268
|
|
|
|
// Symbol 1
|
|
|
|
// st_name
|
|
|
|
1, 0, 0, 0,
|
|
|
|
// st_value
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// st_size
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// st_info: STT_NOTYPE, STB_GLOBAL
|
|
|
|
0x10,
|
|
|
|
// st_other
|
|
|
|
0,
|
|
|
|
// st_shndx: In .test
|
|
|
|
1, 0,
|
|
|
|
|
|
|
|
// Offset 284
|
|
|
|
// Contents of .strtab section
|
|
|
|
'\0',
|
|
|
|
't', 'e', 's', 't', '\0',
|
|
|
|
|
|
|
|
// Offset 290
|
|
|
|
// Contents of .shstrtab section
|
|
|
|
'\0',
|
|
|
|
'.', 't', 'e', 's', 't', '\0',
|
|
|
|
'.', 's', 'y', 'm', 't', 'a', 'b', '\0',
|
|
|
|
'.', 's', 't', 'r', 't', 'a', 'b', '\0',
|
|
|
|
'.', 's', 'h', 's', 't', 'r', 't', 'a', 'b', '\0'
|
|
|
|
};
|
|
|
|
|
2007-10-03 08:34:49 +08:00
|
|
|
const unsigned int test_file_1_size_32_little = sizeof test_file_1_32_little;
|
|
|
|
|
|
|
|
// 32-bit big-endian version of test_file_1_32_little.
|
|
|
|
|
|
|
|
const unsigned char test_file_1_32_big[] =
|
|
|
|
{
|
|
|
|
// Ehdr
|
|
|
|
// EI_MAG[0-3]
|
|
|
|
0x7f, 'E', 'L', 'F',
|
|
|
|
// EI_CLASS: 32 bit.
|
|
|
|
1,
|
|
|
|
// EI_DATA: big endian
|
|
|
|
2,
|
|
|
|
// EI_VERSION
|
|
|
|
1,
|
|
|
|
// EI_OSABI
|
|
|
|
0,
|
|
|
|
// EI_ABIVERSION
|
|
|
|
0,
|
|
|
|
// EI_PAD
|
|
|
|
0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// e_type: ET_REL
|
|
|
|
0, 1,
|
|
|
|
// e_machine: a magic value used for testing.
|
|
|
|
0xff, 0xff,
|
|
|
|
// e_version
|
|
|
|
0, 0, 0, 1,
|
|
|
|
// e_entry
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// e_phoff
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// e_shoff: starts right after file header
|
|
|
|
0, 0, 0, 52,
|
|
|
|
// e_flags
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// e_ehsize
|
|
|
|
0, 52,
|
|
|
|
// e_phentsize
|
|
|
|
0, 32,
|
|
|
|
// e_phnum
|
|
|
|
0, 0,
|
|
|
|
// e_shentsize
|
|
|
|
0, 40,
|
|
|
|
// e_shnum: dummy, .test, .symtab, .strtab, .shstrtab
|
|
|
|
0, 5,
|
|
|
|
// e_shstrndx
|
|
|
|
0, 4,
|
|
|
|
|
|
|
|
// Offset 52
|
|
|
|
// Shdr 0: dummy entry
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 92
|
|
|
|
// Shdr 1: .test
|
|
|
|
// sh_name: after initial null
|
|
|
|
0, 0, 0, 1,
|
|
|
|
// sh_type: SHT_PROGBITS
|
|
|
|
0, 0, 0, 1,
|
|
|
|
// sh_flags: SHF_ALLOC
|
|
|
|
0, 0, 0, 2,
|
|
|
|
// sh_addr
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_offset: after file header + 5 section headers
|
|
|
|
0, 0, 0, 252,
|
|
|
|
// sh_size
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_link
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_info
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_addralign
|
|
|
|
0, 0, 0, 1,
|
|
|
|
// sh_entsize
|
|
|
|
0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 132
|
|
|
|
// Shdr 2: .symtab
|
|
|
|
// sh_name: 1 null byte + ".test\0"
|
|
|
|
0, 0, 0, 7,
|
|
|
|
// sh_type: SHT_SYMTAB
|
|
|
|
0, 0, 0, 2,
|
|
|
|
// sh_flags
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_addr
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_offset: after file header + 5 section headers + empty section
|
|
|
|
0, 0, 0, 252,
|
|
|
|
// sh_size: two symbols: dummy symbol + test symbol
|
|
|
|
0, 0, 0, 32,
|
|
|
|
// sh_link: to .strtab
|
|
|
|
0, 0, 0, 3,
|
|
|
|
// sh_info: one local symbol, the dummy symbol
|
|
|
|
0, 0, 0, 1,
|
|
|
|
// sh_addralign
|
|
|
|
0, 0, 0, 4,
|
|
|
|
// sh_entsize: size of symbol
|
|
|
|
0, 0, 0, 16,
|
|
|
|
|
|
|
|
// Offset 172
|
|
|
|
// Shdr 3: .strtab
|
|
|
|
// sh_name: 1 null byte + ".test\0" + ".symtab\0"
|
|
|
|
0, 0, 0, 15,
|
|
|
|
// sh_type: SHT_STRTAB
|
|
|
|
0, 0, 0, 3,
|
|
|
|
// sh_flags
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_addr
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_offset: after .symtab section. 284 == 0x11c
|
|
|
|
0, 0, 0x1, 0x1c,
|
|
|
|
// sh_size: 1 null byte + "test\0"
|
|
|
|
0, 0, 0, 6,
|
|
|
|
// sh_link
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_info
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_addralign
|
|
|
|
0, 0, 0, 1,
|
|
|
|
// sh_entsize
|
|
|
|
0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 212
|
|
|
|
// Shdr 4: .shstrtab
|
|
|
|
// sh_name: 1 null byte + ".test\0" + ".symtab\0" + ".strtab\0"
|
|
|
|
0, 0, 0, 23,
|
|
|
|
// sh_type: SHT_STRTAB
|
|
|
|
0, 0, 0, 3,
|
|
|
|
// sh_flags
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_addr
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_offset: after .strtab section. 290 == 0x122
|
|
|
|
0, 0, 0x1, 0x22,
|
|
|
|
// sh_size: all section names
|
|
|
|
0, 0, 0, 33,
|
|
|
|
// sh_link
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_info
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_addralign
|
|
|
|
0, 0, 0, 1,
|
|
|
|
// sh_entsize
|
|
|
|
0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 252
|
|
|
|
// Contents of .symtab section
|
|
|
|
// Symbol 0
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 268
|
|
|
|
// Symbol 1
|
|
|
|
// st_name
|
|
|
|
0, 0, 0, 1,
|
|
|
|
// st_value
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// st_size
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// st_info: STT_NOTYPE, STB_GLOBAL
|
|
|
|
0x10,
|
|
|
|
// st_other
|
|
|
|
0,
|
|
|
|
// st_shndx: In .test
|
|
|
|
0, 1,
|
|
|
|
|
|
|
|
// Offset 284
|
|
|
|
// Contents of .strtab section
|
|
|
|
'\0',
|
|
|
|
't', 'e', 's', 't', '\0',
|
|
|
|
|
|
|
|
// Offset 290
|
|
|
|
// Contents of .shstrtab section
|
|
|
|
'\0',
|
|
|
|
'.', 't', 'e', 's', 't', '\0',
|
|
|
|
'.', 's', 'y', 'm', 't', 'a', 'b', '\0',
|
|
|
|
'.', 's', 't', 'r', 't', 'a', 'b', '\0',
|
|
|
|
'.', 's', 'h', 's', 't', 'r', 't', 'a', 'b', '\0'
|
|
|
|
};
|
|
|
|
|
|
|
|
const unsigned int test_file_1_size_32_big = sizeof test_file_1_32_big;
|
|
|
|
|
|
|
|
// 64-bit little-endian version of test_file_1_32_little.
|
|
|
|
|
|
|
|
const unsigned char test_file_1_64_little[] =
|
|
|
|
{
|
|
|
|
// Ehdr
|
|
|
|
// EI_MAG[0-3]
|
|
|
|
0x7f, 'E', 'L', 'F',
|
|
|
|
// EI_CLASS: 64 bit.
|
|
|
|
2,
|
|
|
|
// EI_DATA: little endian
|
|
|
|
1,
|
|
|
|
// EI_VERSION
|
|
|
|
1,
|
|
|
|
// EI_OSABI
|
|
|
|
0,
|
|
|
|
// EI_ABIVERSION
|
|
|
|
0,
|
|
|
|
// EI_PAD
|
|
|
|
0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// e_type: ET_REL
|
|
|
|
1, 0,
|
|
|
|
// e_machine: a magic value used for testing.
|
|
|
|
0xff, 0xff,
|
|
|
|
// e_version
|
|
|
|
1, 0, 0, 0,
|
|
|
|
// e_entry
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// e_phoff
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// e_shoff: starts right after file header
|
|
|
|
64, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// e_flags
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// e_ehsize
|
|
|
|
64, 0,
|
|
|
|
// e_phentsize
|
|
|
|
56, 0,
|
|
|
|
// e_phnum
|
|
|
|
0, 0,
|
|
|
|
// e_shentsize
|
|
|
|
64, 0,
|
|
|
|
// e_shnum: dummy, .test, .symtab, .strtab, .shstrtab
|
|
|
|
5, 0,
|
|
|
|
// e_shstrndx
|
|
|
|
4, 0,
|
|
|
|
|
|
|
|
// Offset 64
|
|
|
|
// Shdr 0: dummy entry
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 128
|
|
|
|
// Shdr 1: .test
|
|
|
|
// sh_name: after initial null
|
|
|
|
1, 0, 0, 0,
|
|
|
|
// sh_type: SHT_PROGBITS
|
|
|
|
1, 0, 0, 0,
|
|
|
|
// sh_flags: SHF_ALLOC
|
|
|
|
2, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_addr
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_offset: after file header + 5 section headers. 384 == 0x180.
|
|
|
|
0x80, 0x1, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_size
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_link
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_info
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_addralign
|
|
|
|
1, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_entsize
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 192
|
|
|
|
// Shdr 2: .symtab
|
|
|
|
// sh_name: 1 null byte + ".test\0"
|
|
|
|
7, 0, 0, 0,
|
|
|
|
// sh_type: SHT_SYMTAB
|
|
|
|
2, 0, 0, 0,
|
|
|
|
// sh_flags
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_addr
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_offset: after file header + 5 section headers + empty section
|
|
|
|
// 384 == 0x180.
|
|
|
|
0x80, 0x1, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_size: two symbols: dummy symbol + test symbol
|
|
|
|
48, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_link: to .strtab
|
|
|
|
3, 0, 0, 0,
|
|
|
|
// sh_info: one local symbol, the dummy symbol
|
|
|
|
1, 0, 0, 0,
|
|
|
|
// sh_addralign
|
|
|
|
8, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_entsize: size of symbol
|
|
|
|
24, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 256
|
|
|
|
// Shdr 3: .strtab
|
|
|
|
// sh_name: 1 null byte + ".test\0" + ".symtab\0"
|
|
|
|
15, 0, 0, 0,
|
|
|
|
// sh_type: SHT_STRTAB
|
|
|
|
3, 0, 0, 0,
|
|
|
|
// sh_flags
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_addr
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_offset: after .symtab section. 432 == 0x1b0
|
|
|
|
0xb0, 0x1, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_size: 1 null byte + "test\0"
|
|
|
|
6, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_link
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_info
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_addralign
|
|
|
|
1, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_entsize
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 320
|
|
|
|
// Shdr 4: .shstrtab
|
|
|
|
// sh_name: 1 null byte + ".test\0" + ".symtab\0" + ".strtab\0"
|
|
|
|
23, 0, 0, 0,
|
|
|
|
// sh_type: SHT_STRTAB
|
|
|
|
3, 0, 0, 0,
|
|
|
|
// sh_flags
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_addr
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_offset: after .strtab section. 438 == 0x1b6
|
|
|
|
0xb6, 0x1, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_size: all section names
|
|
|
|
33, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_link
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_info
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_addralign
|
|
|
|
1, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_entsize
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 384
|
|
|
|
// Contents of .symtab section
|
|
|
|
// Symbol 0
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 408
|
|
|
|
// Symbol 1
|
|
|
|
// st_name
|
|
|
|
1, 0, 0, 0,
|
|
|
|
// st_info: STT_NOTYPE, STB_GLOBAL
|
|
|
|
0x10,
|
|
|
|
// st_other
|
|
|
|
0,
|
|
|
|
// st_shndx: In .test
|
|
|
|
1, 0,
|
|
|
|
// st_value
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// st_size
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 432
|
|
|
|
// Contents of .strtab section
|
|
|
|
'\0',
|
|
|
|
't', 'e', 's', 't', '\0',
|
|
|
|
|
|
|
|
// Offset 438
|
|
|
|
// Contents of .shstrtab section
|
|
|
|
'\0',
|
|
|
|
'.', 't', 'e', 's', 't', '\0',
|
|
|
|
'.', 's', 'y', 'm', 't', 'a', 'b', '\0',
|
|
|
|
'.', 's', 't', 'r', 't', 'a', 'b', '\0',
|
|
|
|
'.', 's', 'h', 's', 't', 'r', 't', 'a', 'b', '\0'
|
|
|
|
};
|
|
|
|
|
|
|
|
const unsigned int test_file_1_size_64_little = sizeof test_file_1_64_little;
|
|
|
|
|
|
|
|
// 64-bit big-endian version of test_file_1_32_little.
|
|
|
|
|
|
|
|
const unsigned char test_file_1_64_big[] =
|
|
|
|
{
|
|
|
|
// Ehdr
|
|
|
|
// EI_MAG[0-3]
|
|
|
|
0x7f, 'E', 'L', 'F',
|
|
|
|
// EI_CLASS: 64 bit.
|
|
|
|
2,
|
|
|
|
// EI_DATA: big endian
|
|
|
|
2,
|
|
|
|
// EI_VERSION
|
|
|
|
1,
|
|
|
|
// EI_OSABI
|
|
|
|
0,
|
|
|
|
// EI_ABIVERSION
|
|
|
|
0,
|
|
|
|
// EI_PAD
|
|
|
|
0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// e_type: ET_REL
|
|
|
|
0, 1,
|
|
|
|
// e_machine: a magic value used for testing.
|
|
|
|
0xff, 0xff,
|
|
|
|
// e_version
|
|
|
|
0, 0, 0, 1,
|
|
|
|
// e_entry
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// e_phoff
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// e_shoff: starts right after file header
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 64,
|
|
|
|
// e_flags
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// e_ehsize
|
|
|
|
0, 64,
|
|
|
|
// e_phentsize
|
|
|
|
0, 56,
|
|
|
|
// e_phnum
|
|
|
|
0, 0,
|
|
|
|
// e_shentsize
|
|
|
|
0, 64,
|
|
|
|
// e_shnum: dummy, .test, .symtab, .strtab, .shstrtab
|
|
|
|
0, 5,
|
|
|
|
// e_shstrndx
|
|
|
|
0, 4,
|
|
|
|
|
|
|
|
// Offset 64
|
|
|
|
// Shdr 0: dummy entry
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 128
|
|
|
|
// Shdr 1: .test
|
|
|
|
// sh_name: after initial null
|
|
|
|
0, 0, 0, 1,
|
|
|
|
// sh_type: SHT_PROGBITS
|
|
|
|
0, 0, 0, 1,
|
|
|
|
// sh_flags: SHF_ALLOC
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 2,
|
|
|
|
// sh_addr
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_offset: after file header + 5 section headers. 384 == 0x180.
|
|
|
|
0, 0, 0, 0, 0, 0, 0x1, 0x80,
|
|
|
|
// sh_size
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_link
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_info
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_addralign
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 1,
|
|
|
|
// sh_entsize
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 192
|
|
|
|
// Shdr 2: .symtab
|
|
|
|
// sh_name: 1 null byte + ".test\0"
|
|
|
|
0, 0, 0, 7,
|
|
|
|
// sh_type: SHT_SYMTAB
|
|
|
|
0, 0, 0, 2,
|
|
|
|
// sh_flags
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_addr
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_offset: after file header + 5 section headers + empty section
|
|
|
|
// 384 == 0x180.
|
|
|
|
0, 0, 0, 0, 0, 0, 0x1, 0x80,
|
|
|
|
// sh_size: two symbols: dummy symbol + test symbol
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 48,
|
|
|
|
// sh_link: to .strtab
|
|
|
|
0, 0, 0, 3,
|
|
|
|
// sh_info: one local symbol, the dummy symbol
|
|
|
|
0, 0, 0, 1,
|
|
|
|
// sh_addralign
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 8,
|
|
|
|
// sh_entsize: size of symbol
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 24,
|
|
|
|
|
|
|
|
// Offset 256
|
|
|
|
// Shdr 3: .strtab
|
|
|
|
// sh_name: 1 null byte + ".test\0" + ".symtab\0"
|
|
|
|
0, 0, 0, 15,
|
|
|
|
// sh_type: SHT_STRTAB
|
|
|
|
0, 0, 0, 3,
|
|
|
|
// sh_flags
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_addr
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_offset: after .symtab section. 432 == 0x1b0
|
|
|
|
0, 0, 0, 0, 0, 0, 0x1, 0xb0,
|
|
|
|
// sh_size: 1 null byte + "test\0"
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 6,
|
|
|
|
// sh_link
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_info
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_addralign
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 1,
|
|
|
|
// sh_entsize
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 320
|
|
|
|
// Shdr 4: .shstrtab
|
|
|
|
// sh_name: 1 null byte + ".test\0" + ".symtab\0" + ".strtab\0"
|
|
|
|
0, 0, 0, 23,
|
|
|
|
// sh_type: SHT_STRTAB
|
|
|
|
0, 0, 0, 3,
|
|
|
|
// sh_flags
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_addr
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// sh_offset: after .strtab section. 438 == 0x1b6
|
|
|
|
0, 0, 0, 0, 0, 0, 0x1, 0xb6,
|
|
|
|
// sh_size: all section names
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 33,
|
|
|
|
// sh_link
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_info
|
|
|
|
0, 0, 0, 0,
|
|
|
|
// sh_addralign
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 1,
|
|
|
|
// sh_entsize
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 384
|
|
|
|
// Contents of .symtab section
|
|
|
|
// Symbol 0
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 408
|
|
|
|
// Symbol 1
|
|
|
|
// st_name
|
|
|
|
0, 0, 0, 1,
|
|
|
|
// st_info: STT_NOTYPE, STB_GLOBAL
|
|
|
|
0x10,
|
|
|
|
// st_other
|
|
|
|
0,
|
|
|
|
// st_shndx: In .test
|
|
|
|
0, 1,
|
|
|
|
// st_value
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
// st_size
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
|
|
|
|
// Offset 432
|
|
|
|
// Contents of .strtab section
|
|
|
|
'\0',
|
|
|
|
't', 'e', 's', 't', '\0',
|
|
|
|
|
|
|
|
// Offset 438
|
|
|
|
// Contents of .shstrtab section
|
|
|
|
'\0',
|
|
|
|
'.', 't', 'e', 's', 't', '\0',
|
|
|
|
'.', 's', 'y', 'm', 't', 'a', 'b', '\0',
|
|
|
|
'.', 's', 't', 'r', 't', 'a', 'b', '\0',
|
|
|
|
'.', 's', 'h', 's', 't', 'r', 't', 'a', 'b', '\0'
|
|
|
|
};
|
|
|
|
|
|
|
|
const unsigned int test_file_1_size_64_big = sizeof test_file_1_64_big;
|
2006-12-01 07:52:50 +08:00
|
|
|
|
|
|
|
} // End namespace gold_testsuite.
|