Improve Packer:addLoader(). We're still somewhat limited because of gcc-bug
#29823 (see http://gcc.gnu.org/PR29823).
This commit is contained in:
parent
e61f481881
commit
db7ae4ed5d
@ -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);
|
||||
|
||||
@ -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<char>(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
|
||||
{
|
||||
|
||||
11
src/packer.h
11
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 <class T> void __acc_cdecl_va addLoader(const T *, ...) __attribute__((__sentinel__));
|
||||
#else
|
||||
//virtual void addLoader(const char *);
|
||||
virtual void __acc_cdecl_va addLoader(const char *, ...);
|
||||
template <class T> 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<char>(const char *s, ...);
|
||||
|
||||
|
||||
#endif /* already included */
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user