splhack created this revision. Herald added a subscriber: emaste. Herald added a project: All. splhack added reviewers: clayborg, labath, friss, lanza. splhack published this revision for review. Herald added subscribers: lldb-commits, MaskRay. Herald added a project: LLDB.
In Android API level 23 and above, dynamic loader is able to load .so file directly from APK. https://android.googlesource.com/platform/bionic/+/master/ android-changes-for-ndk-developers.md# opening-shared-libraries-directly-from-an-apk ObjectFileELF::GetModuleSpecifications will load a .so file, which is page aligned and uncompressed, directly from a zip file. However it does not set the .so file offset and size to the ModuleSpec. Also crc32 calculation uses more data than the .so file size. Set the .so file offset and size to the ModuleSpec, and set the size to MapFileData length argument. For normal file, file_offset should be zero, and length should be the size of the file. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D152757 Files: lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp lldb/unittests/ObjectFile/ELF/CMakeLists.txt lldb/unittests/ObjectFile/ELF/Inputs/liboffset-test.so lldb/unittests/ObjectFile/ELF/Inputs/offset-test.bin lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp Index: lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp =================================================================== --- lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp +++ lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp @@ -156,6 +156,35 @@ EXPECT_EQ(Spec.GetUUID(), Uuid); } +TEST_F(ObjectFileELFTest, GetModuleSpecifications_OffsetSizeWithNormalFile) { + std::string SO = GetInputFilePath("liboffset-test.so"); + ModuleSpecList Specs; + ASSERT_EQ(1u, ObjectFile::GetModuleSpecifications(FileSpec(SO), 0, 0, Specs)); + ModuleSpec Spec; + ASSERT_TRUE(Specs.GetModuleSpecAtIndex(0, Spec)) ; + UUID Uuid; + Uuid.SetFromStringRef("7D6E4738"); + EXPECT_EQ(Spec.GetUUID(), Uuid); + EXPECT_EQ(Spec.GetObjectOffset(), 0); + EXPECT_EQ(Spec.GetObjectSize(), 3600); + EXPECT_EQ(FileSystem::Instance().GetByteSize(FileSpec(SO)), 3600); +} + +TEST_F(ObjectFileELFTest, GetModuleSpecifications_OffsetSizeWithOffsetFile) { + std::string SO = GetInputFilePath("offset-test.bin"); + ModuleSpecList Specs; + ASSERT_EQ(1u, ObjectFile::GetModuleSpecifications(FileSpec(SO), 1024, 3600, + Specs)); + ModuleSpec Spec; + ASSERT_TRUE(Specs.GetModuleSpecAtIndex(0, Spec)) ; + UUID Uuid; + Uuid.SetFromStringRef("7D6E4738"); + EXPECT_EQ(Spec.GetUUID(), Uuid); + EXPECT_EQ(Spec.GetObjectOffset(), 1024); + EXPECT_EQ(Spec.GetObjectSize(), 3600); + EXPECT_EQ(FileSystem::Instance().GetByteSize(FileSpec(SO)), 4640); +} + TEST_F(ObjectFileELFTest, GetSymtab_NoSymEntryPointArmThumbAddressClass) { /* // nosym-entrypoint-arm-thumb.s Index: lldb/unittests/ObjectFile/ELF/CMakeLists.txt =================================================================== --- lldb/unittests/ObjectFile/ELF/CMakeLists.txt +++ lldb/unittests/ObjectFile/ELF/CMakeLists.txt @@ -11,5 +11,7 @@ set(test_inputs early-section-headers.so + liboffset-test.so + offset-test.bin ) add_unittest_inputs(ObjectFileELFTests "${test_inputs}") Index: lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp =================================================================== --- lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -555,6 +555,8 @@ if (header.Parse(data, &header_offset)) { if (data_sp) { ModuleSpec spec(file); + spec.SetObjectOffset(file_offset); + spec.SetObjectSize(length); const uint32_t sub_type = subTypeFromElfHeader(header); spec.GetArchitecture().SetArchitecture( @@ -587,7 +589,7 @@ } if (data_sp->GetByteSize() < length) - data_sp = MapFileData(file, -1, file_offset); + data_sp = MapFileData(file, length, file_offset); if (data_sp) data.SetData(data_sp); // In case there is header extension in the section #0, the header we
Index: lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp =================================================================== --- lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp +++ lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp @@ -156,6 +156,35 @@ EXPECT_EQ(Spec.GetUUID(), Uuid); } +TEST_F(ObjectFileELFTest, GetModuleSpecifications_OffsetSizeWithNormalFile) { + std::string SO = GetInputFilePath("liboffset-test.so"); + ModuleSpecList Specs; + ASSERT_EQ(1u, ObjectFile::GetModuleSpecifications(FileSpec(SO), 0, 0, Specs)); + ModuleSpec Spec; + ASSERT_TRUE(Specs.GetModuleSpecAtIndex(0, Spec)) ; + UUID Uuid; + Uuid.SetFromStringRef("7D6E4738"); + EXPECT_EQ(Spec.GetUUID(), Uuid); + EXPECT_EQ(Spec.GetObjectOffset(), 0); + EXPECT_EQ(Spec.GetObjectSize(), 3600); + EXPECT_EQ(FileSystem::Instance().GetByteSize(FileSpec(SO)), 3600); +} + +TEST_F(ObjectFileELFTest, GetModuleSpecifications_OffsetSizeWithOffsetFile) { + std::string SO = GetInputFilePath("offset-test.bin"); + ModuleSpecList Specs; + ASSERT_EQ(1u, ObjectFile::GetModuleSpecifications(FileSpec(SO), 1024, 3600, + Specs)); + ModuleSpec Spec; + ASSERT_TRUE(Specs.GetModuleSpecAtIndex(0, Spec)) ; + UUID Uuid; + Uuid.SetFromStringRef("7D6E4738"); + EXPECT_EQ(Spec.GetUUID(), Uuid); + EXPECT_EQ(Spec.GetObjectOffset(), 1024); + EXPECT_EQ(Spec.GetObjectSize(), 3600); + EXPECT_EQ(FileSystem::Instance().GetByteSize(FileSpec(SO)), 4640); +} + TEST_F(ObjectFileELFTest, GetSymtab_NoSymEntryPointArmThumbAddressClass) { /* // nosym-entrypoint-arm-thumb.s Index: lldb/unittests/ObjectFile/ELF/CMakeLists.txt =================================================================== --- lldb/unittests/ObjectFile/ELF/CMakeLists.txt +++ lldb/unittests/ObjectFile/ELF/CMakeLists.txt @@ -11,5 +11,7 @@ set(test_inputs early-section-headers.so + liboffset-test.so + offset-test.bin ) add_unittest_inputs(ObjectFileELFTests "${test_inputs}") Index: lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp =================================================================== --- lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -555,6 +555,8 @@ if (header.Parse(data, &header_offset)) { if (data_sp) { ModuleSpec spec(file); + spec.SetObjectOffset(file_offset); + spec.SetObjectSize(length); const uint32_t sub_type = subTypeFromElfHeader(header); spec.GetArchitecture().SetArchitecture( @@ -587,7 +589,7 @@ } if (data_sp->GetByteSize() < length) - data_sp = MapFileData(file, -1, file_offset); + data_sp = MapFileData(file, length, file_offset); if (data_sp) data.SetData(data_sp); // In case there is header extension in the section #0, the header we
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits