8a5e3e08a6
Target::new_output_section. (Layout::attach_allocated_section_to_segment): Put large section sections in a separate load segment with the large segment flag set. (Layout::segment_precedes): Sort large data segments after other load segments. (align_file_offset): New static function. (Layout::set_segment_offsets): Use align_file_offset. * output.h (class Output_section): Add is_small_section_ and is_large_section_ fields. (Output_section::is_small_section): New function. (Output_section::set_is_small_section): New function. (Output_section::is_large_section): New function. (Output_section::set_is_large_section): New function. (Output_section::is_large_data_section): New function. (class Output_segment): Add is_large_data_segment_ field. (Output_segment::is_large_data_segment): New function. (Output_segment::set_is_large_data_segment): New function. * output.cc (Output_section::Output_section): Initialize new fields. (Output_segment::Output_segment): Likewise. (Output_segment::add_output_section): Add assertion that large data sections always go in large data segments. Force small data sections to the end of the list of data sections. Force small BSS sections to the start of the list of BSS sections. For large BSS sections to the end of the list of BSS sections. * symtab.h (class Symbol): Declare is_common_shndx. (Symbol::is_defined): Check Symbol::is_common_shndx. (Symbol::is_common): Likewise. (class Symbol_table): Define enum Commons_section_type. Update declarations. Add small_commons_ and large_commons_ fields. * symtab.cc (Symbol::is_common_shndx): New function. (Symbol_table::Symbol_table): Initialize new fields. (Symbol_table::add_from_object): Put small and large common symbols in the right list. (Symbol_table::sized_finalized_symbol): Check Symbol::is_common_shndx. (Symbol_table::sized_write_globals): Likewise. * common.cc (Symbol_table::do_allocate_commons): Allocate new common symbol lists. Don't call do_allocate_commons_list if the list is empty. (Symbol_table::do_allocate_commons_list): Remove is_tls parameter. Add comons_section_type parameter. Change all callers. Handle small and large common symbols. * object.cc (Sized_relobj::do_finalize_local_symbols): Check Symbol::is_common_shndx. * resolve.cc (symbol_to_bits): Likewise. * target.h (Target::small_common_shndx): New function. (Target::small_common_section_flags): New function. (Target::large_common_shndx): New function. (Target::large_common_section_flags): New function. (Target::new_output_section): New function. (Target::Target_info): Add small_common_shndx, large_common_shndx, small_common_section_flags, and large_common_section_flags fields. (Target::do_new_output_section): New virtual function. * arm.cc (Target_arm::arm_info): Initialize new fields. * i386.cc (Target_i386::i386_info): Likewise. * powerpc.cc (Target_powerpc::powerpc_info) [all versions]: Likewise. * sparc.c (Target_sparc::sparc_info) [all versions]: Likewise. * x86_64.cc (Target_x86_64::x86_64_info): Likewise. (Target_x86_64::do_new_output_section): New function. * configure.ac: Define conditional MCMODEL_MEDIUM. * testsuite/Makefile.am (check_PROGRAMS): Add large. (large_SOURCES, large_CFLAGS, large_DEPENDENCIES): Define. (large_LDFLAGS): Define. * testsuite/large.c: New file. * testsuite/testfile.cc (Target_test::test_target_info): Initialize new fields. * configure, testsuite/Makefile.in: Rebuild.
944 lines
20 KiB
C++
944 lines
20 KiB
C++
// testfile.cc -- Dummy ELF objects for testing purposes.
|
|
|
|
// Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
|
|
// 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.
|
|
|
|
#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.
|
|
|
|
template<int size, bool big_endian>
|
|
class Target_test : public Sized_target<size, big_endian>
|
|
{
|
|
public:
|
|
Target_test()
|
|
: Sized_target<size, big_endian>(&test_target_info)
|
|
{ }
|
|
|
|
void
|
|
gc_process_relocs(const General_options&, Symbol_table*, Layout*,
|
|
Sized_relobj<size, big_endian>*, unsigned int,
|
|
unsigned int, const unsigned char*, size_t, Output_section*,
|
|
bool, size_t, const unsigned char*)
|
|
{ ERROR("call to Target_test::gc_process_relocs"); }
|
|
|
|
void
|
|
scan_relocs(const General_options&, Symbol_table*, Layout*,
|
|
Sized_relobj<size, big_endian>*, unsigned int,
|
|
unsigned int, const unsigned char*, size_t, Output_section*,
|
|
bool, size_t, const unsigned char*)
|
|
{ ERROR("call to Target_test::scan_relocs"); }
|
|
|
|
void
|
|
relocate_section(const Relocate_info<size, big_endian>*, unsigned int,
|
|
const unsigned char*, size_t, Output_section*, bool,
|
|
unsigned char*, typename elfcpp::Elf_types<size>::Elf_Addr,
|
|
section_size_type)
|
|
{ ERROR("call to Target_test::relocate_section"); }
|
|
|
|
void
|
|
scan_relocatable_relocs(const General_options&, Symbol_table*, Layout*,
|
|
Sized_relobj<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::scan_relocatable_relocs"); }
|
|
|
|
void
|
|
relocate_for_relocatable(const Relocate_info<size, big_endian>*,
|
|
unsigned int, const unsigned char*, size_t,
|
|
Output_section*, off_t, const Relocatable_relocs*,
|
|
unsigned char*,
|
|
typename elfcpp::Elf_types<size>::Elf_Addr,
|
|
section_size_type, unsigned char*,
|
|
section_size_type)
|
|
{ ERROR("call to Target_test::relocate_for_relocatable"); }
|
|
|
|
static const Target::Target_info test_target_info;
|
|
};
|
|
|
|
template<int size, bool big_endian>
|
|
const Target::Target_info Target_test<size, big_endian>::test_target_info =
|
|
{
|
|
size, // size
|
|
big_endian, // is_big_endian
|
|
static_cast<elfcpp::EM>(0xffff), // machine_code
|
|
false, // has_make_symbol
|
|
false, // has_resolve
|
|
false, // has_code_fill
|
|
false, // is_default_stack_executable
|
|
'\0', // wrap_char
|
|
"/dummy", // dynamic_linker
|
|
0x08000000, // default_text_segment_address
|
|
0x1000, // abi_pagesize
|
|
0x1000, // common_pagesize
|
|
elfcpp::SHN_UNDEF, // small_common_shndx
|
|
elfcpp::SHN_UNDEF, // large_common_shndx
|
|
0, // small_common_section_flags
|
|
0 // large_common_section_flags
|
|
};
|
|
|
|
// The test targets.
|
|
|
|
#ifdef HAVE_TARGET_32_LITTLE
|
|
Target_test<32, false> target_test_32_little;
|
|
#endif
|
|
|
|
#ifdef HAVE_TARGET_32_BIG
|
|
Target_test<32, true> target_test_32_big;
|
|
#endif
|
|
|
|
#ifdef HAVE_TARGET_64_LITTLE
|
|
Target_test<64, false> target_test_64_little;
|
|
#endif
|
|
|
|
#ifdef HAVE_TARGET_64_BIG
|
|
Target_test<64, true> target_test_64_big;
|
|
#endif
|
|
|
|
// 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>
|
|
class Target_selector_test : public Target_selector
|
|
{
|
|
public:
|
|
Target_selector_test()
|
|
: Target_selector(0xffff, size, big_endian, NULL)
|
|
{ }
|
|
|
|
Target*
|
|
do_instantiate_target()
|
|
{
|
|
gold_unreachable();
|
|
return NULL;
|
|
}
|
|
|
|
Target*
|
|
do_recognize(int, int, int)
|
|
{
|
|
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;
|
|
}
|
|
|
|
Target*
|
|
do_recognize_by_name(const char*)
|
|
{ return NULL; }
|
|
|
|
void
|
|
do_supported_names(std::vector<const char*>*)
|
|
{ }
|
|
};
|
|
|
|
// 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.
|
|
|
|
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;
|
|
|
|
// A simple ELF object with one empty section, named ".test" and one
|
|
// globally visible symbol named "test".
|
|
|
|
const unsigned char test_file_1_32_little[] =
|
|
{
|
|
// 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'
|
|
};
|
|
|
|
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;
|
|
|
|
} // End namespace gold_testsuite.
|