diff --git a/src/linker.cpp b/src/linker.cpp index 4b6bd6af..ea738d84 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -344,7 +344,8 @@ void ElfLinker::setLoaderAlignOffset(int phase) int ElfLinker::addLoader(const char *sname) { - if (sname[0] == 0) + assert(sname != NULL); + if (!sname[0]) return outputlen; char *begin = strdup(sname); diff --git a/src/packer.cpp b/src/packer.cpp index 09cc7088..e1b9da5b 100644 --- a/src/packer.cpp +++ b/src/packer.cpp @@ -929,31 +929,7 @@ unsigned Packer::unoptimizeReloc32(upx_byte **in, upx_byte *image, /************************************************************************* -// loader util -**************************************************************************/ - -upx_byte *Packer::getLoader() const -{ - int size = -1; - upx_byte *oloader = linker->getLoader(&size); - if (oloader == NULL || size <= 0) - throwBadLoader(); - return oloader; -} - - -int Packer::getLoaderSize() const -{ - int size = -1; - upx_byte *oloader = linker->getLoader(&size); - if (oloader == NULL || size <= 0) - throwBadLoader(); - return size; -} - - -/************************************************************************* -// loader util +// loader util (interface to linker) **************************************************************************/ static const char *getIdentstr(unsigned *size, int small) @@ -1027,29 +1003,45 @@ void Packer::initLoader(const void *pdata, int plen, int small) linker->addSection("IDENTSTR", ident, size, 0); } - -#if 0 void Packer::addLoader(const char *s) { - if (s && *s) + if (s) linker->addLoader(s); } -#endif -void __acc_cdecl_va Packer::addLoader(const char *s, ...) +// provide specialization for [T = char] +template <> +void __acc_cdecl_va Packer::addLoader(const char *s, ...) { va_list ap; va_start(ap, s); while (s != NULL) { - if (*s) - linker->addLoader(s); + linker->addLoader(s); s = va_arg(ap, const char *); } va_end(ap); } +upx_byte *Packer::getLoader() const +{ + int size = -1; + upx_byte *oloader = linker->getLoader(&size); + if (oloader == NULL || size <= 0) + throwBadLoader(); + return oloader; +} + +int Packer::getLoaderSize() const +{ + int size = -1; + upx_byte *oloader = linker->getLoader(&size); + if (oloader == NULL || size <= 0) + throwBadLoader(); + return size; +} + int Packer::getLoaderSection(const char *name, int *slen) const { @@ -1062,7 +1054,6 @@ int Packer::getLoaderSection(const char *name, int *slen) const return ostart; } - // same, but the size of the section may be == 0 int Packer::getLoaderSectionStart(const char *name, int *slen) const { diff --git a/src/packer.h b/src/packer.h index 9d2107f3..0771acdb 100644 --- a/src/packer.h +++ b/src/packer.h @@ -209,12 +209,11 @@ protected: virtual upx_byte *getLoader() const; virtual int getLoaderSize() const; virtual void initLoader(const void *pdata, int plen, int small=-1); + void addLoader(const char *); #if 1 && (ACC_CC_GNUC >= 0x040100) - //virtual void addLoader(const char *); - virtual void __acc_cdecl_va addLoader(const char *, ...) __attribute__((__sentinel__)); + template void __acc_cdecl_va addLoader(const T *, ...) __attribute__((__sentinel__)); #else - //virtual void addLoader(const char *); - virtual void __acc_cdecl_va addLoader(const char *, ...); + template void __acc_cdecl_va addLoader(const T *, ...); #endif virtual int getLoaderSection(const char *name, int *slen=NULL) const; virtual int getLoaderSectionStart(const char *name, int *slen=NULL) const; @@ -293,6 +292,10 @@ private: }; +template <> +void __acc_cdecl_va Packer::addLoader(const char *s, ...); + + #endif /* already included */