Author: Jason Molenda Date: 2025-03-06T17:19:43-08:00 New Revision: 82af9888dbbcd248ec4d41968c53135e12e13454
URL: https://github.com/llvm/llvm-project/commit/82af9888dbbcd248ec4d41968c53135e12e13454 DIFF: https://github.com/llvm/llvm-project/commit/82af9888dbbcd248ec4d41968c53135e12e13454.diff LOG: Revert "[lldb][Mach-O] Don't read symbol table of specially marked binary (#129967)" This reverts commit 397696bb3d26c1298bf265e4907b0b6416ad59c9. This breaks the macOS CI bots, I need to use $LDFLAGS in the $LD invocation when building the dylib to get the dylibs to build on the CI bots. But I've added "-lno-nlists -lhas-nlists" to the LDFLAGS for the main binary in the same directory, so using LDFLAGS will result in a compile error for the dylibs. I'll need to build the dylibs in a subdir with a different Makefile, will reland with that change in a bit. Added: Modified: lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h Removed: lldb/test/API/macosx/no-nlist-memory-module/Makefile lldb/test/API/macosx/no-nlist-memory-module/TestNoNlistsDylib.py lldb/test/API/macosx/no-nlist-memory-module/has-nlists.c lldb/test/API/macosx/no-nlist-memory-module/main.c lldb/test/API/macosx/no-nlist-memory-module/no-nlist-sect.s lldb/test/API/macosx/no-nlist-memory-module/no-nlists.c ################################################################################ diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp index f31b56b9f81e6..a19322ff1e263 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -918,11 +918,6 @@ ConstString ObjectFileMachO::GetSectionNameEHFrame() { return g_section_name_eh_frame; } -ConstString ObjectFileMachO::GetSectionNameLLDBNoNlist() { - static ConstString g_section_name_lldb_no_nlist("__lldb_no_nlist"); - return g_section_name_lldb_no_nlist; -} - bool ObjectFileMachO::MagicBytesMatch(DataBufferSP data_sp, lldb::addr_t data_offset, lldb::addr_t data_length) { @@ -2399,39 +2394,8 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) { uint32_t memory_module_load_level = eMemoryModuleLoadLevelComplete; bool is_shared_cache_image = IsSharedCacheBinary(); bool is_local_shared_cache_image = is_shared_cache_image && !IsInMemory(); - - ConstString g_segment_name_TEXT = GetSegmentNameTEXT(); - ConstString g_segment_name_DATA = GetSegmentNameDATA(); - ConstString g_segment_name_DATA_DIRTY = GetSegmentNameDATA_DIRTY(); - ConstString g_segment_name_DATA_CONST = GetSegmentNameDATA_CONST(); - ConstString g_segment_name_OBJC = GetSegmentNameOBJC(); - ConstString g_section_name_eh_frame = GetSectionNameEHFrame(); - ConstString g_section_name_lldb_no_nlist = GetSectionNameLLDBNoNlist(); - SectionSP text_section_sp( - section_list->FindSectionByName(g_segment_name_TEXT)); - SectionSP data_section_sp( - section_list->FindSectionByName(g_segment_name_DATA)); SectionSP linkedit_section_sp( section_list->FindSectionByName(GetSegmentNameLINKEDIT())); - SectionSP data_dirty_section_sp( - section_list->FindSectionByName(g_segment_name_DATA_DIRTY)); - SectionSP data_const_section_sp( - section_list->FindSectionByName(g_segment_name_DATA_CONST)); - SectionSP objc_section_sp( - section_list->FindSectionByName(g_segment_name_OBJC)); - SectionSP eh_frame_section_sp; - SectionSP lldb_no_nlist_section_sp; - if (text_section_sp.get()) { - eh_frame_section_sp = text_section_sp->GetChildren().FindSectionByName( - g_section_name_eh_frame); - lldb_no_nlist_section_sp = text_section_sp->GetChildren().FindSectionByName( - g_section_name_lldb_no_nlist); - } else { - eh_frame_section_sp = - section_list->FindSectionByName(g_section_name_eh_frame); - lldb_no_nlist_section_sp = - section_list->FindSectionByName(g_section_name_lldb_no_nlist); - } if (process && m_header.filetype != llvm::MachO::MH_OBJECT && !is_local_shared_cache_image) { @@ -2439,14 +2403,6 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) { memory_module_load_level = target.GetMemoryModuleLoadLevel(); - // If __TEXT,__lldb_no_nlist section is present in this binary, - // and we're reading it out of memory, do not read any of the - // nlist entries. They are not needed in lldb and it may be - // expensive to load these. This is to handle a dylib consisting - // of only metadata, no code, but it has many nlist entries. - if (lldb_no_nlist_section_sp) - memory_module_load_level = eMemoryModuleLoadLevelMinimal; - // Reading mach file from memory in a process or core file... if (linkedit_section_sp) { @@ -2570,6 +2526,30 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) { const bool have_strtab_data = strtab_data.GetByteSize() > 0; + ConstString g_segment_name_TEXT = GetSegmentNameTEXT(); + ConstString g_segment_name_DATA = GetSegmentNameDATA(); + ConstString g_segment_name_DATA_DIRTY = GetSegmentNameDATA_DIRTY(); + ConstString g_segment_name_DATA_CONST = GetSegmentNameDATA_CONST(); + ConstString g_segment_name_OBJC = GetSegmentNameOBJC(); + ConstString g_section_name_eh_frame = GetSectionNameEHFrame(); + SectionSP text_section_sp( + section_list->FindSectionByName(g_segment_name_TEXT)); + SectionSP data_section_sp( + section_list->FindSectionByName(g_segment_name_DATA)); + SectionSP data_dirty_section_sp( + section_list->FindSectionByName(g_segment_name_DATA_DIRTY)); + SectionSP data_const_section_sp( + section_list->FindSectionByName(g_segment_name_DATA_CONST)); + SectionSP objc_section_sp( + section_list->FindSectionByName(g_segment_name_OBJC)); + SectionSP eh_frame_section_sp; + if (text_section_sp.get()) + eh_frame_section_sp = text_section_sp->GetChildren().FindSectionByName( + g_section_name_eh_frame); + else + eh_frame_section_sp = + section_list->FindSectionByName(g_section_name_eh_frame); + const bool is_arm = (m_header.cputype == llvm::MachO::CPU_TYPE_ARM); const bool always_thumb = GetArchitecture().IsAlwaysThumbInstructions(); diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h index 7f67f5e04f1d6..27b2078b5a3fc 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h @@ -286,7 +286,6 @@ class ObjectFileMachO : public lldb_private::ObjectFile { static lldb_private::ConstString GetSegmentNameDWARF(); static lldb_private::ConstString GetSegmentNameLLVM_COV(); static lldb_private::ConstString GetSectionNameEHFrame(); - static lldb_private::ConstString GetSectionNameLLDBNoNlist(); llvm::MachO::dysymtab_command m_dysymtab; std::vector<llvm::MachO::section_64> m_mach_sections; diff --git a/lldb/test/API/macosx/no-nlist-memory-module/Makefile b/lldb/test/API/macosx/no-nlist-memory-module/Makefile deleted file mode 100644 index 8271c3165ef07..0000000000000 --- a/lldb/test/API/macosx/no-nlist-memory-module/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -C_SOURCES := main.c -LD_EXTRAS = -Wl,-rpath "-Wl,$(shell pwd)" -L. -lno-nlists -lhas-nlists - -.PHONY: build-libno-nlists build-libhas-nlists -all: build-libno-nlists build-libhas-nlists a.out - -include Makefile.rules - -build-libno-nlists: no-nlists.c no-nlist-sect.s - $(CC) $(CFLAGS) -c -o no-nlists.o $(<D)/no-nlists.c - $(CC) $(CFLAGS) -c -o no-nlist-sect.o $(<D)/no-nlist-sect.s - $(LD) -dynamiclib -o libno-nlists.dylib no-nlists.o no-nlist-sect.o -install_name "@executable_path/libno-nlists.dylib" - -build-libhas-nlists: has-nlists.c - $(CC) $(CFLAGS) -c -o has-nlists.o $(<D)/has-nlists.c - $(LD) -dynamiclib -o libhas-nlists.dylib has-nlists.o -install_name "@executable_path/libhas-nlists.dylib" - -clean:: - rm -rf *.o *.dylib a.out *.dSYM diff --git a/lldb/test/API/macosx/no-nlist-memory-module/TestNoNlistsDylib.py b/lldb/test/API/macosx/no-nlist-memory-module/TestNoNlistsDylib.py deleted file mode 100644 index 9216cf2eab164..0000000000000 --- a/lldb/test/API/macosx/no-nlist-memory-module/TestNoNlistsDylib.py +++ /dev/null @@ -1,71 +0,0 @@ -""" -Test that we read don't read the nlist symbols for a specially marked dylib -when read from memory. -""" - -import os -import lldb -from lldbsuite.test.decorators import * -from lldbsuite.test.lldbtest import * -from lldbsuite.test import lldbutil -from time import sleep - - -class NoNlistsTestCase(TestBase): - NO_DEBUG_INFO_TESTCASE = True - - @skipIfRemote - @skipUnlessDarwin - def test_no_nlist_symbols(self): - self.build() - - exe = os.path.realpath(self.getBuildArtifact("a.out")) - - # Use a file as a synchronization point between test and inferior. - pid_file_path = lldbutil.append_to_process_working_directory( - self, "pid_file_%d" % (int(time.time())) - ) - self.addTearDownHook( - lambda: self.run_platform_command("rm %s" % (pid_file_path)) - ) - - # Spawn a new process - popen = self.spawnSubprocess(exe, [pid_file_path]) - - pid = lldbutil.wait_for_file_on_target(self, pid_file_path) - - os.unlink(self.getBuildArtifact("libno-nlists.dylib")) - os.unlink(self.getBuildArtifact("libhas-nlists.dylib")) - - self.runCmd("process attach -p " + str(pid)) - target = self.dbg.GetSelectedTarget() - process = target.GetProcess() - m_no_nlist = target.FindModule(lldb.SBFileSpec("libno-nlists.dylib")) - m_has_nlist = target.FindModule(lldb.SBFileSpec("libhas-nlists.dylib")) - - self.assertTrue(process, PROCESS_IS_VALID) - - if self.TraceOn(): - self.runCmd("image list") - self.runCmd("target modules dump symtab libno-nlists.dylib") - self.runCmd("target modules dump symtab libhas-nlists.dylib") - - # Test that we found libno-nlists.dylib, it is a memory - # module, and that it has no symbols. - self.assertTrue(m_no_nlist.IsValid()) - self.assertFalse(m_no_nlist.IsFileBacked()) - self.assertEqual(m_no_nlist.GetNumSymbols(), 0) - - # Test that we found libhas-nlists.dylib, it is a memory - # module, and that it has more than zero symbols. - self.assertTrue(m_has_nlist.IsValid()) - self.assertFalse(m_has_nlist.IsFileBacked()) - self.assertGreater(m_has_nlist.GetNumSymbols(), 0) - - # And as a sanity check, get the main binary's module, - # test that it is file backed and that it has more than - # zero symbols. - m_exe = target.FindModule(lldb.SBFileSpec("a.out")) - self.assertTrue(m_exe.IsValid()) - self.assertTrue(m_exe.IsFileBacked()) - self.assertGreater(m_exe.GetNumSymbols(), 0) diff --git a/lldb/test/API/macosx/no-nlist-memory-module/has-nlists.c b/lldb/test/API/macosx/no-nlist-memory-module/has-nlists.c deleted file mode 100644 index 5cfcb5118bbb7..0000000000000 --- a/lldb/test/API/macosx/no-nlist-memory-module/has-nlists.c +++ /dev/null @@ -1 +0,0 @@ -int get_return_value2() { return 20; } diff --git a/lldb/test/API/macosx/no-nlist-memory-module/main.c b/lldb/test/API/macosx/no-nlist-memory-module/main.c deleted file mode 100644 index 16a8e4e7ae34b..0000000000000 --- a/lldb/test/API/macosx/no-nlist-memory-module/main.c +++ /dev/null @@ -1,62 +0,0 @@ -#include <fcntl.h> -#include <libgen.h> -#include <stdbool.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/errno.h> -#include <sys/param.h> -#include <sys/stat.h> -#include <unistd.h> - -int get_return_value(); -int get_return_value2(); - -// Create \a file_name with the c-string of our -// pid in it. Initially open & write the contents -// to a temporary file, then move it to the actual -// filename once writing is completed. -bool writePid(const char *file_name, const pid_t pid) { - char *tmp_file_name = (char *)malloc(strlen(file_name) + 16); - strcpy(tmp_file_name, file_name); - strcat(tmp_file_name, "_tmp"); - int fd = open(tmp_file_name, O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR); - if (fd == -1) { - fprintf(stderr, "open(%s) failed: %s\n", tmp_file_name, strerror(errno)); - free(tmp_file_name); - return false; - } - char buffer[64]; - snprintf(buffer, sizeof(buffer), "%ld", (long)pid); - bool res = true; - if (write(fd, buffer, strlen(buffer)) == -1) { - fprintf(stderr, "write(%s) failed: %s\n", buffer, strerror(errno)); - res = false; - } - close(fd); - - if (rename(tmp_file_name, file_name) == -1) { - fprintf(stderr, "rename(%s, %s) failed: %s\n", tmp_file_name, file_name, - strerror(errno)); - res = false; - } - free(tmp_file_name); - - return res; -} - -int main(int argc, char **argv) { - if (writePid(argv[1], getpid())) { - // we've signaled lldb we are ready to be attached to, - // this sleep() call will be interrupted when lldb - // attaches. - sleep(200); - } else { - printf("Error writing pid to '%s', exiting.\n", argv[1]); - exit(3); - } - - int retval = get_return_value(); - return retval + get_return_value2(); -} diff --git a/lldb/test/API/macosx/no-nlist-memory-module/no-nlist-sect.s b/lldb/test/API/macosx/no-nlist-memory-module/no-nlist-sect.s deleted file mode 100644 index 0a7c974f9362c..0000000000000 --- a/lldb/test/API/macosx/no-nlist-memory-module/no-nlist-sect.s +++ /dev/null @@ -1,3 +0,0 @@ - .section __TEXT,__lldb_no_nlist,regular,pure_instructions - .p2align 2 - .byte 0x10 diff --git a/lldb/test/API/macosx/no-nlist-memory-module/no-nlists.c b/lldb/test/API/macosx/no-nlist-memory-module/no-nlists.c deleted file mode 100644 index ff81940087ab7..0000000000000 --- a/lldb/test/API/macosx/no-nlist-memory-module/no-nlists.c +++ /dev/null @@ -1 +0,0 @@ -int get_return_value() { return 10; } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits