diff --git a/src/linker.cpp b/src/linker.cpp index dcc523c7..435b4a31 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -439,6 +439,23 @@ int ElfLinker::addLoader(const char *sname) return outputlen; } +void ElfLinker::addLoader(const char *s, va_list ap) +{ + while (s != NULL) + { + addLoader(s); + s = va_arg(ap, const char *); + } +} + +void __acc_cdecl_va ElfLinker::addLoaderVA(const char *s, ...) +{ + va_list ap; + va_start(ap, s); + addLoader(s, ap); + va_end(ap); +} + int ElfLinker::getSection(const char *sname, int *slen) const { const Section *section = findSection(sname); diff --git a/src/linker.h b/src/linker.h index be53dd15..22dca7e4 100644 --- a/src/linker.h +++ b/src/linker.h @@ -83,6 +83,12 @@ public: virtual void init(const void *pdata, int plen); //virtual void setLoaderAlignOffset(int phase); virtual int addLoader(const char *sname); + void addLoader(const char *s, va_list ap); +#if 1 && (ACC_CC_GNUC >= 0x040100) + void __acc_cdecl_va addLoaderVA(const char *s, ...) __attribute__((__sentinel__)); +#else + void __acc_cdecl_va addLoaderVA(const char *s, ...); +#endif virtual Section *addSection(const char *sname, const void *sdata, int slen, unsigned p2align); virtual int getSection(const char *sname, int *slen=NULL) const; virtual int getSectionSize(const char *sname) const; diff --git a/src/packer.cpp b/src/packer.cpp index 7ca8b1e8..2b92f4a1 100644 --- a/src/packer.cpp +++ b/src/packer.cpp @@ -1082,14 +1082,8 @@ void Packer::addLoader(C a, C b, C c, C d, C e, C f, C g, C h, C i, C j) void __acc_cdecl_va Packer::addLoaderVA(const char *s, ...) { va_list ap; - const char *t = s; - va_start(ap, s); - while (t != NULL) - { - linker->addLoader(t); - t = va_arg(ap, const char *); - } + linker->addLoader(s, ap); va_end(ap); }