In dynamic section count entries until DT_NULL; Add const for modinfo params

This commit is contained in:
Serge Lamikhov-Center 2020-10-16 01:29:26 +03:00
parent ab41401ab2
commit 49c2de32ec
3 changed files with 25 additions and 13 deletions

View File

@ -23,6 +23,8 @@ THE SOFTWARE.
#ifndef ELFIO_DYNAMIC_HPP #ifndef ELFIO_DYNAMIC_HPP
#define ELFIO_DYNAMIC_HPP #define ELFIO_DYNAMIC_HPP
#include <algorithm>
namespace ELFIO { namespace ELFIO {
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@ -31,21 +33,30 @@ template <class S> class dynamic_section_accessor_template
public: public:
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
dynamic_section_accessor_template( const elfio& elf_file_, S* section_ ) dynamic_section_accessor_template( const elfio& elf_file_, S* section_ )
: elf_file( elf_file_ ), dynamic_section( section_ ) : elf_file( elf_file_ ), dynamic_section( section_ ), entries_num( 0 )
{ {
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Elf_Xword get_entries_num() const Elf_Xword get_entries_num() const
{ {
Elf_Xword nRet = 0; if ( ( 0 == entries_num ) &&
( 0 != dynamic_section->get_entry_size() ) ) {
if ( 0 != dynamic_section->get_entry_size() ) { entries_num =
nRet =
dynamic_section->get_size() / dynamic_section->get_entry_size(); dynamic_section->get_size() / dynamic_section->get_entry_size();
Elf_Xword i;
Elf_Xword tag;
Elf_Xword value;
std::string str;
for ( i = 0; i < entries_num; i++ ) {
get_entry( i, tag, value, str );
if ( tag == DT_NULL )
break;
}
entries_num = std::min( entries_num, i + 1 );
} }
return nRet; return entries_num;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@ -236,6 +247,7 @@ template <class S> class dynamic_section_accessor_template
private: private:
const elfio& elf_file; const elfio& elf_file;
S* dynamic_section; S* dynamic_section;
mutable Elf_Xword entries_num;
}; };
using dynamic_section_accessor = dynamic_section_accessor_template<section>; using dynamic_section_accessor = dynamic_section_accessor_template<section>;

View File

@ -56,7 +56,7 @@ template <class S> class modinfo_section_accessor_template
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
bool get_attribute( std::string field_name, std::string& value ) const bool get_attribute( const std::string field_name, std::string& value ) const
{ {
for ( auto i = content.begin(); i != content.end(); i++ ) { for ( auto i = content.begin(); i != content.end(); i++ ) {
if ( field_name == i->first ) { if ( field_name == i->first ) {
@ -69,7 +69,7 @@ template <class S> class modinfo_section_accessor_template
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Elf_Word add_attribute( std::string field, std::string value ) Elf_Word add_attribute( const std::string field, const std::string value )
{ {
Elf_Word current_position = 0; Elf_Word current_position = 0;

View File

@ -892,7 +892,7 @@ BOOST_AUTO_TEST_CASE( test_dynamic_64_1 )
dynamic_section_accessor da( reader, dynsec ); dynamic_section_accessor da( reader, dynsec );
BOOST_CHECK_EQUAL( da.get_entries_num(), 26 ); BOOST_CHECK_EQUAL( da.get_entries_num(), 21 );
Elf_Xword tag; Elf_Xword tag;
Elf_Xword value; Elf_Xword value;
@ -926,7 +926,7 @@ BOOST_AUTO_TEST_CASE( test_dynamic_64_2 )
dynamic_section_accessor da( reader, dynsec ); dynamic_section_accessor da( reader, dynsec );
BOOST_CHECK_EQUAL( da.get_entries_num(), 24 ); BOOST_CHECK_EQUAL( da.get_entries_num(), 20 );
Elf_Xword tag; Elf_Xword tag;
Elf_Xword value; Elf_Xword value;
@ -956,7 +956,7 @@ BOOST_AUTO_TEST_CASE( test_dynamic_64_3 )
BOOST_REQUIRE( dynsec != NULL ); BOOST_REQUIRE( dynsec != NULL );
dynamic_section_accessor da( reader, dynsec ); dynamic_section_accessor da( reader, dynsec );
BOOST_CHECK_EQUAL( da.get_entries_num(), 26 ); BOOST_CHECK_EQUAL( da.get_entries_num(), 21 );
section* strsec1 = reader.sections.add( ".dynstr" ); section* strsec1 = reader.sections.add( ".dynstr" );
strsec1->set_type( SHT_STRTAB ); strsec1->set_type( SHT_STRTAB );