Improve Packer:addLoader(). We're still somewhat limited because of gcc-bug

#29823 (see http://gcc.gnu.org/PR29823).
This commit is contained in:
Markus F.X.J. Oberhumer 2006-11-16 18:52:20 +01:00
parent e61f481881
commit db7ae4ed5d
3 changed files with 33 additions and 38 deletions

View File

@ -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);

View File

@ -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
{

View File

@ -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 */