mirror of
https://github.com/serge1/ELFIO.git
synced 2025-04-16 05:42:31 +00:00
Modernize 'segment' implementation
This commit is contained in:
parent
847249dd27
commit
c22276ec1a
@ -272,8 +272,8 @@ template <class T> class section_impl : public section
|
|||||||
std::string name;
|
std::string name;
|
||||||
std::unique_ptr<char> data;
|
std::unique_ptr<char> data;
|
||||||
Elf_Word data_size = 0;
|
Elf_Word data_size = 0;
|
||||||
const endianess_convertor* convertor = 0;
|
const endianess_convertor* convertor = nullptr;
|
||||||
const address_translator* translator = 0;
|
const address_translator* translator = nullptr;
|
||||||
bool is_address_set = false;
|
bool is_address_set = false;
|
||||||
size_t stream_size = 0;
|
size_t stream_size = 0;
|
||||||
};
|
};
|
||||||
|
@ -74,15 +74,10 @@ template <class T> class segment_impl : public segment
|
|||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
segment_impl( const endianess_convertor* convertor,
|
segment_impl( const endianess_convertor* convertor,
|
||||||
const address_translator* translator )
|
const address_translator* translator )
|
||||||
: index( 0 ), data( nullptr ), convertor( convertor ),
|
: convertor( convertor ), translator( translator )
|
||||||
translator( translator ), stream_size( 0 ), is_offset_set( false )
|
|
||||||
{
|
{
|
||||||
std::fill_n( reinterpret_cast<char*>( &ph ), sizeof( ph ), '\0' );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
~segment_impl() override { delete[] data; }
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Section info functions
|
// Section info functions
|
||||||
ELFIO_GET_SET_ACCESS( Elf_Word, type, ph.p_type );
|
ELFIO_GET_SET_ACCESS( Elf_Word, type, ph.p_type );
|
||||||
@ -98,7 +93,7 @@ template <class T> class segment_impl : public segment
|
|||||||
Elf_Half get_index() const override { return index; }
|
Elf_Half get_index() const override { return index; }
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
const char* get_data() const override { return data; }
|
const char* get_data() const override { return data.get(); }
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
Elf_Half add_section_index( Elf_Half sec_index,
|
Elf_Half add_section_index( Elf_Half sec_index,
|
||||||
@ -162,7 +157,7 @@ template <class T> class segment_impl : public segment
|
|||||||
bool load( std::istream& stream, std::streampos header_offset ) override
|
bool load( std::istream& stream, std::streampos header_offset ) override
|
||||||
{
|
{
|
||||||
if ( translator->empty() ) {
|
if ( translator->empty() ) {
|
||||||
stream.seekg( 0, stream.end );
|
stream.seekg( 0, std::istream::end );
|
||||||
set_stream_size( size_t( stream.tellg() ) );
|
set_stream_size( size_t( stream.tellg() ) );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -173,7 +168,10 @@ template <class T> class segment_impl : public segment
|
|||||||
stream.read( reinterpret_cast<char*>( &ph ), sizeof( ph ) );
|
stream.read( reinterpret_cast<char*>( &ph ), sizeof( ph ) );
|
||||||
is_offset_set = true;
|
is_offset_set = true;
|
||||||
|
|
||||||
if ( PT_NULL != get_type() && 0 != get_file_size() ) {
|
if ( PT_NULL == get_type() || 0 == get_file_size() ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
stream.seekg( ( *translator )[( *convertor )( ph.p_offset )] );
|
stream.seekg( ( *translator )[( *convertor )( ph.p_offset )] );
|
||||||
Elf_Xword size = get_file_size();
|
Elf_Xword size = get_file_size();
|
||||||
|
|
||||||
@ -181,17 +179,15 @@ template <class T> class segment_impl : public segment
|
|||||||
data = nullptr;
|
data = nullptr;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
data = new ( std::nothrow ) char[(size_t)size + 1];
|
data.reset( new ( std::nothrow ) char[(size_t)size + 1] );
|
||||||
|
|
||||||
if ( nullptr != data ) {
|
if ( nullptr != data.get() ) {
|
||||||
stream.read( data, size );
|
stream.read( data.get(), size );
|
||||||
if ( static_cast<Elf_Xword>( stream.gcount() ) != size ) {
|
if ( static_cast<Elf_Xword>( stream.gcount() ) != size ) {
|
||||||
delete[] data;
|
|
||||||
data = nullptr;
|
data = nullptr;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
data[size] = 0;
|
data.get()[size] = 0;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -217,14 +213,14 @@ template <class T> class segment_impl : public segment
|
|||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
private:
|
private:
|
||||||
T ph;
|
T ph = { 0 };
|
||||||
Elf_Half index;
|
Elf_Half index = 0;
|
||||||
char* data;
|
std::unique_ptr<char> data;
|
||||||
std::vector<Elf_Half> sections;
|
std::vector<Elf_Half> sections;
|
||||||
const endianess_convertor* convertor;
|
const endianess_convertor* convertor = nullptr;
|
||||||
const address_translator* translator;
|
const address_translator* translator = nullptr;
|
||||||
size_t stream_size;
|
size_t stream_size = 0;
|
||||||
bool is_offset_set;
|
bool is_offset_set = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ELFIO
|
} // namespace ELFIO
|
||||||
|
Loading…
x
Reference in New Issue
Block a user