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>
|
||||
|
||||
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