Improve Packer:addLoader(). We're still somewhat limited because of gcc-bug
#29823 (see http://gcc.gnu.org/PR29823).
This commit is contained in:
+2
-1
@@ -344,7 +344,8 @@ void ElfLinker::setLoaderAlignOffset(int phase)
|
|||||||
|
|
||||||
int ElfLinker::addLoader(const char *sname)
|
int ElfLinker::addLoader(const char *sname)
|
||||||
{
|
{
|
||||||
if (sname[0] == 0)
|
assert(sname != NULL);
|
||||||
|
if (!sname[0])
|
||||||
return outputlen;
|
return outputlen;
|
||||||
|
|
||||||
char *begin = strdup(sname);
|
char *begin = strdup(sname);
|
||||||
|
|||||||
+24
-33
@@ -929,31 +929,7 @@ unsigned Packer::unoptimizeReloc32(upx_byte **in, upx_byte *image,
|
|||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// loader util
|
// loader util (interface to linker)
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
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
|
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
static const char *getIdentstr(unsigned *size, int small)
|
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);
|
linker->addSection("IDENTSTR", ident, size, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
void Packer::addLoader(const char *s)
|
void Packer::addLoader(const char *s)
|
||||||
{
|
{
|
||||||
if (s && *s)
|
if (s)
|
||||||
linker->addLoader(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_list ap;
|
||||||
|
|
||||||
va_start(ap, s);
|
va_start(ap, s);
|
||||||
while (s != NULL)
|
while (s != NULL)
|
||||||
{
|
{
|
||||||
if (*s)
|
linker->addLoader(s);
|
||||||
linker->addLoader(s);
|
|
||||||
s = va_arg(ap, const char *);
|
s = va_arg(ap, const char *);
|
||||||
}
|
}
|
||||||
va_end(ap);
|
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
|
int Packer::getLoaderSection(const char *name, int *slen) const
|
||||||
{
|
{
|
||||||
@@ -1062,7 +1054,6 @@ int Packer::getLoaderSection(const char *name, int *slen) const
|
|||||||
return ostart;
|
return ostart;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// same, but the size of the section may be == 0
|
// same, but the size of the section may be == 0
|
||||||
int Packer::getLoaderSectionStart(const char *name, int *slen) const
|
int Packer::getLoaderSectionStart(const char *name, int *slen) const
|
||||||
{
|
{
|
||||||
|
|||||||
+7
-4
@@ -209,12 +209,11 @@ protected:
|
|||||||
virtual upx_byte *getLoader() const;
|
virtual upx_byte *getLoader() const;
|
||||||
virtual int getLoaderSize() const;
|
virtual int getLoaderSize() const;
|
||||||
virtual void initLoader(const void *pdata, int plen, int small=-1);
|
virtual void initLoader(const void *pdata, int plen, int small=-1);
|
||||||
|
void addLoader(const char *);
|
||||||
#if 1 && (ACC_CC_GNUC >= 0x040100)
|
#if 1 && (ACC_CC_GNUC >= 0x040100)
|
||||||
//virtual void addLoader(const char *);
|
template <class T> void __acc_cdecl_va addLoader(const T *, ...) __attribute__((__sentinel__));
|
||||||
virtual void __acc_cdecl_va addLoader(const char *, ...) __attribute__((__sentinel__));
|
|
||||||
#else
|
#else
|
||||||
//virtual void addLoader(const char *);
|
template <class T> void __acc_cdecl_va addLoader(const T *, ...);
|
||||||
virtual void __acc_cdecl_va addLoader(const char *, ...);
|
|
||||||
#endif
|
#endif
|
||||||
virtual int getLoaderSection(const char *name, int *slen=NULL) const;
|
virtual int getLoaderSection(const char *name, int *slen=NULL) const;
|
||||||
virtual int getLoaderSectionStart(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 */
|
#endif /* already included */
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user