From d54f947c983930765bc4e0c0c91b9244595b1e8e Mon Sep 17 00:00:00 2001 From: "Markus F.X.J. Oberhumer" Date: Mon, 7 Apr 2008 18:44:00 +0200 Subject: [PATCH] Add Packer::hasLoaderSection() to handle missing CFLUSH sections. --- src/p_lx_elf.cpp | 4 +++- src/p_mach.cpp | 4 +++- src/packer.cpp | 5 +++++ src/packer.h | 1 + 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/p_lx_elf.cpp b/src/p_lx_elf.cpp index 51c304b2..d02cd941 100644 --- a/src/p_lx_elf.cpp +++ b/src/p_lx_elf.cpp @@ -193,7 +193,9 @@ PackLinuxElf::addStubEntrySections(Filter const *) : M_IS_NRV2B(ph.method) ? "NRV_HEAD,NRV2B,NRV_TAIL" : M_IS_LZMA(ph.method) ? "LZMA_ELF00,+80C,LZMA_DEC20,LZMA_DEC30" : NULL), NULL); - addLoader("CFLUSH,ELFMAINY,IDENTSTR,+40,ELFMAINZ,FOLDEXEC", NULL); + if (hasLoaderSection("CFLUSH")) + addLoader("CFLUSH"); + addLoader("ELFMAINY,IDENTSTR,+40,ELFMAINZ,FOLDEXEC", NULL); } diff --git a/src/p_mach.cpp b/src/p_mach.cpp index a986b308..6dd774a3 100644 --- a/src/p_mach.cpp +++ b/src/p_mach.cpp @@ -104,7 +104,9 @@ PackMachBase::addStubEntrySections(Filter const *) : M_IS_NRV2B(ph.method) ? "NRV_HEAD,NRV2B,NRV_TAIL" : M_IS_LZMA(ph.method) ? "LZMA_ELF00,LZMA_DEC20,LZMA_DEC30" : NULL), NULL); - addLoader("CFLUSH,ELFMAINY,IDENTSTR,+40,ELFMAINZ,FOLDEXEC", NULL); + if (hasLoaderSection("CFLUSH")) + addLoader("CFLUSH"); + addLoader("ELFMAINY,IDENTSTR,+40,ELFMAINZ,FOLDEXEC", NULL); } void PackMachI386::addStubEntrySections(Filter const *ft) diff --git a/src/packer.cpp b/src/packer.cpp index fbd706dc..3bda2cc3 100644 --- a/src/packer.cpp +++ b/src/packer.cpp @@ -1121,6 +1121,11 @@ int Packer::getLoaderSize() const return size; } +bool Packer::hasLoaderSection(const char *name) const +{ + void *section = linker->findSection(name, false); + return section != NULL; +} int Packer::getLoaderSection(const char *name, int *slen) const { diff --git a/src/packer.h b/src/packer.h index d0607faf..e0b91f0b 100644 --- a/src/packer.h +++ b/src/packer.h @@ -240,6 +240,7 @@ protected: #else void __acc_cdecl_va addLoaderVA(const char *s, ...); #endif + virtual bool hasLoaderSection(const char *name) const; virtual int getLoaderSection(const char *name, int *slen=NULL) const; virtual int getLoaderSectionStart(const char *name, int *slen=NULL) const;