parent
a7abd2055c
commit
c5f3f9dccb
@ -0,0 +1,20 @@
|
|||||||
|
#include <llosymbol/llosymbol_base.hpp>
|
||||||
|
|
||||||
|
namespace llo::symbol
|
||||||
|
{
|
||||||
|
class symbol_opaque_t : public symbol_base_t
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit symbol_opaque_t( const llo::utils::hash_t< std::string > &symbol_name,
|
||||||
|
const llo::disposition_t &disposition )
|
||||||
|
: symbol_base_t( symbol_name, disposition )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::shared_ptr< symbol_opaque_t > make( const llo::utils::hash_t< std::string > &symbol_name,
|
||||||
|
const llo::disposition_t &disposition );
|
||||||
|
|
||||||
|
symbol_type_t get_type() const override;
|
||||||
|
std::size_t get_size() const override;
|
||||||
|
};
|
||||||
|
} // namespace llo::symbol
|
@ -0,0 +1,20 @@
|
|||||||
|
#include <llosymbol/llosymbol_opaque.hpp>
|
||||||
|
|
||||||
|
namespace llo::symbol
|
||||||
|
{
|
||||||
|
std::shared_ptr< symbol_opaque_t > symbol_opaque_t::make( const llo::utils::hash_t< std::string > &symbol_name,
|
||||||
|
const llo::disposition_t &disposition )
|
||||||
|
{
|
||||||
|
return std::make_shared< symbol_opaque_t >( symbol_name, disposition );
|
||||||
|
}
|
||||||
|
|
||||||
|
symbol_type_t symbol_opaque_t::get_type() const
|
||||||
|
{
|
||||||
|
return symbol_type_t::s_opaque;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t symbol_opaque_t::get_size() const
|
||||||
|
{
|
||||||
|
return symbol_size;
|
||||||
|
}
|
||||||
|
} // namespace llo::symbol
|
@ -1,6 +1,44 @@
|
|||||||
#include <llosymbol_loader/llosymbol_loader_map.hpp>
|
#include <llosymbol_loader/llosymbol_loader_map.hpp>
|
||||||
|
|
||||||
void llo::s1::symbol_loader_map_t::load( llo::lloiff_t &iff )
|
bool llo::s1::symbol_loader_map_t::load( llo::lloiff_t &iff )
|
||||||
{
|
{
|
||||||
// TODO
|
std::ifstream map_file( symbols_path );
|
||||||
|
if ( !map_file.is_open() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool has_advanced = false;
|
||||||
|
std::string line, begin_symbols( " Address Publics by Value" );
|
||||||
|
|
||||||
|
// segment_idx:segment_offset symbol_name...
|
||||||
|
std::regex pattern( "([0-9a-fA-F]+):([0-9a-fA-F]+)\\s+([_A-Za-z0-9:?@$]+)" );
|
||||||
|
|
||||||
|
while ( std::getline( map_file, line ) )
|
||||||
|
{
|
||||||
|
// advance past header...
|
||||||
|
if ( !has_advanced )
|
||||||
|
{
|
||||||
|
if ( !line.substr( 0, begin_symbols.size() ).compare( begin_symbols ) )
|
||||||
|
has_advanced = true;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::smatch m;
|
||||||
|
if ( !std::regex_search( line, m, pattern ) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
auto section_number = std::strtoull( m[ 0 ].str().c_str(), nullptr, 16 );
|
||||||
|
auto section_offset = std::strtoull( m[ 2 ].str().c_str(), nullptr, 16 );
|
||||||
|
auto symbol_name = m[ 3 ].str();
|
||||||
|
|
||||||
|
if ( !section_number )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// insert new opaque symbol into symbols list...
|
||||||
|
llo::disposition_t disposition( iff.name, iff.sections[ section_number - 1 ].section_name, section_offset );
|
||||||
|
auto new_opaque_symbol = llo::symbol::symbol_opaque_t::make( symbol_name, disposition );
|
||||||
|
iff.sections[ section_number - 1 ].symbols.push_back( new_opaque_symbol );
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
Loading…
Reference in new issue