[Lldb-commits] [lldb] Omit loading local symbols in LLDB symbol table (PR #154809)
via lldb-commits
lldb-commits at lists.llvm.org
Thu Aug 21 14:46:30 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/5] 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/5] 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/5] 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/5] 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/5] 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
More information about the lldb-commits
mailing list