diff options
-rw-r--r-- | src/patchelf.cc | 4 | ||||
-rw-r--r-- | tests/Makefile.am | 3 | ||||
-rwxr-xr-x | tests/replace-needed.sh | 21 |
3 files changed, 27 insertions, 1 deletions
diff --git a/src/patchelf.cc b/src/patchelf.cc index 06f41c6..6148abd 100644 --- a/src/patchelf.cc +++ b/src/patchelf.cc @@ -1636,6 +1636,10 @@ void ElfFile<ElfFileParamNames>::replaceNeeded(const std::map<std::string, std:: debug("found .gnu.version_r with %i entries, strings in %s\n", verNeedNum, versionRStringsSName.c_str()); unsigned int verStrAddedBytes = 0; + // It may be that it is .dynstr again, in which case we must take the already + // added bytes into account. + if (versionRStringsSName == ".dynstr") + verStrAddedBytes += dynStrAddedBytes; auto need = (Elf_Verneed *)(fileContents->data() + rdi(shdrVersionR.sh_offset)); while (verNeedNum > 0) { diff --git a/tests/Makefile.am b/tests/Makefile.am index 24032f7..c1d61ce 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -38,7 +38,8 @@ src_TESTS = \ args-from-file.sh \ basic-flags.sh \ set-empty-rpath.sh \ - phdr-corruption.sh + phdr-corruption.sh \ + replace-needed.sh build_TESTS = \ $(no_rpath_arch_TESTS) diff --git a/tests/replace-needed.sh b/tests/replace-needed.sh new file mode 100755 index 0000000..0a5581c --- /dev/null +++ b/tests/replace-needed.sh @@ -0,0 +1,21 @@ +#! /bin/sh -e +SCRATCH=scratch/$(basename $0 .sh) + +rm -rf ${SCRATCH} +mkdir -p ${SCRATCH} + +oldNeeded=$(../src/patchelf --print-needed big-dynstr) +oldLibc=$(../src/patchelf --print-needed big-dynstr | grep -v 'foo\.so') +../src/patchelf --output ${SCRATCH}/big-needed --replace-needed ${oldLibc} long_long_very_long_libc.so.6 --replace-needed libfoo.so lf.so big-dynstr + +if [ -z "$(../src/patchelf --print-needed ${SCRATCH}/big-needed | grep -Fx "long_long_very_long_libc.so.6")" ]; then + echo "library long_long_very_long_libc.so.6 not found as NEEDED" + ../src/patchelf --print-needed ${SCRATCH}/big-needed + exit 1 +fi + +if [ -z "$(../src/patchelf --print-needed ${SCRATCH}/big-needed | grep -Fx "lf.so")" ]; then + echo "library lf.so not found as NEEDED" + ../src/patchelf --print-needed ${SCRATCH}/big-needed + exit 1 +fi |