mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-05-28 14:08:09 +08:00
elfcpp/:
* elf_file.h: (class Elf_strtab): New class. gold/: * gold.cc: (queue_initial_tasks): Pass incremental_inputs to Incremental_checker. * incremental.cc: (INCREMENTAL_LINK_VERSION): Change type to unsigned int. (class Incremental_inputs_header): New class. (Incremental_inputs_header_writer): Edit comment. (Incremental_inputs_entry): New class. (Incremental_inputs_entry_writer): Edit comment. (Sized_incremental_binary::do_find_incremental_inputs_section): Add *strtab_shndx parameter, fill it. (Sized_incremental_binary::do_check_inputs): New method. (Incremental_checker::can_incrementally_link_output_file): Use Sized_incremental_binary::check_inputs. (Incremental_inputs::report_command_line): Save command line in command_line_. * incremental.h: (Incremental_binary::find_incremental_inputs_section): New method. (Incremental_binary::do_find_incremental_inputs_section): Add strtab_shndx parameter. (Incremental_binary::do_check_inputs): New pure virtual method. (Sized_incremental_binary::do_check_inputs): Declare. (Incremental_checker::Incremental_checker): Add incremental_inputs parameter, use it to initialize incremental_inputs_. (Incremental_checker::incremental_inputs_): New field. (Incremental_checker::command_line): New method. (Incremental_checker::inputs): New method. (Incremental_checker::command_line_): New field.
This commit is contained in:
@ -228,6 +228,33 @@ class Elf_file
|
||||
int large_shndx_offset_;
|
||||
};
|
||||
|
||||
// A small wrapper around SHT_STRTAB data mapped to memory. It checks that the
|
||||
// index is not out of bounds and the string is NULL-terminated.
|
||||
|
||||
class Elf_strtab
|
||||
{
|
||||
public:
|
||||
// Construct an Elf_strtab for a section with contents *P and size SIZE.
|
||||
Elf_strtab(const unsigned char* p, size_t size);
|
||||
|
||||
// Return the file offset to the section headers.
|
||||
bool
|
||||
get_c_string(size_t offset, const char** cstring) const
|
||||
{
|
||||
if (offset >= this->usable_size_)
|
||||
return false;
|
||||
*cstring = this->base_ + offset;
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
// Contents of the section mapped to memory.
|
||||
const char* base_;
|
||||
// One larger that the position of the last NULL character in the section.
|
||||
// For valid SHT_STRTAB sections, this is the size of the section.
|
||||
size_t usable_size_;
|
||||
};
|
||||
|
||||
// Inline function definitions.
|
||||
|
||||
// Check for presence of the ELF magic number.
|
||||
@ -642,6 +669,18 @@ Elf_file<size, big_endian, File>::section_addralign(unsigned int shndx)
|
||||
return shdr.get_sh_addralign();
|
||||
}
|
||||
|
||||
inline
|
||||
Elf_strtab::Elf_strtab(const unsigned char* p, size_t size)
|
||||
{
|
||||
// Check if the section is NUL-terminated. If it isn't, we ignore
|
||||
// the last part to make sure we don't return non-NUL-terminated
|
||||
// strings.
|
||||
while (size > 0 && p[size - 1] != 0)
|
||||
size--;
|
||||
this->base_ = reinterpret_cast<const char*>(p);
|
||||
this->usable_size_ = size;
|
||||
}
|
||||
|
||||
} // End namespace elfcpp.
|
||||
|
||||
#endif // !defined(ELFCPP_FILE_H)
|
||||
|
Reference in New Issue
Block a user