[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