From d02a3ecdd7b811683d319efa9d24bdae09a3036d Mon Sep 17 00:00:00 2001 From: Farid Zakaria Date: Tue, 21 Dec 2021 05:51:04 -0800 Subject: [PATCH] Code clarity and test working with musl Made changes according to feedback from @Mic92 such as moving the `rewriteSections` inline into every method. Improved `replace-add-needed.sh` to work with musl libc --- src/patchelf.cc | 33 ++++++++++++++++----------------- tests/replace-add-needed.sh | 2 +- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/patchelf.cc b/src/patchelf.cc index 0923ec0..70390f4 100644 --- a/src/patchelf.cc +++ b/src/patchelf.cc @@ -1311,6 +1311,7 @@ void ElfFile::modifySoname(sonameMode op, const std::string & } changed = true; + this->rewriteSections(); } template @@ -1319,6 +1320,7 @@ void ElfFile::setInterpreter(const std::string & newInterpret std::string & section = replaceSection(".interp", newInterpreter.size() + 1); setSubstr(section, 0, newInterpreter + '\0'); changed = true; + this->rewriteSections(); } @@ -1395,6 +1397,7 @@ void ElfFile::removeRPath(Elf_Shdr & shdrDynamic) { } } memset(last, 0, sizeof(Elf_Dyn) * (dyn - last)); + this->rewriteSections(); } template @@ -1541,6 +1544,7 @@ void ElfFile::modifyRPath(RPathOp op, newDyn.d_un.d_val = shdrDynStr.sh_size; setSubstr(newDynamic, 0, std::string((char *) &newDyn, sizeof(Elf_Dyn))); } + this->rewriteSections(); } @@ -1570,6 +1574,8 @@ void ElfFile::removeNeeded(const std::set & libs } memset(last, 0, sizeof(Elf_Dyn) * (dyn - last)); + + this->rewriteSections(); } template @@ -1693,6 +1699,8 @@ void ElfFile::replaceNeeded(const std::maprewriteSections(); } template @@ -1743,6 +1751,8 @@ void ElfFile::addNeeded(const std::set & libs) } changed = true; + + this->rewriteSections(); } template @@ -1799,6 +1809,7 @@ void ElfFile::noDefaultLib() setSubstr(newDynamic, 0, std::string((char *) &newDyn, sizeof(Elf_Dyn))); } + this->rewriteSections(); changed = true; } @@ -1828,6 +1839,7 @@ void ElfFile::clearSymbolVersions(const std::set } } changed = true; + this->rewriteSections(); } static bool printInterpreter = false; @@ -1878,28 +1890,15 @@ static void patchElf2(ElfFile && elfFile, const FileContents & fileContents, con if (printNeeded) elfFile.printNeededLibs(); - if (!neededLibsToRemove.empty()) { - elfFile.removeNeeded(neededLibsToRemove); - elfFile.rewriteSections(); - } - if (!neededLibsToReplace.empty()) { - elfFile.replaceNeeded(neededLibsToReplace); - elfFile.rewriteSections(); - } - if (!neededLibsToAdd.empty()) { - elfFile.addNeeded(neededLibsToAdd); - elfFile.rewriteSections(); - } - if (!symbolsToClearVersion.empty()) { - elfFile.clearSymbolVersions(symbolsToClearVersion); - elfFile.rewriteSections(); - } + elfFile.removeNeeded(neededLibsToRemove); + elfFile.replaceNeeded(neededLibsToReplace); + elfFile.addNeeded(neededLibsToAdd); + elfFile.clearSymbolVersions(symbolsToClearVersion); if (noDefaultLib) elfFile.noDefaultLib(); if (elfFile.isChanged()){ - elfFile.rewriteSections(); writeFile(fileName, elfFile.fileContents); } else if (alwaysWrite) { debug("not modified, but alwaysWrite=true\n"); diff --git a/tests/replace-add-needed.sh b/tests/replace-add-needed.sh index b486897..4c88fd9 100755 --- a/tests/replace-add-needed.sh +++ b/tests/replace-add-needed.sh @@ -12,7 +12,7 @@ cp libbar.so ${SCRATCH}/ cd ${SCRATCH} -libcldd=$(ldd ./simple | grep -oP "(?<=libc.so.6 => )[^ ]+") +libcldd=$(ldd ./simple | awk '/ => / { print $3 }' | grep .so | head -n 1) # We have to set the soname on these libraries ${PATCHELF} --set-soname libbar.so ./libbar.so