mirror of
https://github.com/NixOS/patchelf.git
synced 2025-10-19 19:53:19 +08:00
Merge pull request #475 from brenoguim/breno.474
Use the largest segment alignment for libraries requiring non-standard alignments #474
This commit is contained in:
2
.github/workflows/publish.yml
vendored
2
.github/workflows/publish.yml
vendored
@@ -89,7 +89,7 @@ jobs:
|
||||
rm -f dist/*
|
||||
cd patchelf-*
|
||||
./configure --prefix /patchelf
|
||||
make check
|
||||
make check || (cat tests/test-suite.log; exit 1)
|
||||
make install-strip
|
||||
cd -
|
||||
tar -czf ./dist/patchelf-\$(cat patchelf-*/version)-\$(uname -m).tar.gz -C /patchelf .
|
||||
|
@@ -800,12 +800,17 @@ void ElfFile<ElfFileParamNames>::rewriteSectionsLibrary()
|
||||
page of other segments. */
|
||||
Elf_Addr startPage = 0;
|
||||
Elf_Addr firstPage = 0;
|
||||
unsigned alignStartPage = getPageSize();
|
||||
for (auto & phdr : phdrs) {
|
||||
Elf_Addr thisPage = roundUp(rdi(phdr.p_vaddr) + rdi(phdr.p_memsz), getPageSize());
|
||||
Elf_Addr thisPage = rdi(phdr.p_vaddr) + rdi(phdr.p_memsz);
|
||||
if (thisPage > startPage) startPage = thisPage;
|
||||
if (rdi(phdr.p_type) == PT_PHDR) firstPage = rdi(phdr.p_vaddr) - rdi(phdr.p_offset);
|
||||
unsigned thisAlign = rdi(phdr.p_align);
|
||||
alignStartPage = std::max(alignStartPage, thisAlign);
|
||||
}
|
||||
|
||||
startPage = roundUp(startPage, alignStartPage);
|
||||
|
||||
debug("last page is 0x%llx\n", (unsigned long long) startPage);
|
||||
debug("first page is 0x%llx\n", (unsigned long long) firstPage);
|
||||
|
||||
@@ -873,7 +878,7 @@ void ElfFile<ElfFileParamNames>::rewriteSectionsLibrary()
|
||||
if (!phdrs.empty() &&
|
||||
rdi(lastSeg.p_type) == PT_LOAD &&
|
||||
rdi(lastSeg.p_flags) == (PF_R | PF_W) &&
|
||||
rdi(lastSeg.p_align) == getPageSize()) {
|
||||
rdi(lastSeg.p_align) == alignStartPage) {
|
||||
auto segEnd = roundUp(rdi(lastSeg.p_offset) + rdi(lastSeg.p_memsz), getPageSize());
|
||||
if (segEnd == startOffset) {
|
||||
auto newSz = startOffset + neededSpace - rdi(lastSeg.p_offset);
|
||||
@@ -892,7 +897,7 @@ void ElfFile<ElfFileParamNames>::rewriteSectionsLibrary()
|
||||
wri(phdr.p_vaddr, wri(phdr.p_paddr, startPage));
|
||||
wri(phdr.p_filesz, wri(phdr.p_memsz, neededSpace));
|
||||
wri(phdr.p_flags, PF_R | PF_W);
|
||||
wri(phdr.p_align, getPageSize());
|
||||
wri(phdr.p_align, alignStartPage);
|
||||
}
|
||||
|
||||
normalizeNoteSegments();
|
||||
|
@@ -119,7 +119,7 @@ check_DATA = libbig-dynstr.debug
|
||||
# - with libtool, it is difficult to control options
|
||||
# - with libtool, it is not possible to compile convenience *dynamic* libraries :-(
|
||||
check_PROGRAMS += libfoo.so libfoo-scoped.so libbar.so libbar-scoped.so libsimple.so libsimple-execstack.so libbuildid.so libtoomanystrtab.so \
|
||||
phdr-corruption.so many-syms-main libmany-syms.so
|
||||
phdr-corruption.so many-syms-main libmany-syms.so liboveralign.so
|
||||
|
||||
libbuildid_so_SOURCES = simple.c
|
||||
libbuildid_so_LDFLAGS = $(LDFLAGS_sharedlib) -Wl,--build-id
|
||||
@@ -143,6 +143,9 @@ libbar_scoped_so_LDFLAGS = $(LDFLAGS_sharedlib)
|
||||
libsimple_so_SOURCES = simple.c
|
||||
libsimple_so_LDFLAGS = $(LDFLAGS_sharedlib) -Wl,-z,noexecstack
|
||||
|
||||
liboveralign_so_SOURCES = simple.c
|
||||
liboveralign_so_LDFLAGS = $(LDFLAGS_sharedlib) -Wl,-z,max-page-size=0x10000
|
||||
|
||||
libsimple_execstack_so_SOURCES = simple.c
|
||||
libsimple_execstack_so_LDFLAGS = $(LDFLAGS_sharedlib) -Wl,-z,execstack
|
||||
|
||||
|
@@ -14,6 +14,7 @@ mkdir -p "${SCRATCH}/libsB"
|
||||
cp main-scoped "${SCRATCH}/"
|
||||
cp libfoo-scoped.so "${SCRATCH}/libsA/"
|
||||
cp libbar-scoped.so "${SCRATCH}/libsB/"
|
||||
cp liboveralign.so "${SCRATCH}/"
|
||||
|
||||
oldRPath=$(../src/patchelf --print-rpath "${SCRATCH}"/main-scoped)
|
||||
if test -z "$oldRPath"; then oldRPath="/oops"; fi
|
||||
@@ -56,3 +57,12 @@ if test "$exitCode" != 46; then
|
||||
echo "bad exit code!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ALL loads should have the same alignment
|
||||
lib="${SCRATCH}/liboveralign.so"
|
||||
../src/patchelf --set-rpath "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" "$lib"
|
||||
num_alignments=$(${READELF} -W -l "${lib}" | awk '/LOAD/ { print $NF }' | sort -u | wc -l)
|
||||
echo "$num_alignments"
|
||||
if test "${num_alignments}" -ne "1"; then
|
||||
exit 1
|
||||
fi
|
||||
|
Reference in New Issue
Block a user