Add test that verifies that get_symbols_num() returns increased value after add_symbol()

This commit is contained in:
Serge Lamikhov-Center 2024-06-13 16:22:12 +03:00 committed by Serge Lamikhov-Center
parent 92b9b67df6
commit a872f7cdde
3 changed files with 18 additions and 10 deletions

4
.vscode/launch.json vendored
View File

@ -10,7 +10,7 @@
"request": "launch", "request": "launch",
"program": "${workspaceFolder}/build/tests/ELFIOTest", "program": "${workspaceFolder}/build/tests/ELFIOTest",
"args": [ "args": [
"--gtest_filter=ELFIOTest.load32", //"--gtest_filter=ELFIOTest.load32",
], ],
"stopAtEntry": false, "stopAtEntry": false,
"cwd": "${workspaceFolder}/build/tests", "cwd": "${workspaceFolder}/build/tests",
@ -24,7 +24,7 @@
"ignoreFailures": true "ignoreFailures": true
} }
], ],
"preLaunchTask": "ELFIO Test build", //"preLaunchTask": "ELFIO Test build",
"miDebuggerPath": "/usr/bin/gdb" "miDebuggerPath": "/usr/bin/gdb"
}, },
{ {

View File

@ -120,10 +120,9 @@ template <class S> class symbol_section_accessor_template
for ( Elf_Xword i = 0; !ret && i < get_symbols_num(); i++ ) { for ( Elf_Xword i = 0; !ret && i < get_symbols_num(); i++ ) {
std::string symbol_name; std::string symbol_name;
if ( get_symbol( i, symbol_name, value, size, bind, type, if ( get_symbol( i, symbol_name, value, size, bind, type,
section_index, other ) ) { section_index, other ) &&
if ( symbol_name == name ) { ( symbol_name == name ) ) {
ret = true; ret = true;
}
} }
} }
} }
@ -346,7 +345,7 @@ template <class S> class symbol_section_accessor_template
bloom_size = convertor( bloom_size ); bloom_size = convertor( bloom_size );
bloom_shift = convertor( bloom_shift ); bloom_shift = convertor( bloom_shift );
T* bloom_filter = auto* bloom_filter =
(T*)( hash_section->get_data() + 4 * sizeof( uint32_t ) ); (T*)( hash_section->get_data() + 4 * sizeof( uint32_t ) );
uint32_t hash = elf_gnu_hash( (const unsigned char*)name.c_str() ); uint32_t hash = elf_gnu_hash( (const unsigned char*)name.c_str() );
@ -377,13 +376,14 @@ template <class S> class symbol_section_accessor_template
if ( ( chain_hash >> 1 ) == ( hash >> 1 ) && if ( ( chain_hash >> 1 ) == ( hash >> 1 ) &&
get_symbol( chain_index + symoffset, symname, value, size, get_symbol( chain_index + symoffset, symname, value, size,
bind, type, section_index, other ) && bind, type, section_index, other ) &&
name == symname ) { ( name == symname ) ) {
ret = true; ret = true;
break; break;
} }
if ( chain_hash & 1 ) if ( chain_hash & 1 )
break; break;
chain_hash = convertor( chains[++chain_index] ); chain_hash = convertor( chains[++chain_index] );
} }
} }
@ -398,7 +398,7 @@ template <class S> class symbol_section_accessor_template
if ( symbol_section->get_entry_size() < sizeof( T ) ) { if ( symbol_section->get_entry_size() < sizeof( T ) ) {
return nullptr; return nullptr;
} }
const T* pSym = reinterpret_cast<const T*>( const auto* pSym = reinterpret_cast<const T*>(
symbol_section->get_data() + symbol_section->get_data() +
index * symbol_section->get_entry_size() ); index * symbol_section->get_entry_size() );
@ -443,7 +443,7 @@ template <class S> class symbol_section_accessor_template
if ( nullptr != symbol_section->get_data() && if ( nullptr != symbol_section->get_data() &&
index < get_symbols_num() ) { index < get_symbols_num() ) {
const T* pSym = reinterpret_cast<const T*>( const auto* pSym = reinterpret_cast<const T*>(
symbol_section->get_data() + symbol_section->get_data() +
index * symbol_section->get_entry_size() ); index * symbol_section->get_entry_size() );

View File

@ -636,6 +636,8 @@ TEST( ELFIOTest, rearrange_local_symbols )
sym_sec->set_entry_size( writer.get_default_entry_size( SHT_SYMTAB ) ); sym_sec->set_entry_size( writer.get_default_entry_size( SHT_SYMTAB ) );
symbol_section_accessor symbols( writer, sym_sec ); symbol_section_accessor symbols( writer, sym_sec );
auto sym_num = symbols.get_symbols_num();
name = "Str1"; name = "Str1";
bind = STB_GLOBAL; bind = STB_GLOBAL;
value = 1; value = 1;
@ -677,6 +679,8 @@ TEST( ELFIOTest, rearrange_local_symbols )
symbols.add_symbol( str_writer, name.c_str(), value, size, bind, type, symbols.add_symbol( str_writer, name.c_str(), value, size, bind, type,
other, section_index ); other, section_index );
ASSERT_EQ( symbols.get_symbols_num(), sym_num + 9);
symbols.arrange_local_symbols( [&]( Elf_Xword first, Elf_Xword ) -> void { symbols.arrange_local_symbols( [&]( Elf_Xword first, Elf_Xword ) -> void {
static int counter = 0; static int counter = 0;
EXPECT_EQ( first, ++counter ); EXPECT_EQ( first, ++counter );
@ -788,12 +792,16 @@ TEST( ELFIOTest, rearrange_local_symbols_with_reallocation )
value = 7; value = 7;
Elf_Word sym7 = symbols.add_symbol( str_writer, name.c_str(), value, size, Elf_Word sym7 = symbols.add_symbol( str_writer, name.c_str(), value, size,
bind, type, other, section_index ); bind, type, other, section_index );
auto sym_num = symbols.get_symbols_num();
name = "Str8"; name = "Str8";
bind = STB_WEAK; bind = STB_WEAK;
value = 8; value = 8;
Elf_Word sym8 = symbols.add_symbol( str_writer, name.c_str(), value, size, Elf_Word sym8 = symbols.add_symbol( str_writer, name.c_str(), value, size,
bind, type, other, section_index ); bind, type, other, section_index );
ASSERT_EQ( ( symbols.get_symbols_num() ), ( sym_num + 1 ) );
section* rel_sec = writer.sections.add( ".rel.text" ); section* rel_sec = writer.sections.add( ".rel.text" );
rel_sec->set_type( SHT_REL ); rel_sec->set_type( SHT_REL );
rel_sec->set_info( text_sec->get_index() ); rel_sec->set_info( text_sec->get_index() );