Show all supported formats in show_help().

This commit is contained in:
Markus F.X.J. Oberhumer
2006-11-30 23:17:22 +01:00
parent 72a18f2b3f
commit 826312cbad
6 changed files with 139 additions and 87 deletions
-1
View File
@@ -661,7 +661,6 @@ typedef ElfLinker Linker;
// main.cpp // main.cpp
extern const char *progname; extern const char *progname;
void init_options(struct options_t *o);
bool set_ec(int ec); bool set_ec(int ec);
#if (ACC_CC_GNUC || ACC_CC_LLVM || ACC_CC_PATHSCALE) #if (ACC_CC_GNUC || ACC_CC_LLVM || ACC_CC_PATHSCALE)
void e_exit(int ec) __attribute__((__noreturn__)); void e_exit(int ec) __attribute__((__noreturn__));
+74 -30
View File
@@ -28,6 +28,8 @@
#include "conf.h" #include "conf.h"
#include "compress.h" #include "compress.h"
#include "packmast.h"
#include "packer.h"
/************************************************************************* /*************************************************************************
@@ -85,6 +87,75 @@ void show_usage(void)
} }
/*************************************************************************
//
**************************************************************************/
struct PackerNames
{
struct Entry {
const char* fname;
const char* sname;
};
Entry names[32];
size_t names_count;
const options_t *o;
PackerNames() { names_count = 0; o = NULL; }
void add(Packer *p)
{
assert(names_count < 32);
names[names_count].fname = p->getFullName(o);
names[names_count].sname = p->getName();
names_count++;
}
static Packer* visit(Packer *p, void *user)
{
PackerNames *self = (PackerNames *) user;
self->add(p);
return NULL;
}
static int __acc_cdecl_qsort cmp_fname(const void *a, const void *b) {
return strcmp(((const Entry *) a)->fname, ((const Entry *) b)->fname);
}
static int __acc_cdecl_qsort cmp_sname(const void *a, const void *b) {
return strcmp(((const Entry *) a)->sname, ((const Entry *) b)->sname);
}
};
static void show_all_packers(FILE *f, int verbose)
{
options_t o; o.reset();
PackerNames pn; pn.o = &o;
PackMaster::visitAllPackers(pn.visit, NULL, &o, &pn);
qsort(pn.names, pn.names_count, sizeof(PackerNames::Entry), pn.cmp_fname);
size_t pos = 0;
for (size_t i = 0; i < pn.names_count; ++i)
{
const char *fn = pn.names[i].fname;
const char *sn = pn.names[i].sname;
if (verbose)
{
con_fprintf(f, " %-30s %s\n", fn, sn);
}
else
{
if (pos == 0) {
con_fprintf(f, " %s", fn);
pos = 2 + strlen(fn);
} else if (pos + 1 + strlen(fn) > 80) {
con_fprintf(f, "\n %s", fn);
pos = 2 + strlen(fn);
} else {
con_fprintf(f, " %s", fn);
pos += 1 + strlen(fn);
}
}
}
if (!verbose && pn.names_count)
con_fprintf(f, "\n");
}
/************************************************************************* /*************************************************************************
// //
**************************************************************************/ **************************************************************************/
@@ -245,38 +316,11 @@ void show_help(int x/*verbose*/)
fg = con_fg(f,FG_YELLOW); fg = con_fg(f,FG_YELLOW);
con_fprintf(f,"This version supports:\n"); con_fprintf(f,"This version supports:\n");
fg = con_fg(f,fg); fg = con_fg(f,fg);
con_fprintf(f," " show_all_packers(f, x);
// TODO: con_fprintf(f,"\nUPX comes with ABSOLUTELY NO WARRANTY; for details visit http://upx.sf.net\n"
// support for mach/ppc32 // "\nUPX comes with ABSOLUTELY NO WARRANTY; for details type `upx -L'.\n"
// support for linux elf/ppc32
// support for linux elf/amd64
" arm/pe,"
" atari/tos,"
" bvmlinuz/386,"
" djgpp2/coff,"
" dos/com,"
" dos/exe,"
" dos/sys,"
"\n "
//" elks/8086,"
" linux/amd64,"
" linux/i386,"
" linux/ppc32,"
" mach/ppc32,"
" ps1/exe,"
" rtm32/pe,"
"\n "
" tmt/adam,"
" vmlinux/386,"
" vmlinuz/386,"
" watcom/le,"
//" win16/ne,"
" win32/pe"
"\n\nUPX comes with ABSOLUTELY NO WARRANTY; for details visit http://upx.sf.net\n"
// "\n\nUPX comes with ABSOLUTELY NO WARRANTY; for details type `upx -L'.\n"
""); "");
#if defined(DEBUG) || defined(TESTING) #if defined(DEBUG) || defined(TESTING)
fg = con_fg(f,FG_RED); fg = con_fg(f,FG_RED);
con_fprintf(f,"\nWARNING: this version is compiled with" con_fprintf(f,"\nWARNING: this version is compiled with"
+2 -2
View File
@@ -77,8 +77,8 @@ void options_t::reset()
o->win32_pe.keep_resource = ""; o->win32_pe.keep_resource = "";
} }
static struct options_t global_options; static options_t global_options;
struct options_t *opt = &global_options; options_t *opt = &global_options;
static int done_output_name = 0; static int done_output_name = 0;
static int done_script_name = 0; static int done_script_name = 0;
+3 -1
View File
@@ -45,7 +45,8 @@ Packer::Packer(InputFile *f) :
uip(NULL), linker(NULL), uip(NULL), linker(NULL),
last_patch(NULL), last_patch_len(0), last_patch_off(0) last_patch(NULL), last_patch_len(0), last_patch_off(0)
{ {
file_size = f->st.st_size; if (fi != NULL)
file_size = fi->st.st_size;
uip = new UiPacker(this); uip = new UiPacker(this);
memset(&ph, 0, sizeof(ph)); memset(&ph, 0, sizeof(ph));
} }
@@ -66,6 +67,7 @@ void Packer::assertPacker()
assert(getVersion() >= 11); assert(getVersion() >= 11);
assert(getVersion() <= 14); assert(getVersion() <= 14);
assert(strlen(getName()) <= 13); assert(strlen(getName()) <= 13);
assert(strlen(getFullName(opt)) <= 26); // "i386-linux.kernel.bvmlinuz"
if (bele == NULL) fprintf(stderr, "%s\n", getName()); if (bele == NULL) fprintf(stderr, "%s\n", getName());
assert(bele != NULL); assert(bele != NULL);
#if 1 #if 1
+51 -50
View File
@@ -61,7 +61,7 @@
// //
**************************************************************************/ **************************************************************************/
PackMaster::PackMaster(InputFile *f, struct options_t *o) : PackMaster::PackMaster(InputFile *f, options_t *o) :
fi(f), p(NULL) fi(f), p(NULL)
{ {
// replace options with local options // replace options with local options
@@ -90,12 +90,11 @@ PackMaster::~PackMaster()
// //
**************************************************************************/ **************************************************************************/
typedef Packer* (*try_function)(Packer *p, InputFile *f); static Packer* try_pack(Packer *p, void *user)
static Packer* try_pack(Packer *p, InputFile *f)
{ {
if (p == NULL) if (p == NULL)
return NULL; return NULL;
InputFile *f = (InputFile *) user;
p->assertPacker(); p->assertPacker();
try { try {
p->initPackHeader(); p->initPackHeader();
@@ -117,10 +116,11 @@ static Packer* try_pack(Packer *p, InputFile *f)
} }
static Packer* try_unpack(Packer *p, InputFile *f) static Packer* try_unpack(Packer *p, void *user)
{ {
if (p == NULL) if (p == NULL)
return NULL; return NULL;
InputFile *f = (InputFile *) user;
p->assertPacker(); p->assertPacker();
try { try {
p->initPackHeader(); p->initPackHeader();
@@ -150,7 +150,7 @@ static Packer* try_unpack(Packer *p, InputFile *f)
// //
**************************************************************************/ **************************************************************************/
static Packer* try_packers(InputFile *f, try_function func) Packer* PackMaster::visitAllPackers(visit_func_t func, InputFile *f, const options_t *o, void *user)
{ {
Packer *p = NULL; Packer *p = NULL;
@@ -159,124 +159,128 @@ static Packer* try_packers(InputFile *f, try_function func)
// //
// .exe // .exe
// //
if (!opt->dos_exe.force_stub) if (!o->dos_exe.force_stub)
{ {
if ((p = func(new PackDjgpp2(f),f)) != NULL) if ((p = func(new PackDjgpp2(f), user)) != NULL)
return p; return p;
if ((p = func(new PackTmt(f),f)) != NULL) if ((p = func(new PackTmt(f), user)) != NULL)
return p; return p;
if ((p = func(new PackWcle(f),f)) != NULL) if ((p = func(new PackWcle(f), user)) != NULL)
return p; return p;
#if 0 #if 0
if ((p = func(new PackVxd(f),f)) != NULL) if ((p = func(new PackVxd(f), user)) != NULL)
return p; return p;
#endif #endif
if ((p = func(new PackW16Ne(f),f)) != NULL) #if 0
if ((p = func(new PackW16Ne(f), user)) != NULL)
return p; return p;
if ((p = func(new PackArmPe(f),f)) != NULL) #endif
return p; if ((p = func(new PackW32Pe(f), user)) != NULL)
if ((p = func(new PackW32Pe(f),f)) != NULL)
return p; return p;
} }
if ((p = func(new PackExe(f),f)) != NULL) if ((p = func(new PackArmPe(f), user)) != NULL)
return p;
if ((p = func(new PackExe(f), user)) != NULL)
return p; return p;
// //
// atari // atari
// //
if ((p = func(new PackTos(f),f)) != NULL) if ((p = func(new PackTos(f), user)) != NULL)
return p; return p;
// //
// linux kernel // linux kernel
// //
if ((p = func(new PackVmlinuxI386(f),f)) != NULL) if ((p = func(new PackVmlinuxI386(f), user)) != NULL)
return p; return p;
if ((p = func(new PackVmlinuzI386(f),f)) != NULL) if ((p = func(new PackVmlinuzI386(f), user)) != NULL)
return p; return p;
if ((p = func(new PackBvmlinuzI386(f),f)) != NULL) if ((p = func(new PackBvmlinuzI386(f), user)) != NULL)
return p; return p;
#if 0 #if 0
if ((p = func(new PackElks8086(f),f)) != NULL) if ((p = func(new PackElks8086(f), user)) != NULL)
return p; return p;
#endif #endif
// //
// linux // linux
// //
if (!opt->o_unix.force_execve) if (!o->o_unix.force_execve)
{ {
#if 0 #if 0
if (opt->unix.script_name) if (o->unix.script_name)
{ {
if ((p = func(new PackLinuxI386sep(f),f)) != NULL) if ((p = func(new PackLinuxI386sep(f), user)) != NULL)
return p; return p;
} }
#endif #endif
if (opt->o_unix.use_ptinterp) { if (o->o_unix.use_ptinterp) {
if ((p = func(new PackLinuxElf32x86interp(f),f)) != NULL) if ((p = func(new PackLinuxElf32x86interp(f), user)) != NULL)
return p; return p;
} }
if ((p = func(new PackFreeBSDElf32x86(f),f)) != NULL) if ((p = func(new PackFreeBSDElf32x86(f), user)) != NULL)
return p; return p;
if ((p = func(new PackNetBSDElf32x86(f),f)) != NULL) if ((p = func(new PackNetBSDElf32x86(f), user)) != NULL)
return p; return p;
if ((p = func(new PackOpenBSDElf32x86(f),f)) != NULL) if ((p = func(new PackOpenBSDElf32x86(f), user)) != NULL)
return p; return p;
if ((p = func(new PackLinuxElf32x86(f),f)) != NULL) if ((p = func(new PackLinuxElf32x86(f), user)) != NULL)
return p; return p;
if ((p = func(new PackLinuxElf64amd(f),f)) != NULL) if ((p = func(new PackLinuxElf64amd(f), user)) != NULL)
return p; return p;
if ((p = func(new PackLinuxElf32armLe(f),f)) != NULL) if ((p = func(new PackLinuxElf32armLe(f), user)) != NULL)
return p; return p;
if ((p = func(new PackLinuxElf32armBe(f),f)) != NULL) if ((p = func(new PackLinuxElf32armBe(f), user)) != NULL)
return p; return p;
if ((p = func(new PackLinuxElf32ppc(f),f)) != NULL) if ((p = func(new PackLinuxElf32ppc(f), user)) != NULL)
return p; return p;
if ((p = func(new PackLinuxI386sh(f),f)) != NULL) if ((p = func(new PackLinuxI386sh(f), user)) != NULL)
return p; return p;
} }
if ((p = func(new PackBSDI386(f),f)) != NULL) if ((p = func(new PackBSDI386(f), user)) != NULL)
return p; return p;
if ((p = func(new PackLinuxI386(f),f)) != NULL) if ((p = func(new PackLinuxI386(f), user)) != NULL)
return p; return p;
// //
// psone // psone
// //
if ((p = func(new PackPs1(f),f)) != NULL) if ((p = func(new PackPs1(f), user)) != NULL)
return p; return p;
// //
// .sys and .com // .sys and .com
// //
if ((p = func(new PackSys(f),f)) != NULL) if ((p = func(new PackSys(f), user)) != NULL)
return p; return p;
if ((p = func(new PackCom(f),f)) != NULL) if ((p = func(new PackCom(f), user)) != NULL)
return p; return p;
// Mach (MacOS X PowerPC) // Mach (MacOS X PowerPC)
if ((p = func(new PackMachPPC32(f), f)) != NULL) if ((p = func(new PackMachPPC32(f), user)) != NULL)
return p; return p;
return NULL; return NULL;
} }
static Packer *getPacker(InputFile *f) Packer *PackMaster::getPacker(InputFile *f)
{ {
Packer *p = try_packers(f, try_pack); Packer *p = visitAllPackers(try_pack, f, opt, f);
if (!p) if (!p)
throwUnknownExecutableFormat(); throwUnknownExecutableFormat();
p->assertPacker();
return p; return p;
} }
static Packer *getUnpacker(InputFile *f) Packer *PackMaster::getUnpacker(InputFile *f)
{ {
Packer *p = try_packers(f, try_unpack); Packer *p = visitAllPackers(try_unpack, f, opt, f);
if (!p) if (!p)
throwNotPacked(); throwNotPacked();
p->assertPacker();
return p; return p;
} }
@@ -288,7 +292,6 @@ static Packer *getUnpacker(InputFile *f)
void PackMaster::pack(OutputFile *fo) void PackMaster::pack(OutputFile *fo)
{ {
p = getPacker(fi); p = getPacker(fi);
p->assertPacker();
fi = NULL; fi = NULL;
p->doPack(fo); p->doPack(fo);
} }
@@ -306,7 +309,6 @@ void PackMaster::unpack(OutputFile *fo)
void PackMaster::test() void PackMaster::test()
{ {
p = getUnpacker(fi); p = getUnpacker(fi);
p->assertPacker();
fi = NULL; fi = NULL;
p->doTest(); p->doTest();
} }
@@ -315,7 +317,6 @@ void PackMaster::test()
void PackMaster::list() void PackMaster::list()
{ {
p = getUnpacker(fi); p = getUnpacker(fi);
p->assertPacker();
fi = NULL; fi = NULL;
p->doList(); p->doList();
} }
@@ -323,9 +324,9 @@ void PackMaster::list()
void PackMaster::fileInfo() void PackMaster::fileInfo()
{ {
p = try_packers(fi, try_unpack); p = visitAllPackers(try_unpack, fi, opt, fi);
if (!p) if (!p)
p = try_packers(fi, try_pack); p = visitAllPackers(try_pack, fi, opt, fi);
if (!p) if (!p)
throwUnknownExecutableFormat(NULL, 1); // make a warning here throwUnknownExecutableFormat(NULL, 1); // make a warning here
p->assertPacker(); p->assertPacker();
+9 -3
View File
@@ -41,7 +41,7 @@ class OutputFile;
class PackMaster class PackMaster
{ {
public: public:
PackMaster(InputFile *f, struct options_t *o = NULL); PackMaster(InputFile *f, options_t *o = NULL);
virtual ~PackMaster(); virtual ~PackMaster();
void pack(OutputFile *fo); void pack(OutputFile *fo);
@@ -50,13 +50,19 @@ public:
void list(); void list();
void fileInfo(); void fileInfo();
typedef Packer* (*visit_func_t)(Packer *p, void *user);
static Packer* visitAllPackers(visit_func_t, InputFile *f, const options_t *, void *user);
private: private:
InputFile *fi; InputFile *fi;
Packer *p; Packer *p;
static Packer *getPacker(InputFile *f);
static Packer *getUnpacker(InputFile *f);
// setup local options for each file // setup local options for each file
struct options_t local_options; options_t local_options;
struct options_t *saved_opt; options_t *saved_opt;
}; };