mirror of
https://github.com/serge1/ELFIO.git
synced 2025-04-16 05:42:31 +00:00
An attempt to implement memory translation for sections
This commit is contained in:
parent
0a15ec0aea
commit
b527ea992a
3
.vscode/launch.json
vendored
3
.vscode/launch.json
vendored
@ -58,6 +58,7 @@
|
|||||||
"2919",
|
"2919",
|
||||||
"/usr/bin/bash"
|
"/usr/bin/bash"
|
||||||
],
|
],
|
||||||
|
"sudo" : true,
|
||||||
"stopAtEntry": false,
|
"stopAtEntry": false,
|
||||||
"cwd": "${workspaceFolder}",
|
"cwd": "${workspaceFolder}",
|
||||||
"environment": [],
|
"environment": [],
|
||||||
@ -70,7 +71,7 @@
|
|||||||
"ignoreFailures": true
|
"ignoreFailures": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"miDebuggerPath": "/usr/bin/gdb"
|
"miDebuggerPath": "/home/user/ELFIO/mygdb.sh"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
@ -421,10 +421,12 @@ class elfio
|
|||||||
unsigned char file_class = get_class();
|
unsigned char file_class = get_class();
|
||||||
|
|
||||||
if ( file_class == ELFCLASS64 ) {
|
if ( file_class == ELFCLASS64 ) {
|
||||||
new_section = new section_impl<Elf64_Shdr>( &convertor );
|
new_section =
|
||||||
|
new section_impl<Elf64_Shdr>( &convertor, &addr_translator );
|
||||||
}
|
}
|
||||||
else if ( file_class == ELFCLASS32 ) {
|
else if ( file_class == ELFCLASS32 ) {
|
||||||
new_section = new section_impl<Elf32_Shdr>( &convertor );
|
new_section =
|
||||||
|
new section_impl<Elf32_Shdr>( &convertor, &addr_translator );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -72,8 +72,9 @@ template <class T> class section_impl : public section
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
section_impl( const endianess_convertor* convertor )
|
section_impl( const endianess_convertor* convertor,
|
||||||
: convertor( convertor )
|
const address_translator* translator )
|
||||||
|
: convertor( convertor ), translator( translator )
|
||||||
{
|
{
|
||||||
std::fill_n( reinterpret_cast<char*>( &header ), sizeof( header ),
|
std::fill_n( reinterpret_cast<char*>( &header ), sizeof( header ),
|
||||||
'\0' );
|
'\0' );
|
||||||
@ -192,10 +193,10 @@ template <class T> class section_impl : public section
|
|||||||
std::fill_n( reinterpret_cast<char*>( &header ), sizeof( header ),
|
std::fill_n( reinterpret_cast<char*>( &header ), sizeof( header ),
|
||||||
'\0' );
|
'\0' );
|
||||||
|
|
||||||
stream.seekg( 0, stream.end );
|
// stream.seekg( 0, stream.end );
|
||||||
set_stream_size( stream.tellg() );
|
set_stream_size( 0xFFFFFFFF /*stream.tellg()*/ );
|
||||||
|
|
||||||
stream.seekg( header_offset );
|
stream.seekg( ( *translator )( header_offset ) );
|
||||||
stream.read( reinterpret_cast<char*>( &header ), sizeof( header ) );
|
stream.read( reinterpret_cast<char*>( &header ), sizeof( header ) );
|
||||||
|
|
||||||
Elf_Xword size = get_size();
|
Elf_Xword size = get_size();
|
||||||
@ -204,7 +205,8 @@ template <class T> class section_impl : public section
|
|||||||
data = new ( std::nothrow ) char[size + 1];
|
data = new ( std::nothrow ) char[size + 1];
|
||||||
|
|
||||||
if ( ( 0 != size ) && ( nullptr != data ) ) {
|
if ( ( 0 != size ) && ( nullptr != data ) ) {
|
||||||
stream.seekg( ( *convertor )( header.sh_offset ) );
|
stream.seekg(
|
||||||
|
( *translator )( ( *convertor )( header.sh_offset ) ) );
|
||||||
stream.read( data, size );
|
stream.read( data, size );
|
||||||
data[size] = 0; // Ensure data is ended with 0 to avoid oob read
|
data[size] = 0; // Ensure data is ended with 0 to avoid oob read
|
||||||
data_size = size;
|
data_size = size;
|
||||||
@ -263,6 +265,7 @@ template <class T> class section_impl : public section
|
|||||||
char* data;
|
char* data;
|
||||||
Elf_Word data_size;
|
Elf_Word data_size;
|
||||||
const endianess_convertor* convertor;
|
const endianess_convertor* convertor;
|
||||||
|
const address_translator* translator;
|
||||||
bool is_address_set;
|
bool is_address_set;
|
||||||
size_t stream_size;
|
size_t stream_size;
|
||||||
};
|
};
|
||||||
|
@ -190,7 +190,8 @@ class address_translator
|
|||||||
for ( auto& t : translation ) {
|
for ( auto& t : translation ) {
|
||||||
if ( t.map_to <= value &&
|
if ( t.map_to <= value &&
|
||||||
( ( value - t.map_to ) < ( t.end - t.start ) ) ) {
|
( ( value - t.map_to ) < ( t.end - t.start ) ) ) {
|
||||||
std::cout << std::hex << t.start - t.map_to + value << std::endl;
|
std::cout << std::hex << t.start - t.map_to + value << " "
|
||||||
|
<< value << std::endl;
|
||||||
return t.start - t.map_to + value;
|
return t.start - t.map_to + value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user