================ @@ -0,0 +1,58 @@ +// REQUIRES: system-linux, native ---------------- labath wrote:
If it was a lot of work then sure, I'd agree with you -- but I don't think that's the case here. I just gave it a shot, and this is the only change I needed to make on top of your patch to be able to parse DT_NEEDED of a section-free file (disclaimer: This code is mainly for demonstration, it's possible there is a better way to do that): ``` diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index d26215a9ce3f..5f0d2233b865 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -3810,28 +3810,26 @@ std::optional<DataExtractor> ObjectFileELF::GetDynstrData() { } } - // Every ELF file which represents an executable or shared library has - // mandatory .dynamic entries. Two of these values are DT_STRTAB and DT_STRSZ - // and represent the dynamic symbol tables's string table. These are needed - // by the dynamic loader and we can read them from a process' address space. - // - // When loading and ELF file from memory, only the program headers end up - // being mapped into memory, and we can find these values in the PT_DYNAMIC - // segment. - if (!IsInMemory()) - return std::nullopt; - ProcessSP process_sp(m_process_wp.lock()); - if (!process_sp) - return std::nullopt; - const ELFDynamic *strtab = FindDynamicSymbol(DT_STRTAB); const ELFDynamic *strsz = FindDynamicSymbol(DT_STRSZ); if (strtab == nullptr || strsz == nullptr) return std::nullopt; - if (DataBufferSP data_sp = - ReadMemory(process_sp, strtab->d_ptr, strsz->d_val)) - return DataExtractor(data_sp, GetByteOrder(), GetAddressByteSize()); + if (ProcessSP process_sp = m_process_wp.lock()) { + if (DataBufferSP data_sp = + ReadMemory(process_sp, strtab->d_ptr, strsz->d_val)) + return DataExtractor(data_sp, GetByteOrder(), GetAddressByteSize()); + } else { + Address addr; + if (addr.ResolveAddressUsingFileSections(strtab->d_ptr, GetSectionList())) { + DataExtractor data; + addr.GetSection()->GetSectionData(data); + return DataExtractor(data, + strtab->d_ptr - addr.GetSection()->GetFileOffset(), + strsz->d_val); + } + } + return std::nullopt; } ``` And I think this goes a long way towards improving the testability of this patch. I know section-free files aren't likely to be of much use, but they're really great for testing, and in terms of raw LOC, such a test may cover 80% of this patch. https://github.com/llvm/llvm-project/pull/101237 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits