[Lldb-commits] [lldb] cd64273 - [lldb/ELF] Fix IDs of synthetic eh_frame symbols
Shafik Yaghmour via lldb-commits
lldb-commits at lists.llvm.org
Wed Apr 21 13:13:38 PDT 2021
Having side effects in the argument to a function call just feels like a bad idea in general even if it seems obviously correct here e.g.
++last_symbol_id,
Can’t we just do:
uint64_t last_symbol_id =
num_symbols ? symbol_table->SymbolAtIndex(num_symbols - 1)->GetID() + 1: 1;
Thank you
> On Apr 21, 2021, at 2:25 AM, Pavel Labath via lldb-commits <lldb-commits at lists.llvm.org> wrote:
>
>
> Author: Pavel Labath
> Date: 2021-04-21T11:24:43+02:00
> New Revision: cd64273f5ed39ec697ff1e20a1fe25ebd3502629
>
> URL: https://github.com/llvm/llvm-project/commit/cd64273f5ed39ec697ff1e20a1fe25ebd3502629
> DIFF: https://github.com/llvm/llvm-project/commit/cd64273f5ed39ec697ff1e20a1fe25ebd3502629.diff
>
> LOG: [lldb/ELF] Fix IDs of synthetic eh_frame symbols
>
> The code used the total number of symbols to create a symbol ID for the
> synthetic symbols. This is not correct because the IDs of real symbols
> can be higher than their total number, as we do not add all symbols (and
> in particular, we never add symbol zero, which is not a real symbol).
>
> This meant we could have symbols with duplicate IDs, which caused
> problems if some relocations were referring to the duplicated IDs. This
> was the cause of the failure of the test D97786.
>
> This patch fixes the code to use the ID of the highest (last) symbol
> instead.
>
> Added:
> lldb/test/Shell/ObjectFile/ELF/eh_frame-symbols.yaml
>
> Modified:
> lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
>
> Removed:
>
>
>
> ################################################################################
> diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
> index f30ed427f8535..6e94ab97992a1 100644
> --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
> +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
> @@ -2901,8 +2901,11 @@ void ObjectFileELF::ParseUnwindSymbols(Symtab *symbol_table,
> // recalculate the index first.
> std::vector<Symbol> new_symbols;
>
> - eh_frame->ForEachFDEEntries([this, symbol_table, section_list, &new_symbols](
> - lldb::addr_t file_addr, uint32_t size, dw_offset_t) {
> + size_t num_symbols = symbol_table->GetNumSymbols();
> + uint64_t last_symbol_id =
> + num_symbols ? symbol_table->SymbolAtIndex(num_symbols - 1)->GetID() : 0;
> + eh_frame->ForEachFDEEntries([&](lldb::addr_t file_addr, uint32_t size,
> + dw_offset_t) {
> Symbol *symbol = symbol_table->FindSymbolAtFileAddress(file_addr);
> if (symbol) {
> if (!symbol->GetByteSizeIsValid()) {
> @@ -2915,21 +2918,20 @@ void ObjectFileELF::ParseUnwindSymbols(Symtab *symbol_table,
> if (section_sp) {
> addr_t offset = file_addr - section_sp->GetFileAddress();
> const char *symbol_name = GetNextSyntheticSymbolName().GetCString();
> - uint64_t symbol_id = symbol_table->GetNumSymbols();
> Symbol eh_symbol(
> - symbol_id, // Symbol table index.
> - symbol_name, // Symbol name.
> - eSymbolTypeCode, // Type of this symbol.
> - true, // Is this globally visible?
> - false, // Is this symbol debug info?
> - false, // Is this symbol a trampoline?
> - true, // Is this symbol artificial?
> - section_sp, // Section in which this symbol is defined or null.
> - offset, // Offset in section or symbol value.
> - 0, // Size: Don't specify the size as an FDE can
> - false, // Size is valid: cover multiple symbols.
> - false, // Contains linker annotations?
> - 0); // Symbol flags.
> + ++last_symbol_id, // Symbol table index.
> + symbol_name, // Symbol name.
> + eSymbolTypeCode, // Type of this symbol.
> + true, // Is this globally visible?
> + false, // Is this symbol debug info?
> + false, // Is this symbol a trampoline?
> + true, // Is this symbol artificial?
> + section_sp, // Section in which this symbol is defined or null.
> + offset, // Offset in section or symbol value.
> + 0, // Size: Don't specify the size as an FDE can
> + false, // Size is valid: cover multiple symbols.
> + false, // Contains linker annotations?
> + 0); // Symbol flags.
> new_symbols.push_back(eh_symbol);
> }
> }
>
> diff --git a/lldb/test/Shell/ObjectFile/ELF/eh_frame-symbols.yaml b/lldb/test/Shell/ObjectFile/ELF/eh_frame-symbols.yaml
> new file mode 100644
> index 0000000000000..6178a45de1b59
> --- /dev/null
> +++ b/lldb/test/Shell/ObjectFile/ELF/eh_frame-symbols.yaml
> @@ -0,0 +1,32 @@
> +# RUN: yaml2obj %s >%t
> +# RUN: %lldb %t -o "image dump symtab" -b | FileCheck %s
> +
> +# CHECK: Index UserID DSX Type File Address/Value Load Address Size Flags Name
> +# CHECK: [ 0] 1 SourceFile 0x0000000000000000 0x0000000000000000 0x00000004 -
> +# CHECK: [ 1] 2 SX Code 0x0000000000201180 0x0000000000000010 0x00000000 ___lldb_unnamed_symbol1$${{.*}}
> +# CHECK: [ 2] 3 SX Code 0x0000000000201190 0x0000000000000006 0x00000000 ___lldb_unnamed_symbol2$${{.*}}
> +
> +--- !ELF
> +FileHeader:
> + Class: ELFCLASS64
> + Data: ELFDATA2LSB
> + Type: ET_EXEC
> + Machine: EM_X86_64
> +Sections:
> + - Name: .eh_frame
> + Type: SHT_PROGBITS
> + Flags: [ SHF_ALLOC ]
> + Address: 0x200120
> + AddressAlign: 0x8
> + Content: 1400000000000000017A5200017810011B0C0708900100001C0000001C000000401000000600000000410E108602430D06410C07080000001C0000003C000000301000000600000000410E108602430D06410C070800000000000000
> + - Name: .text
> + Type: SHT_PROGBITS
> + Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
> + Address: 0x201180
> + AddressAlign: 0x10
> + Content: 554889E55DC3662E0F1F840000000000554889E55DC3
> +Symbols:
> + - Name: '-'
> + Type: STT_FILE
> + Index: SHN_ABS
> +...
>
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
More information about the lldb-commits
mailing list