From e6c06aacff525223e755b69ec49b7baa4c6d51b2 Mon Sep 17 00:00:00 2001 From: "Markus F.X.J. Oberhumer" Date: Mon, 3 Jul 2006 13:00:53 +0200 Subject: [PATCH] New brandelf.py script. --- src/stub/Makefile | 100 +++++++++++++++++------------------ src/stub/scripts/brandbsd.pl | 49 ----------------- src/stub/scripts/brandelf.pl | 48 ----------------- src/stub/scripts/brandelf.py | 90 +++++++++++++++++++++++++++++++ 4 files changed, 140 insertions(+), 147 deletions(-) delete mode 100644 src/stub/scripts/brandbsd.pl delete mode 100644 src/stub/scripts/brandelf.pl create mode 100644 src/stub/scripts/brandelf.py diff --git a/src/stub/Makefile b/src/stub/Makefile index 66e9fc36..d151dff2 100644 --- a/src/stub/Makefile +++ b/src/stub/Makefile @@ -45,14 +45,14 @@ STUBS += arm.v4t-wince.pe.h STUBS += i086-dos16.com.h STUBS += i086-dos16.exe.h STUBS += i086-dos16.sys.h +STUBS += i386-bsd.elf-entry.h +STUBS += i386-bsd.elf-fold.h STUBS += i386-dos32.djgpp2.h STUBS += i386-dos32.djgpp2-stubify.h STUBS += i386-dos32.tmt.h STUBS += i386-dos32.watcom.le.h STUBS += i386-linux.elf-entry.h STUBS += i386-linux.elf-fold.h -STUBS += i386-bsd.elf-entry.h -STUBS += i386-bsd.elf-fold.h STUBS += i386-linux.elf.execve-entry.h STUBS += i386-linux.elf.execve-fold.h STUBS += i386-linux.elf.interp-entry.h @@ -121,8 +121,7 @@ override T = $(basename $(notdir $@)) # default settings for $(tc_list) tc.default.bin2h = python $(srcdir)/scripts/bin2h.py -tc.default.brandelf = perl -w $(srcdir)/scripts/brandelf.pl -tc.default.brandbsd = perl -w $(srcdir)/scripts/brandbsd.pl +tc.default.brandelf = python $(srcdir)/scripts/brandelf.py $(if $(tc_bfdname),--bfdname=$(tc_bfdname)) tc.default.djasm = djasm tc.default.gpp_inc = python $(srcdir)/scripts/gpp_inc.py tc.default.m-objcopy = multiarch-objcopy-2.17 $(if $(tc_bfdname),-F $(tc_bfdname)) @@ -309,6 +308,49 @@ i086-dos16.sys.h : $(srcdir)/src/$$T.asm $(call tc,bin2h) --ident=nrv2b_loader tmp/$T.bin $@ +# /*********************************************************************** +# // i386-bsd.elf +# ************************************************************************/ + +i386-bsd.elf% : tc_list = i386-bsd.elf arch-i386 default +i386-bsd.elf% : tc_bfdname = elf32-i386 + +tc.i386-bsd.elf.gcc = i386-linux-gcc-3.4.6 -m32 -march=i386 -nostdinc -MMD +tc.i386-bsd.elf.gcc += -fno-exceptions -fno-asynchronous-unwind-tables +tc.i386-bsd.elf.gcc += -Wall -W -Wcast-align -Wcast-qual -Wwrite-strings -Werror +tc.i386-bsd.elf.gcc += -march=i386 -mtune=k6 +tc.i386-bsd.elf.gcc += -Os -fno-omit-frame-pointer +tc.i386-bsd.elf.gcc += -momit-leaf-frame-pointer +tc.i386-bsd.elf.gcc += -fno-align-functions -fno-align-jumps -fno-align-labels -fno-align-loops +tc.i386-bsd.elf.gcc += -mpreferred-stack-boundary=2 +tc.i386-bsd.elf.gcc += -fweb +tc.i386-bsd.elf.ld = $(call tc,m-ld) +tc.i386-bsd.elf.objcopy = $(call tc,m-objcopy) +tc.i386-bsd.elf.objdump = $(call tc,m-objdump) +tc.i386-bsd.elf.objstrip = $(call tc,objcopy) -R .comment -R .note + +i386-bsd.elf-entry.h : $(srcdir)/src/$$T.asm + $(call tc,pp-nasm) $< -o tmp/$T.tmp1 + $(call tc,app-nasm) tmp/$T.tmp1 tmp/$T.tmp2 + $(call tc,nasm) -f bin -l tmp/$T.bin.lst tmp/$T.tmp2 -o tmp/$T.bin + $(call tc,bin2h) --ident=bsd_i386elf_loader tmp/$T.bin $@ + +i386-bsd.elf-fold.h : tmp/$$T.o tmp/i386-bsd.elf-main.o $(srcdir)/src/$$T.lds + $(call tc,ld) -T $(srcdir)/src/$T.lds -Map tmp/$T.map -o tmp/$T.bin --strip-all $(filter %.o,$^) + $(call tc,objstrip) tmp/$T.bin + $(call tc,sstrip) tmp/$T.bin + $(call tc,brandelf) --elfos=freebsd tmp/$T.bin + $(call tc,bin2h) --ident=bsd_i386elf_fold tmp/$T.bin $@ + +tmp/i386-bsd.elf-fold.o : $(srcdir)/src/$$T.asm + $(call tc,nasm) -f elf -l $@.lst $< -o $@ + $(call tc,objstrip) $@ + +tmp/i386-bsd.elf-main.o : $(srcdir)/src/$$T.c + $(call tc,gcc) -c $< -o $@ + $(call tc,objstrip) $@ + + # /*********************************************************************** # // i386-dos32.djgpp2 # ************************************************************************/ @@ -358,48 +400,6 @@ i386-dos32.watcom.le.h : $(srcdir)/src/$$T.asm $(call tc,bin2h) --ident=nrv_loader tmp/$T.bin $@ -# /*********************************************************************** -# // i386-bsd.elf -# ************************************************************************/ - -i386-bsd.elf% : tc_list = i386-bsd.elf arch-i386 default -i386-bsd.elf% : tc_bfdname = elf32-i386 - -tc.i386-bsd.elf.gcc = i386-linux-gcc-3.4.6 -m32 -march=i386 -nostdinc -MMD -tc.i386-bsd.elf.gcc += -fno-exceptions -fno-asynchronous-unwind-tables -tc.i386-bsd.elf.gcc += -Wall -W -Wcast-align -Wcast-qual -Wwrite-strings -Werror -tc.i386-bsd.elf.gcc += -march=i386 -mtune=k6 -tc.i386-bsd.elf.gcc += -Os -fno-omit-frame-pointer -tc.i386-bsd.elf.gcc += -momit-leaf-frame-pointer -tc.i386-bsd.elf.gcc += -fno-align-functions -fno-align-jumps -fno-align-labels -fno-align-loops -tc.i386-bsd.elf.gcc += -mpreferred-stack-boundary=2 -tc.i386-bsd.elf.gcc += -fweb -tc.i386-bsd.elf.ld = $(call tc,m-ld) -tc.i386-bsd.elf.objcopy = $(call tc,m-objcopy) -tc.i386-bsd.elf.objdump = $(call tc,m-objdump) -tc.i386-bsd.elf.objstrip = $(call tc,objcopy) -R .comment -R .note - -i386-bsd.elf-entry.h : $(srcdir)/src/$$T.asm - $(call tc,pp-nasm) $< -o tmp/$T.tmp1 - $(call tc,app-nasm) tmp/$T.tmp1 tmp/$T.tmp2 - $(call tc,nasm) -f bin -l tmp/$T.bin.lst tmp/$T.tmp2 -o tmp/$T.bin - $(call tc,bin2h) --ident=bsd_i386elf_loader tmp/$T.bin $@ - -i386-bsd.elf-fold.h : tmp/$$T.o tmp/i386-bsd.elf-main.o $(srcdir)/src/$$T.lds - $(call tc,ld) -T $(srcdir)/src/$T.lds -Map tmp/$T.map -o tmp/$T.bin --strip-all $(filter %.o,$^) - $(call tc,objstrip) tmp/$T.bin - $(call tc,sstrip) tmp/$T.bin - $(call tc,brandbsd) tmp/$T.bin - $(call tc,bin2h) --ident=bsd_i386elf_fold tmp/$T.bin $@ - -tmp/i386-bsd.elf-fold.o : $(srcdir)/src/$$T.asm - $(call tc,nasm) -f elf -l $@.lst $< -o $@ - $(call tc,objstrip) $@ - -tmp/i386-bsd.elf-main.o : $(srcdir)/src/$$T.c - $(call tc,gcc) -c $< -o $@ - $(call tc,objstrip) $@ - # /*********************************************************************** # // i386-linux.elf # ************************************************************************/ @@ -431,7 +431,7 @@ i386-linux.elf-fold.h : tmp/$$T.o tmp/i386-linux.elf-main.o $(srcdir)/src/$$T.ld $(call tc,ld) -T $(srcdir)/src/$T.lds -Map tmp/$T.map -o tmp/$T.bin --strip-all $(filter %.o,$^) $(call tc,objstrip) tmp/$T.bin $(call tc,sstrip) tmp/$T.bin - $(call tc,brandelf) tmp/$T.bin + $(call tc,brandelf) --elfos=linux tmp/$T.bin $(call tc,bin2h) --ident=linux_i386elf_fold tmp/$T.bin $@ tmp/i386-linux.elf-fold.o : $(srcdir)/src/$$T.asm @@ -459,7 +459,7 @@ i386-linux.elf.execve-fold.h : tmp/$$T.o tmp/i386-linux.elf.execve-main.o tmp/i3 $(call tc,ld) -T $(srcdir)/src/$T.lds -Map tmp/$T.map -o tmp/$T.bin --strip-all $(filter %.o,$^) $(call tc,objstrip) tmp/$T.bin $(call tc,sstrip) tmp/$T.bin - $(call tc,brandelf) tmp/$T.bin + $(call tc,brandelf) --elfos=linux tmp/$T.bin $(call tc,bin2h) --ident=linux_i386exec_fold tmp/$T.bin $@ tmp/i386-linux.elf.execve-fold.o : $(srcdir)/src/$$T.asm @@ -491,7 +491,7 @@ i386-linux.elf.interp-fold.h : tmp/$$T.o tmp/i386-linux.elf.interp-main.o $(srcd $(call tc,ld) -T $(srcdir)/src/$T.lds -Map tmp/$T.map -o tmp/$T.bin --strip-all $(filter %.o,$^) $(call tc,objstrip) tmp/$T.bin $(call tc,sstrip) tmp/$T.bin - $(call tc,brandelf) tmp/$T.bin + $(call tc,brandelf) --elfos=linux tmp/$T.bin $(call tc,bin2h) --ident=linux_i386pti_fold tmp/$T.bin $@ tmp/i386-linux.elf.interp-fold.o : $(srcdir)/src/$$T.asm @@ -519,7 +519,7 @@ i386-linux.elf.shell-fold.h : tmp/$$T.o tmp/i386-linux.elf.shell-main.o $(srcdir $(call tc,ld) -T $(srcdir)/src/$T.lds -Map tmp/$T.map -o tmp/$T.bin --strip-all $(filter %.o,$^) $(call tc,objstrip) tmp/$T.bin $(call tc,sstrip) tmp/$T.bin - $(call tc,brandelf) tmp/$T.bin + $(call tc,brandelf) --elfos=linux tmp/$T.bin $(call tc,bin2h) --ident=linux_i386sh_fold tmp/$T.bin $@ tmp/i386-linux.elf.shell-fold.o : $(srcdir)/src/$$T.asm diff --git a/src/stub/scripts/brandbsd.pl b/src/stub/scripts/brandbsd.pl deleted file mode 100644 index 114f3462..00000000 --- a/src/stub/scripts/brandbsd.pl +++ /dev/null @@ -1,49 +0,0 @@ -#! /usr/bin/perl -w -# -# brandBSD.pl -- brand an ELF binary as Linux or FreeBSD -# -# This file is part of the UPX executable compressor. -# -# Copyright (C) 1996-2006 Markus Franz Xaver Johannes Oberhumer -# Copyright (C) 1996-2006 Laszlo Molnar -# All Rights Reserved. -# -# UPX and the UCL library are free software; you can redistribute them -# and/or modify them under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. -# If not, write to the Free Software Foundation, Inc., -# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Markus F.X.J. Oberhumer Laszlo Molnar -# -# - - -$fname = shift || die; - -$sig = shift || "FreeBSD"; -die if length($sig) > 7; - -sysopen (FH,$fname,2) || die; -binmode FH; - -sysread (FH,$header,7) || die; -die if (substr($header, 0, 7) ne "\x7f\x45\x4c\x46\x01\x01\x01"); - -syswrite (FH,"\011\0",2) || die; -# syswrite (FH,$sig,length($sig)) || die; -# syswrite (FH,"\0\0\0\0\0\0\0\0",8-length($sig)) || die; -close (FH) || die; - -exit (0); - -# vi:ts=4:et diff --git a/src/stub/scripts/brandelf.pl b/src/stub/scripts/brandelf.pl deleted file mode 100644 index 55df1d61..00000000 --- a/src/stub/scripts/brandelf.pl +++ /dev/null @@ -1,48 +0,0 @@ -#! /usr/bin/perl -w -# -# brandelf.pl -- brand an ELF binary as Linux or FreeBSD -# -# This file is part of the UPX executable compressor. -# -# Copyright (C) 1996-2006 Markus Franz Xaver Johannes Oberhumer -# Copyright (C) 1996-2006 Laszlo Molnar -# All Rights Reserved. -# -# UPX and the UCL library are free software; you can redistribute them -# and/or modify them under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. -# If not, write to the Free Software Foundation, Inc., -# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Markus F.X.J. Oberhumer Laszlo Molnar -# -# - - -$fname = shift || die; - -$sig = shift || "Linux"; -die if length($sig) > 7; - -sysopen (FH,$fname,2) || die; -binmode FH; - -sysread (FH,$header,8) || die; -die if (substr($header, 0, 7) ne "\x7f\x45\x4c\x46\x01\x01\x01"); - -syswrite (FH,$sig,length($sig)) || die; -syswrite (FH,"\0\0\0\0\0\0\0\0",8-length($sig)) || die; -close (FH) || die; - -exit (0); - -# vi:ts=4:et diff --git a/src/stub/scripts/brandelf.py b/src/stub/scripts/brandelf.py new file mode 100644 index 00000000..8a5ccfb1 --- /dev/null +++ b/src/stub/scripts/brandelf.py @@ -0,0 +1,90 @@ +#! /usr/bin/env python +## vim:set ts=4 sw=4 et: -*- coding: utf-8 -*- +# +# brandelf.py -- +# +# This file is part of the UPX executable compressor. +# +# Copyright (C) 1996-2006 Markus Franz Xaver Johannes Oberhumer +# All Rights Reserved. +# +# UPX and the UCL library are free software; you can redistribute them +# and/or modify them under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. +# If not, write to the Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Markus F.X.J. Oberhumer Laszlo Molnar +# +# + + +import getopt, os, re, sys + + +class opts: + bfdname = None + dry_run = 0 + elfosabi = None + verbose = 0 + + + +# /*********************************************************************** +# // +# ************************************************************************/ + +def do_file(fn): + fp = open(fn, "r+b") + fp.seek(0, 0) + e_ident = fp.read(16) + fp.seek(0, 0) + if e_ident[:7] != "\x7f\x45\x4c\x46\x01\x01\x01": + raise Exception, "%s is not ELF" % fn + if opts.bfdname == "elf32-i386" and opts.elfosabi == "freebsd": + fp.seek(7, 0) + fp.write("\x09") + elif opts.bfdname == "elf32-i386" and opts.elfosabi == "linux": + fp.seek(8, 0) + fp.write("Linux\x00\x00\x00") + elif opts.bfdname == "elf32-i386" and opts.elfosabi == "linux": + fp.seek(8, 0) + fp.write("Linux\x00\x00\x00") + else: + raise Exception, ("error: invalid args", opts.__dict__) + fp.close() + + +def main(argv): + shortopts, longopts = "qv", [ + "bfdname=", "dry-run", "elfosabi=", "quiet", "verbose" + ] + xopts, args = getopt.gnu_getopt(argv[1:], shortopts, longopts) + for opt, optarg in xopts: + if 0: pass + elif opt in ["-q", "--quiet"]: opts.verbose = opts.verbose - 1 + elif opt in ["-v", "--verbose"]: opts.verbose = opts.verbose + 1 + elif opt in ["--dry-run"]: opts.dry_run = opts.dry_run + 1 + elif opt in ["--bfdname"]: opts.bfdname = optarg.lower() + elif opt in ["--elfosabi"]: opts.elfosabi = optarg.lower() + else: assert 0, ("getopt problem:", opt, optarg, xopts, args) + # process arguments + if not args: + raise Exception, "error: no arguments given" + for arg in args: + do_file(arg) + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv)) +