diff options
-rw-r--r-- | src/patchelf.cc | 33 | ||||
-rwxr-xr-x | 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<ElfFileParamNames>::modifySoname(sonameMode op, const std::string & } changed = true; + this->rewriteSections(); } template<ElfFileParams> @@ -1319,6 +1320,7 @@ void ElfFile<ElfFileParamNames>::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<ElfFileParamNames>::removeRPath(Elf_Shdr & shdrDynamic) { } } memset(last, 0, sizeof(Elf_Dyn) * (dyn - last)); + this->rewriteSections(); } template<ElfFileParams> @@ -1541,6 +1544,7 @@ void ElfFile<ElfFileParamNames>::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<ElfFileParamNames>::removeNeeded(const std::set<std::string> & libs } memset(last, 0, sizeof(Elf_Dyn) * (dyn - last)); + + this->rewriteSections(); } template<ElfFileParams> @@ -1693,6 +1699,8 @@ void ElfFile<ElfFileParamNames>::replaceNeeded(const std::map<std::string, std:: --verNeedNum; } } + + this->rewriteSections(); } template<ElfFileParams> @@ -1743,6 +1751,8 @@ void ElfFile<ElfFileParamNames>::addNeeded(const std::set<std::string> & libs) } changed = true; + + this->rewriteSections(); } template<ElfFileParams> @@ -1799,6 +1809,7 @@ void ElfFile<ElfFileParamNames>::noDefaultLib() setSubstr(newDynamic, 0, std::string((char *) &newDyn, sizeof(Elf_Dyn))); } + this->rewriteSections(); changed = true; } @@ -1828,6 +1839,7 @@ void ElfFile<ElfFileParamNames>::clearSymbolVersions(const std::set<std::string> } } 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 |