summaryrefslogtreecommitdiff
path: root/tests/repeated-updates.sh
blob: da7715ab114e38194b6580562459391d5f85e4ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#! /bin/sh -e

SCRATCH=scratch/$(basename "$0" .sh)
PATCHELF=$(readlink -f "../src/patchelf")
READELF=${READELF:-readelf}

rm -rf "${SCRATCH}"
mkdir -p "${SCRATCH}"

cp simple "${SCRATCH}/"
cp libfoo.so "${SCRATCH}/"
cp libbar.so "${SCRATCH}/"

cd "${SCRATCH}"

${PATCHELF} --add-needed ./libbar.so simple

###############################################################################
# Test that repeatedly modifying a string inside a shared library does not
# corrupt it due to the addition of multiple PT_LOAD entries
###############################################################################
load_segments_before=$(${READELF} -W -l libbar.so | grep -c LOAD)

for _ in $(seq 1 100)
do
    ${PATCHELF} --set-soname ./libbar.so libbar.so
    ${PATCHELF} --set-soname libbar.so libbar.so
    ./simple || exit 1
done

load_segments_after=$(${READELF} -W -l libbar.so | grep -c LOAD)

###############################################################################
# To be even more strict, check that we don't add too many extra LOAD entries
###############################################################################
echo "Segments before: ${load_segments_before} and after: ${load_segments_after}"
if [ "${load_segments_after}" -gt $((load_segments_before + 2)) ]
then
    exit 1
fi