[Lldb-commits] [lldb] [LLDB] Omit loading local symbols in LLDB symbol table (PR #154809)
via lldb-commits
lldb-commits at lists.llvm.org
Fri Aug 22 15:51:22 PDT 2025
https://github.com/barsolo2000 updated https://github.com/llvm/llvm-project/pull/154809
>From f378e6a09487eca27d4741bc527c578b8fb8d161 Mon Sep 17 00:00:00 2001
From: Bar Soloveychik <barsolo at fb.com>
Date: Wed, 20 Aug 2025 14:54:52 -0700
Subject: [PATCH 1/9] added helper function
---
.../source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
index f69358de6a288..37983cfef0a2e 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -2037,6 +2037,19 @@ static char FindArmAarch64MappingSymbol(const char *symbol_name) {
return '\0';
}
+static char FindRISCVMappingSymbol(const char *symbol_name) {
+ if (!symbol_name)
+ return '\0';
+
+ if (symbol_name.size() == 2 && symbol_name[0] == '$'){
+ char c = symbol_name[1];
+ if (c == 'd' || c == 'x'){
+ return c;
+ }
+ return '\0';
+ }
+}
+
#define STO_MIPS_ISA (3 << 6)
#define STO_MICROMIPS (2 << 6)
#define IS_MICROMIPS(ST_OTHER) (((ST_OTHER)&STO_MIPS_ISA) == STO_MICROMIPS)
>From b88812ae8e4a7647258360985721fa6b1ada0614 Mon Sep 17 00:00:00 2001
From: Bar Soloveychik <barsolo at fb.com>
Date: Thu, 21 Aug 2025 10:51:17 -0700
Subject: [PATCH 2/9] fixed format
---
.../Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 44 ++++++++++++++-----
1 file changed, 33 insertions(+), 11 deletions(-)
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
index 37983cfef0a2e..99744b25ea66f 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -2041,13 +2041,12 @@ static char FindRISCVMappingSymbol(const char *symbol_name) {
if (!symbol_name)
return '\0';
- if (symbol_name.size() == 2 && symbol_name[0] == '$'){
- char c = symbol_name[1];
- if (c == 'd' || c == 'x'){
- return c;
- }
- return '\0';
+ if (symbol_name[0] == '$' &&
+ (symbol_name[1] == 'd' || symbol_name[1] == 'x') &&
+ symbol_name[2] == '\0') {
+ return symbol_name[1];
}
+ return '\0';
}
#define STO_MIPS_ISA (3 << 6)
@@ -2115,11 +2114,13 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
if (!symbol_name)
symbol_name = "";
+ if (symbol_name[0] == '.' && symbol_name[1] == 'L')
+ continue;
// No need to add non-section symbols that have no names
if (symbol.getType() != STT_SECTION &&
(symbol_name == nullptr || symbol_name[0] == '\0'))
continue;
-
+
// Skipping oatdata and oatexec sections if it is requested. See details
// above the definition of skip_oatdata_oatexec for the reasons.
if (skip_oatdata_oatexec && (::strcmp(symbol_name, "oatdata") == 0 ||
@@ -2203,9 +2204,9 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
int64_t symbol_value_offset = 0;
uint32_t additional_flags = 0;
-
+ llvm::Triple::ArchType arch_machine = arch.GetMachine();
if (arch.IsValid()) {
- if (arch.GetMachine() == llvm::Triple::arm) {
+ if (arch_machine == llvm::Triple::arm) {
if (symbol.getBinding() == STB_LOCAL) {
char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name);
if (symbol_type == eSymbolTypeCode) {
@@ -2230,7 +2231,7 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
if (mapping_symbol)
continue;
}
- } else if (arch.GetMachine() == llvm::Triple::aarch64) {
+ } else if (arch_machine == llvm::Triple::aarch64) {
if (symbol.getBinding() == STB_LOCAL) {
char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name);
if (symbol_type == eSymbolTypeCode) {
@@ -2248,9 +2249,30 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
if (mapping_symbol)
continue;
}
+ } else if (arch_machine == llvm::Triple::riscv32 ||
+ arch_machine == llvm::Triple::riscv64 ||
+ arch_machine == llvm::Triple::riscv32be ||
+ arch_machine == llvm::Triple::riscv64be) {
+ if (symbol.getBinding() == STB_LOCAL) {
+ char mapping_symbol = FindRISCVMappingSymbol(symbol_name);
+ if (symbol_type == eSymbolTypeCode) {
+ switch (mapping_symbol) {
+ case 'x':
+ // $x - marks a RISCV instruction sequence
+ address_class_map[symbol.st_value] = AddressClass::eCode;
+ break;
+ case 'd':
+ // $d - marks a RISCV data item sequence
+ address_class_map[symbol.st_value] = AddressClass::eData;
+ break;
+ }
+ }
+ if (mapping_symbol)
+ continue;
+ }
}
- if (arch.GetMachine() == llvm::Triple::arm) {
+ if (arch_machine == llvm::Triple::arm) {
if (symbol_type == eSymbolTypeCode) {
if (symbol.st_value & 1) {
// Subtracting 1 from the address effectively unsets the low order
>From 9262c0fe32449981dc9de5693a1ec8eed835da84 Mon Sep 17 00:00:00 2001
From: Bar Soloveychik <barsolo at fb.com>
Date: Thu, 21 Aug 2025 11:05:14 -0700
Subject: [PATCH 3/9] format
---
lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 1 -
1 file changed, 1 deletion(-)
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
index 99744b25ea66f..40e38e46870bf 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -2120,7 +2120,6 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
if (symbol.getType() != STT_SECTION &&
(symbol_name == nullptr || symbol_name[0] == '\0'))
continue;
-
// Skipping oatdata and oatexec sections if it is requested. See details
// above the definition of skip_oatdata_oatexec for the reasons.
if (skip_oatdata_oatexec && (::strcmp(symbol_name, "oatdata") == 0 ||
>From d06d40853dd38d89eb5d058da292f3174b24bce7 Mon Sep 17 00:00:00 2001
From: Bar Soloveychik <barsolo at fb.com>
Date: Thu, 21 Aug 2025 11:06:00 -0700
Subject: [PATCH 4/9] format
---
lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
index 40e38e46870bf..cfa446d185b14 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -2120,6 +2120,7 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
if (symbol.getType() != STT_SECTION &&
(symbol_name == nullptr || symbol_name[0] == '\0'))
continue;
+
// Skipping oatdata and oatexec sections if it is requested. See details
// above the definition of skip_oatdata_oatexec for the reasons.
if (skip_oatdata_oatexec && (::strcmp(symbol_name, "oatdata") == 0 ||
>From e6bf2f1d2809881a4d10b55f69df7969c449a3d8 Mon Sep 17 00:00:00 2001
From: Bar Soloveychik <barsolo at fb.com>
Date: Thu, 21 Aug 2025 14:43:45 -0700
Subject: [PATCH 5/9] added test
---
.../ObjectFile/ELF/TestObjectFileELF.cpp | 75 +++++++++++++++++++
1 file changed, 75 insertions(+)
diff --git a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp
index 80abc5b80f84d..65b324363b2ef 100644
--- a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp
+++ b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp
@@ -308,3 +308,78 @@ TEST_F(ObjectFileELFTest, GetSymtab_NoSymEntryPointArmAddressClass) {
auto entry_point_addr = module_sp->GetObjectFile()->GetEntryPointAddress();
ASSERT_EQ(entry_point_addr.GetAddressClass(), AddressClass::eCode);
}
+
+TEST_F(ObjectFileELFTest, SkipsLocalMappingAndDotLSymbols) {
+ auto ExpectedFile = TestFile::fromYaml(R"(
+--- !ELF
+ FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_RISCV
+ Flags: [ EF_RISCV_RVC, EF_RISCV_FLOAT_ABI_SINGLE ]
+ Entry: 0xC0A1B010
+ Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x0000000000400180
+ AddressAlign: 0x0000000000000010
+ Content: 554889E5
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ Address: 0x0000000000601000
+ AddressAlign: 0x0000000000000004
+ Content: 2F000000
+ Symbols:
+ - Name: $d
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000400180
+ Size: 0x10
+ Binding: STB_LOCAL
+ - Name: $x
+ Type: STT_FUNC
+ Section: .text
+ Value: 0xC0A1B010
+ Size: 0x10
+ Binding: STB_LOCAL
+ - Name: .Lfoo
+ Type: STT_OBJECT
+ Section: .data
+ Value: 0x0000000000601000
+ Size: 0x4
+ Binding: STB_LOCAL
+ - Name: global_func
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x00000000004001A0
+ Size: 0x10
+ Binding: STB_GLOBAL
+ - Name: global_obj
+ Type: STT_OBJECT
+ Section: .data
+ Value: 0x0000000000601004
+ Size: 0x4
+ Binding: STB_GLOBAL
+...
+ )");
+ ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded());
+ auto module_sp = std::make_shared<Module>(ExpectedFile->moduleSpec());
+ auto *symtab = module_sp->GetSymtab();
+ ASSERT_NE(nullptr, symtab);
+ EXPECT_EQ(nullptr, module_sp->FindFirstSymbolWithNameAndType(
+ ConstString("$d"), eSymbolTypeAny));
+ EXPECT_EQ(nullptr, module_sp->FindFirstSymbolWithNameAndType(
+ ConstString("$x"), eSymbolTypeAny));
+ EXPECT_EQ(nullptr, module_sp->FindFirstSymbolWithNameAndType(
+ ConstString(".Lfoo"), eSymbolTypeAny));
+ // assert that other symbols are present
+ const Symbol *global_func = module_sp->FindFirstSymbolWithNameAndType(
+ ConstString("global_func"), eSymbolTypeAny);
+ ASSERT_NE(nullptr, global_func);
+ const Symbol *global_obj = module_sp->FindFirstSymbolWithNameAndType(
+ ConstString("global_obj"), eSymbolTypeAny);
+ ASSERT_NE(nullptr, global_obj);
+}
\ No newline at end of file
>From 06278827aa0ed44fb6f3f90eeabc76628e7ec587 Mon Sep 17 00:00:00 2001
From: Bar Soloveychik <barsolo at fb.com>
Date: Thu, 21 Aug 2025 14:47:42 -0700
Subject: [PATCH 6/9] format
---
lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp
index 65b324363b2ef..9af0aeb9bab50 100644
--- a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp
+++ b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp
@@ -382,4 +382,4 @@ TEST_F(ObjectFileELFTest, SkipsLocalMappingAndDotLSymbols) {
const Symbol *global_obj = module_sp->FindFirstSymbolWithNameAndType(
ConstString("global_obj"), eSymbolTypeAny);
ASSERT_NE(nullptr, global_obj);
-}
\ No newline at end of file
+}
>From d75bbbdd6eb004308ecaec49a45103a0a03dfb8e Mon Sep 17 00:00:00 2001
From: Bar Soloveychik <barsolo at fb.com>
Date: Thu, 21 Aug 2025 15:15:52 -0700
Subject: [PATCH 7/9] test_fix
---
lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp
index 9af0aeb9bab50..2e39384857195 100644
--- a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp
+++ b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp
@@ -332,10 +332,16 @@ TEST_F(ObjectFileELFTest, SkipsLocalMappingAndDotLSymbols) {
Address: 0x0000000000601000
AddressAlign: 0x0000000000000004
Content: 2F000000
+ - Name: .riscv.attributes
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ Address: 0x0000000000610000
+ AddressAlign: 0x0000000000000004
+ Content: "00"
Symbols:
- Name: $d
Type: STT_FUNC
- Section: .text
+ Section: .riscv.attributes
Value: 0x0000000000400180
Size: 0x10
Binding: STB_LOCAL
>From 315266d17af95c5475c80d3dfff0a5f694d3321d Mon Sep 17 00:00:00 2001
From: Bar Soloveychik <barsolo at fb.com>
Date: Thu, 21 Aug 2025 15:37:52 -0700
Subject: [PATCH 8/9] fixed comments
---
lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 4 ++++
lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp | 4 ++--
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
index cfa446d185b14..a984ee94397b1 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -2114,6 +2114,10 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
if (!symbol_name)
symbol_name = "";
+ // Skip local symbols starting with ".L" because these are compiler
+ // generated local labels used for internal purposes (e.g. debugging,
+ // optimization) and are not relevant for symbol resolution or external
+ // linkage in RISC-V binaries.
if (symbol_name[0] == '.' && symbol_name[1] == 'L')
continue;
// No need to add non-section symbols that have no names
diff --git a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp
index 2e39384857195..411387832f733 100644
--- a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp
+++ b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp
@@ -340,13 +340,13 @@ TEST_F(ObjectFileELFTest, SkipsLocalMappingAndDotLSymbols) {
Content: "00"
Symbols:
- Name: $d
- Type: STT_FUNC
+ Type: STT_NOTYPE
Section: .riscv.attributes
Value: 0x0000000000400180
Size: 0x10
Binding: STB_LOCAL
- Name: $x
- Type: STT_FUNC
+ Type: STT_NOTYPE
Section: .text
Value: 0xC0A1B010
Size: 0x10
>From 8b01f93e92e7220f73a33d08d09a2fecaa6ba99b Mon Sep 17 00:00:00 2001
From: Bar Soloveychik <barsolo at fb.com>
Date: Thu, 21 Aug 2025 15:37:52 -0700
Subject: [PATCH 9/9] fixed comments
---
.../Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 30 +++++++++++--------
1 file changed, 18 insertions(+), 12 deletions(-)
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
index a984ee94397b1..f63498dac7bf2 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -2041,13 +2041,20 @@ static char FindRISCVMappingSymbol(const char *symbol_name) {
if (!symbol_name)
return '\0';
- if (symbol_name[0] == '$' &&
- (symbol_name[1] == 'd' || symbol_name[1] == 'x') &&
- symbol_name[2] == '\0') {
- return symbol_name[1];
+ if (strcmp(symbol_name, "$d") == 0) {
+ return 'd';
+ }
+ if (strcmp(symbol_name, "$x") == 0) {
+ return 'x';
}
return '\0';
}
+static bool IsRISCVArch(llvm::Triple::ArchType arch_machine) {
+ return arch_machine == llvm::Triple::riscv32 ||
+ arch_machine == llvm::Triple::riscv64 ||
+ arch_machine == llvm::Triple::riscv32be ||
+ arch_machine == llvm::Triple::riscv64be;
+}
#define STO_MIPS_ISA (3 << 6)
#define STO_MICROMIPS (2 << 6)
@@ -2208,9 +2215,8 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
int64_t symbol_value_offset = 0;
uint32_t additional_flags = 0;
- llvm::Triple::ArchType arch_machine = arch.GetMachine();
if (arch.IsValid()) {
- if (arch_machine == llvm::Triple::arm) {
+ if (arch.GetMachine() == llvm::Triple::arm) {
if (symbol.getBinding() == STB_LOCAL) {
char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name);
if (symbol_type == eSymbolTypeCode) {
@@ -2235,7 +2241,7 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
if (mapping_symbol)
continue;
}
- } else if (arch_machine == llvm::Triple::aarch64) {
+ } else if (arch.GetMachine() == llvm::Triple::aarch64) {
if (symbol.getBinding() == STB_LOCAL) {
char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name);
if (symbol_type == eSymbolTypeCode) {
@@ -2253,13 +2259,13 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
if (mapping_symbol)
continue;
}
- } else if (arch_machine == llvm::Triple::riscv32 ||
- arch_machine == llvm::Triple::riscv64 ||
- arch_machine == llvm::Triple::riscv32be ||
- arch_machine == llvm::Triple::riscv64be) {
+ } else if (IsRISCVArch(arch.GetMachine())) {
if (symbol.getBinding() == STB_LOCAL) {
char mapping_symbol = FindRISCVMappingSymbol(symbol_name);
if (symbol_type == eSymbolTypeCode) {
+ // Only handle $d and $x mapping symbols.
+ // Other mapping symbols are ignored as they don't affect address
+ // classification.
switch (mapping_symbol) {
case 'x':
// $x - marks a RISCV instruction sequence
@@ -2276,7 +2282,7 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
}
}
- if (arch_machine == llvm::Triple::arm) {
+ if (arch.GetMachine() == llvm::Triple::arm) {
if (symbol_type == eSymbolTypeCode) {
if (symbol.st_value & 1) {
// Subtracting 1 from the address effectively unsets the low order
More information about the lldb-commits
mailing list