Parameterize object_unittest to work for whatever target types are

supported.
This commit is contained in:
Ian Lance Taylor 2007-10-03 00:34:49 +00:00
parent 66247fc744
commit 6340166c8b
7 changed files with 719 additions and 44 deletions

View File

@ -41,8 +41,8 @@ namespace gold
// list. This runs at global constructor time, so we want it to be // list. This runs at global constructor time, so we want it to be
// fast. // fast.
Target_selector::Target_selector(int machine, int size, bool big_endian) Target_selector::Target_selector(int machine, int size, bool is_big_endian)
: machine_(machine), size_(size), big_endian_(big_endian) : machine_(machine), size_(size), is_big_endian_(is_big_endian)
{ {
this->next_ = target_selectors; this->next_ = target_selectors;
target_selectors = this; target_selectors = this;
@ -51,15 +51,15 @@ Target_selector::Target_selector(int machine, int size, bool big_endian)
// Find the target for an ELF file. // Find the target for an ELF file.
extern Target* extern Target*
select_target(int machine, int size, bool big_endian, int osabi, select_target(int machine, int size, bool is_big_endian, int osabi,
int abiversion) int abiversion)
{ {
for (Target_selector* p = target_selectors; p != NULL; p = p->next()) for (Target_selector* p = target_selectors; p != NULL; p = p->next())
{ {
int pmach = p->machine(); int pmach = p->machine();
if ((pmach == machine || pmach == elfcpp::EM_NONE) if ((pmach == machine || pmach == elfcpp::EM_NONE)
&& p->size() == size && p->get_size() == size
&& p->big_endian() ? big_endian : !big_endian) && (p->is_big_endian() ? is_big_endian : !is_big_endian))
{ {
Target* ret = p->recognize(machine, osabi, abiversion); Target* ret = p->recognize(machine, osabi, abiversion);
if (ret != NULL) if (ret != NULL)

View File

@ -42,7 +42,7 @@ class Target_selector
// Create a target selector for a specific machine number, size (32 // Create a target selector for a specific machine number, size (32
// or 64), and endianness. The machine number can be EM_NONE to // or 64), and endianness. The machine number can be EM_NONE to
// test for any machine number. // test for any machine number.
Target_selector(int machine, int size, bool big_endian); Target_selector(int machine, int size, bool is_big_endian);
virtual ~Target_selector() virtual ~Target_selector()
{ } { }
@ -64,18 +64,18 @@ class Target_selector
// Return the size this is looking for (32 or 64). // Return the size this is looking for (32 or 64).
int int
size() const get_size() const
{ return this->size_; } { return this->size_; }
// Return the endianness this is looking for. // Return the endianness this is looking for.
bool bool
big_endian() const is_big_endian() const
{ return this->big_endian_; } { return this->is_big_endian_; }
private: private:
int machine_; int machine_;
int size_; int size_;
bool big_endian_; bool is_big_endian_;
Target_selector* next_; Target_selector* next_;
}; };

View File

@ -34,12 +34,14 @@ using namespace gold;
// Test basic Object functionality. // Test basic Object functionality.
template<int size, bool big_endian>
bool bool
Object_test(Test_report*) Sized_object_test(const unsigned char* test_file, unsigned int test_file_size,
Target* target_test_pointer)
{ {
Input_file input_file("test.o", test_file_1, test_file_1_size); Input_file input_file("test.o", test_file, test_file_size);
Object* object = make_elf_object("test.o", &input_file, 0, Object* object = make_elf_object("test.o", &input_file, 0,
test_file_1, test_file_1_size); test_file, test_file_size);
CHECK(object->name() == "test.o"); CHECK(object->name() == "test.o");
CHECK(!object->is_dynamic()); CHECK(!object->is_dynamic());
CHECK(object->target() == target_test_pointer); CHECK(object->target() == target_test_pointer);
@ -56,6 +58,42 @@ Object_test(Test_report*)
return true; return true;
} }
bool
Object_test(Test_report*)
{
int fail = 0;
#ifdef HAVE_TARGET_32_LITTLE
if (!Sized_object_test<32, false>(test_file_1_32_little,
test_file_1_size_32_little,
target_test_pointer_32_little))
++fail;
#endif
#ifdef HAVE_TARGET_32_BIG
if (!Sized_object_test<32, true>(test_file_1_32_big,
test_file_1_size_32_big,
target_test_pointer_32_big))
++fail;
#endif
#ifdef HAVE_TARGET_64_LITTLE
if (!Sized_object_test<64, false>(test_file_1_64_little,
test_file_1_size_64_little,
target_test_pointer_64_little))
++fail;
#endif
#ifdef HAVE_TARGET_64_BIG
if (!Sized_object_test<64, true>(test_file_1_64_big,
test_file_1_size_64_big,
target_test_pointer_64_big))
++fail;
#endif
return fail == 0;
}
Register_test object_register("Object", Object_test); Register_test object_register("Object", Object_test);
} // End namespace gold_testsuite. } // End namespace gold_testsuite.

View File

@ -61,13 +61,22 @@ Test_framework::run(const char *name, bool (*pfn)(Test_report*))
this->testname_ = NULL; this->testname_ = NULL;
} }
// Report a failure.
void
Test_framework::fail(const char* filename, int lineno)
{
printf("FAIL: %s: %s: %d\n", this->testname_, filename, lineno);
this->current_fail_ = true;
}
// Let a test report an error. // Let a test report an error.
void void
Test_framework::error(const char* message) Test_framework::error(const char* message)
{ {
printf("ERROR: %s: %s\n", this->testname_, message); printf("ERROR: %s: %s\n", this->testname_, message);
this->fail(); this->current_fail_ = true;
} }
// Register_test methods. // Register_test methods.

View File

@ -57,8 +57,7 @@ class Test_framework
// Cause the current test to fail. // Cause the current test to fail.
void void
fail() fail(const char* filename, int lineno);
{ ++this->current_fail_ = true; }
// Report an error from the current test. // Report an error from the current test.
void void
@ -89,8 +88,8 @@ public:
// Mark the test as failing. // Mark the test as failing.
void void
fail() fail(const char* filename, int lineno)
{ this->tf_->fail(); } { this->tf_->fail(filename, lineno); }
// Report an error. // Report an error.
void void
@ -131,8 +130,13 @@ class Register_test
// Check that a condition is true. If it is false, report a failure. // Check that a condition is true. If it is false, report a failure.
#define CHECK(cond) \ #define CHECK(cond) \
((cond) ? 0 : (::gold_testsuite::Test_framework::report()->fail(), 0)) ((void) \
((cond) \
? 0 \
: (::gold_testsuite::Test_framework::report()->fail(__FILE__, \
__LINE__), \
0)))
// Report an error during a test. // Report an error during a test.

View File

@ -35,33 +35,35 @@ using namespace gold;
// A Target used for testing purposes. // A Target used for testing purposes.
class Target_test : public Sized_target<32, false> template<int size, bool big_endian>
class Target_test : public Sized_target<size, big_endian>
{ {
public: public:
Target_test() Target_test()
: Sized_target<32, false>(&test_target_info) : Sized_target<size, big_endian>(&test_target_info)
{ } { }
void void
scan_relocs(const General_options&, Symbol_table*, Layout*, scan_relocs(const General_options&, Symbol_table*, Layout*,
Sized_relobj<32, false>*, unsigned int, unsigned int, Sized_relobj<size, big_endian>*, unsigned int,
const unsigned char*, size_t, size_t, const unsigned char*, unsigned int, const unsigned char*, size_t, size_t,
Symbol**) const unsigned char*, Symbol**)
{ ERROR("call to Target_test::scan_relocs"); } { ERROR("call to Target_test::scan_relocs"); }
void void
relocate_section(const Relocate_info<32, false>*, unsigned int, relocate_section(const Relocate_info<size, big_endian>*, unsigned int,
const unsigned char*, size_t, unsigned char*, const unsigned char*, size_t, unsigned char*,
elfcpp::Elf_types<32>::Elf_Addr, off_t) typename elfcpp::Elf_types<size>::Elf_Addr, off_t)
{ ERROR("call to Target_test::relocate_section"); } { ERROR("call to Target_test::relocate_section"); }
static const Target::Target_info test_target_info; static const Target::Target_info test_target_info;
}; };
const Target::Target_info Target_test::test_target_info = template<int size, bool big_endian>
const Target::Target_info Target_test<size, big_endian>::test_target_info =
{ {
32, // size size, // size
false, // is_big_endian big_endian, // is_big_endian
static_cast<elfcpp::EM>(0xffff), // machine_code static_cast<elfcpp::EM>(0xffff), // machine_code
false, // has_make_symbol false, // has_make_symbol
false, // has_resolve false, // has_resolve
@ -72,36 +74,103 @@ const Target::Target_info Target_test::test_target_info =
0x1000 // common_pagesize 0x1000 // common_pagesize
}; };
// The single test target. // The test targets.
Target_test target_test; #ifdef HAVE_TARGET_32_LITTLE
Target_test<32, false> target_test_32_little;
#endif
// A pointer to the test target. This is used in CHECKs. #ifdef HAVE_TARGET_32_BIG
Target_test<32, true> target_test_32_big;
#endif
Target* target_test_pointer = &target_test; #ifdef HAVE_TARGET_64_LITTLE
Target_test<64, false> target_test_64_little;
#endif
// Select the test target. #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 class Target_selector_test : public Target_selector
{ {
public: public:
Target_selector_test() Target_selector_test()
: Target_selector(0xffff, 32, false) : Target_selector(0xffff, size, big_endian)
{ } { }
Target* Target*
recognize(int, int, int) recognize(int, int, int)
{ return &target_test; } {
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;
}
}; };
// Register the test target selector. // 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 target_selector_test; 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 // A simple ELF object with one empty section, named ".test" and one
// globally visible symbol named "test". // globally visible symbol named "test".
const unsigned char test_file_1[] = const unsigned char test_file_1_32_little[] =
{ {
// Ehdr // Ehdr
// EI_MAG[0-3] // EI_MAG[0-3]
@ -277,6 +346,552 @@ const unsigned char test_file_1[] =
'.', 's', 'h', 's', 't', 'r', 't', 'a', 'b', '\0' '.', 's', 'h', 's', 't', 'r', 't', 'a', 'b', '\0'
}; };
const unsigned int test_file_1_size = sizeof test_file_1; 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. } // End namespace gold_testsuite.

View File

@ -31,9 +31,18 @@ class Target;
namespace gold_testsuite namespace gold_testsuite
{ {
extern gold::Target* target_test_pointer; extern gold::Target* target_test_pointer_32_little;
extern const unsigned char test_file_1[]; extern gold::Target* target_test_pointer_32_big;
extern const unsigned int test_file_1_size; extern gold::Target* target_test_pointer_64_little;
extern gold::Target* target_test_pointer_64_big;
extern const unsigned char test_file_1_32_little[];
extern const unsigned int test_file_1_size_32_little;
extern const unsigned char test_file_1_32_big[];
extern const unsigned int test_file_1_size_32_big;
extern const unsigned char test_file_1_64_little[];
extern const unsigned int test_file_1_size_64_little;
extern const unsigned char test_file_1_64_big[];
extern const unsigned int test_file_1_size_64_big;
}; // End namespace gold_testsuite. }; // End namespace gold_testsuite.