summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/patchelf.cc4
-rw-r--r--tests/Makefile.am3
-rwxr-xr-xtests/replace-needed.sh21
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