1
0
mirror of https://github.com/upx/upx synced 2025-09-28 19:06:07 +08:00

more *BSD arrangements

This commit is contained in:
John Reiser 2006-07-02 21:54:44 -07:00
parent ec0d3f5b5d
commit 32ce83475d
6 changed files with 81 additions and 3 deletions

View File

@ -30,6 +30,7 @@
#include "mygetopt.h"
#include "file.h"
#include "packer.h"
#include "p_elf.h"
#if 1 && defined(__DJGPP__)
@ -737,6 +738,18 @@ static int do_option(int optc, const char *arg)
case 665:
opt->o_unix.make_ptinterp = true;
break;
case 666: // Linux
opt->o_unix.osabi0 = 0; // Elf32_Ehdr::ELFOSABI_LINUX
break;
case 667: // FreeBSD
opt->o_unix.osabi0 = Elf32_Ehdr::ELFOSABI_FREEBSD;
break;
case 668: // NetBSD
opt->o_unix.osabi0 = Elf32_Ehdr::ELFOSABI_NETBSD;
break;
case 669: // OpenBSD
opt->o_unix.osabi0 = Elf32_Ehdr::ELFOSABI_OPENBSD;
break;
case 670:
opt->ps1_exe.boot_only = true;
break;
@ -864,6 +877,10 @@ static const struct mfx_option longopts[] =
{"is_ptinterp", 0, 0, 663}, // linux/elf386 PT_INTERP program
{"use_ptinterp", 0, 0, 664}, // linux/elf386 PT_INTERP program
{"make_ptinterp", 0, 0, 665}, // linux/elf386 PT_INTERP program
{"Linux", 0, 0, 666},
{"FreeBSD", 0, 0, 667},
{"NetBSD", 0, 0, 668},
{"OpenBSD", 0, 0, 669},
// watcom/le
{"le", 0, 0, 620}, // produce LE output
// win32/pe

View File

@ -146,6 +146,7 @@ struct options_t {
bool is_ptinterp; // is PT_INTERP, so don't adjust auxv_t
bool use_ptinterp; // use PT_INTERP /opt/upx/run
bool make_ptinterp; // make PT_INTERP [ignore current file!]
unsigned char osabi0; // replacement if 0==.e_ident[EI_OSABI]
enum { SCRIPT_MAX = 32 };
const char *script_name;
} o_unix;

View File

@ -72,8 +72,10 @@ struct Ehdr
};
enum { // e_ident[EI_OSABI]
ELFOSABI_NONE = 0,
ELFOSABI_NETBSD = 2,
ELFOSABI_LINUX = 3,
ELFOSABI_FREEBSD = 9,
ELFOSABI_OPENBSD = 12,
ELFOSABI_ARM = 97
};
enum { // e_type

View File

@ -50,11 +50,15 @@ int
PackLinuxElf32::checkEhdr(Elf32_Ehdr const *ehdr) const
{
const unsigned char * const buf = ehdr->e_ident;
unsigned osabi0 = buf[Elf32_Ehdr::EI_OSABI];
if (0==osabi0) {
osabi0 = opt->o_unix.osabi0;
}
if (0!=memcmp(buf, "\x7f\x45\x4c\x46", 4) // "\177ELF"
|| buf[Elf32_Ehdr::EI_CLASS]!=ei_class
|| buf[Elf32_Ehdr::EI_DATA] !=ei_data
|| buf[Elf32_Ehdr::EI_OSABI] !=ei_osabi
|| osabi0!=ei_osabi
) {
return -1;
}
@ -1874,13 +1878,39 @@ PackBSDElf32x86::PackBSDElf32x86(InputFile *f) : super(f)
e_machine = Elf32_Ehdr::EM_386;
ei_class = Elf32_Ehdr::ELFCLASS32;
ei_data = Elf32_Ehdr::ELFDATA2LSB;
ei_osabi = Elf32_Ehdr::ELFOSABI_FREEBSD;
}
PackBSDElf32x86::~PackBSDElf32x86()
{
}
PackFreeBSDElf32x86::PackFreeBSDElf32x86(InputFile *f) : super(f)
{
ei_osabi = Elf32_Ehdr::ELFOSABI_FREEBSD;
}
PackFreeBSDElf32x86::~PackFreeBSDElf32x86()
{
}
PackNetBSDElf32x86::PackNetBSDElf32x86(InputFile *f) : super(f)
{
ei_osabi = Elf32_Ehdr::ELFOSABI_NETBSD;
}
PackNetBSDElf32x86::~PackNetBSDElf32x86()
{
}
PackOpenBSDElf32x86::PackOpenBSDElf32x86(InputFile *f) : super(f)
{
ei_osabi = Elf32_Ehdr::ELFOSABI_OPENBSD;
}
PackOpenBSDElf32x86::~PackOpenBSDElf32x86()
{
}
int const *
PackLinuxElf32x86::getFilters() const
{

View File

@ -342,6 +342,30 @@ protected:
virtual int buildLoader(const Filter *);
};
class PackFreeBSDElf32x86 : public PackBSDElf32x86
{
typedef PackBSDElf32x86 super;
public:
PackFreeBSDElf32x86(InputFile *f);
virtual ~PackFreeBSDElf32x86();
};
class PackNetBSDElf32x86 : public PackBSDElf32x86
{
typedef PackBSDElf32x86 super;
public:
PackNetBSDElf32x86(InputFile *f);
virtual ~PackNetBSDElf32x86();
};
class PackOpenBSDElf32x86 : public PackBSDElf32x86
{
typedef PackBSDElf32x86 super;
public:
PackOpenBSDElf32x86(InputFile *f);
virtual ~PackOpenBSDElf32x86();
};
/*************************************************************************
// linux/elfarm
**************************************************************************/

View File

@ -213,7 +213,11 @@ static Packer* try_packers(InputFile *f, try_function func)
if ((p = func(new PackLinuxElf32x86interp(f),f)) != NULL)
return p;
}
if ((p = func(new PackBSDElf32x86(f),f)) != NULL)
if ((p = func(new PackFreeBSDElf32x86(f),f)) != NULL)
return p;
if ((p = func(new PackNetBSDElf32x86(f),f)) != NULL)
return p;
if ((p = func(new PackOpenBSDElf32x86(f),f)) != NULL)
return p;
if ((p = func(new PackLinuxElf32x86(f),f)) != NULL)
return p;