summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Kleine-Budde <mkl@pengutronix.de>2010-03-11 02:18:54 +0100
committerMarc Kleine-Budde <mkl@pengutronix.de>2010-03-11 12:04:48 +0100
commit9be918afe2d55843cbf14eccd7d58071dbdfbcfe (patch)
tree06886160cd2dd1be57b01b895bbed36df840c49d
parent00b53abd55c0bc1040dd66e028178e1ae58f4987 (diff)
downloadptxdist-9be918afe2d55843cbf14eccd7d58071dbdfbcfe.tar.gz
ptxdist-9be918afe2d55843cbf14eccd7d58071dbdfbcfe.tar.xz
[host-elfkickers] new package
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
-rw-r--r--patches/elfkickers-2.0a.orig/0001-01_add_toplevel_makefile.diff.patch26
-rw-r--r--patches/elfkickers-2.0a.orig/0002-02_update_subdirs_makefile.diff.patch82
-rw-r--r--patches/elfkickers-2.0a.orig/0003-03_add_include_string.h.diff.patch50
-rw-r--r--patches/elfkickers-2.0a.orig/0004-04_bsd_include_elf.h.diff.patch249
-rw-r--r--patches/elfkickers-2.0a.orig/0005-05_add_et_core_elfls.diff.patch24
-rw-r--r--patches/elfkickers-2.0a.orig/0006-mjn3-sstrip.patch729
-rw-r--r--patches/elfkickers-2.0a.orig/series6
-rw-r--r--rules/host-elfkickers.in6
-rw-r--r--rules/host-elfkickers.make51
9 files changed, 1223 insertions, 0 deletions
diff --git a/patches/elfkickers-2.0a.orig/0001-01_add_toplevel_makefile.diff.patch b/patches/elfkickers-2.0a.orig/0001-01_add_toplevel_makefile.diff.patch
new file mode 100644
index 000000000..c8edff780
--- /dev/null
+++ b/patches/elfkickers-2.0a.orig/0001-01_add_toplevel_makefile.diff.patch
@@ -0,0 +1,26 @@
+From 0390735daaefeda85dd1f0bcfdcb6dbcd1910aec Mon Sep 17 00:00:00 2001
+From: the debian project <info@debian.org>
+Date: Thu, 11 Mar 2010 01:11:11 +0100
+Subject: [PATCH 1/6] 01_add_toplevel_makefile.diff
+
+---
+ Makefile | 7 +++++++
+ 1 files changed, 7 insertions(+), 0 deletions(-)
+ create mode 100644 Makefile
+
+diff --git a/Makefile b/Makefile
+new file mode 100644
+index 0000000..2a93406
+--- /dev/null
++++ b/Makefile
+@@ -0,0 +1,7 @@
++SUBDIRS = elfls elftoc rebind sstrip
++
++all:
++ set -e; for d in $(SUBDIRS); do cd $$d ; CFLAGS="$(CFLAGS)" CC=$(CC) $(MAKE) ; cd - ; done
++
++clean:
++ set -e; for d in $(SUBDIRS); do cd $$d ; $(MAKE) clean; cd - ; done
+--
+1.7.0
+
diff --git a/patches/elfkickers-2.0a.orig/0002-02_update_subdirs_makefile.diff.patch b/patches/elfkickers-2.0a.orig/0002-02_update_subdirs_makefile.diff.patch
new file mode 100644
index 000000000..0887631db
--- /dev/null
+++ b/patches/elfkickers-2.0a.orig/0002-02_update_subdirs_makefile.diff.patch
@@ -0,0 +1,82 @@
+From a3b73432021d9e0a2a987bdc73c1d5c71966d038 Mon Sep 17 00:00:00 2001
+From: the debian project <info@debian.org>
+Date: Thu, 11 Mar 2010 01:11:12 +0100
+Subject: [PATCH 2/6] 02_update_subdirs_makefile.diff
+
+---
+ ebfc/Makefile | 3 ---
+ elfls/Makefile | 2 +-
+ elftoc/Makefile | 4 ----
+ rebind/Makefile | 2 +-
+ sstrip/Makefile | 2 +-
+ 5 files changed, 3 insertions(+), 10 deletions(-)
+
+diff --git a/ebfc/Makefile b/ebfc/Makefile
+index 6ca1dc2..b0b75a8 100644
+--- a/ebfc/Makefile
++++ b/ebfc/Makefile
+@@ -1,8 +1,5 @@
+ # Makefile for ebfc
+
+-CC = gcc
+-CFLAGS = -ggdb -Wall
+-
+ ebfc: ebfc.o brainfuck.o libelfparts.a
+
+ ebfc.o: ebfc.c elfparts.h ebfc.h
+diff --git a/elfls/Makefile b/elfls/Makefile
+index 0009fdc..e199af1 100644
+--- a/elfls/Makefile
++++ b/elfls/Makefile
+@@ -1,7 +1,7 @@
+ # Makefile for elfls
+
+ elfls: elfls.c
+- gcc -ggdb -Wall -W -o elfls elfls.c
++ $(CC) $(CFLAGS) -W -o elfls elfls.c
+
+ clean:
+ rm -f elfls
+diff --git a/elftoc/Makefile b/elftoc/Makefile
+index 1aaa61b..7681169 100644
+--- a/elftoc/Makefile
++++ b/elftoc/Makefile
+@@ -1,9 +1,5 @@
+ # Makefile for elftoc
+
+-CC = gcc
+-CFLAGS = -ggdb -Wall
+-LDFLAGS = $(CFLAGS)
+-
+ OBJS = pieces.o addr.o shdrtab.o dynamic.o outbasic.o outtools.o out.o elftoc.o
+
+ elftoc: $(OBJS)
+diff --git a/rebind/Makefile b/rebind/Makefile
+index 6448da7..231a569 100644
+--- a/rebind/Makefile
++++ b/rebind/Makefile
+@@ -1,7 +1,7 @@
+ # Makefile for rebind
+
+ rebind: rebind.c
+- gcc -ggdb -Wall -W -o rebind rebind.c
++ $(CC) $(CFLAGS) -W -o rebind rebind.c
+
+ clean:
+ rm -f rebind
+diff --git a/sstrip/Makefile b/sstrip/Makefile
+index dad4c92..1f05c3d 100644
+--- a/sstrip/Makefile
++++ b/sstrip/Makefile
+@@ -1,7 +1,7 @@
+ # Makefile for sstrip
+
+ sstrip: sstrip.c
+- gcc -ggdb -Wall -W -o sstrip sstrip.c
++ $(CC) $(CFLAGS) -W -o sstrip sstrip.c
+
+ clean:
+ rm -f sstrip
+--
+1.7.0
+
diff --git a/patches/elfkickers-2.0a.orig/0003-03_add_include_string.h.diff.patch b/patches/elfkickers-2.0a.orig/0003-03_add_include_string.h.diff.patch
new file mode 100644
index 000000000..1676f879f
--- /dev/null
+++ b/patches/elfkickers-2.0a.orig/0003-03_add_include_string.h.diff.patch
@@ -0,0 +1,50 @@
+From e0756d649ded0b9807c3df263519e3841e493244 Mon Sep 17 00:00:00 2001
+From: the debian project <info@debian.org>
+Date: Thu, 11 Mar 2010 01:11:12 +0100
+Subject: [PATCH 3/6] 03_add_include_string.h.diff
+
+---
+ ebfc/rel.c | 1 +
+ elfls/elfls.c | 1 +
+ elftoc/shdrtab.c | 1 +
+ 3 files changed, 3 insertions(+), 0 deletions(-)
+
+diff --git a/ebfc/rel.c b/ebfc/rel.c
+index 9c76d03..1c53d47 100644
+--- a/ebfc/rel.c
++++ b/ebfc/rel.c
+@@ -5,6 +5,7 @@
+ */
+
+ #include <stdlib.h>
++#include <string.h>
+ #include <linux/elf.h>
+ #include "elfparts.h"
+ #include "gen.h"
+diff --git a/elfls/elfls.c b/elfls/elfls.c
+index 5ccc944..feb5b27 100644
+--- a/elfls/elfls.c
++++ b/elfls/elfls.c
+@@ -4,6 +4,7 @@
+
+ #include <stdio.h>
+ #include <stdlib.h>
++#include <string.h>
+ #include <errno.h>
+ #include <stdarg.h>
+ #include <unistd.h>
+diff --git a/elftoc/shdrtab.c b/elftoc/shdrtab.c
+index 729a05c..48e1459 100644
+--- a/elftoc/shdrtab.c
++++ b/elftoc/shdrtab.c
+@@ -5,6 +5,7 @@
+ */
+
+ #include <stdlib.h>
++#include <string.h>
+ #include <ctype.h>
+ #include "gen.h"
+ #include "elf.h"
+--
+1.7.0
+
diff --git a/patches/elfkickers-2.0a.orig/0004-04_bsd_include_elf.h.diff.patch b/patches/elfkickers-2.0a.orig/0004-04_bsd_include_elf.h.diff.patch
new file mode 100644
index 000000000..69c465834
--- /dev/null
+++ b/patches/elfkickers-2.0a.orig/0004-04_bsd_include_elf.h.diff.patch
@@ -0,0 +1,249 @@
+From 34e5fd9f9893c1155b72b0358fb744abffa0f093 Mon Sep 17 00:00:00 2001
+From: the debian project <info@debian.org>
+Date: Thu, 11 Mar 2010 01:11:13 +0100
+Subject: [PATCH 4/6] 04_bsd_include_elf.h.diff
+
+---
+ ebfc/brainfuck.c | 4 ++++
+ ebfc/dynamic.c | 4 ++++
+ ebfc/ebfc.c | 4 ++++
+ ebfc/ehdr.c | 4 ++++
+ ebfc/elfparts.c | 4 ++++
+ ebfc/got.c | 4 ++++
+ ebfc/hash.c | 4 ++++
+ ebfc/phdrtab.c | 4 ++++
+ ebfc/progbits.c | 4 ++++
+ ebfc/rel.c | 4 ++++
+ ebfc/shdrtab.c | 4 ++++
+ ebfc/strtab.c | 4 ++++
+ ebfc/symtab.c | 4 ++++
+ rebind/rebind.c | 4 ++++
+ 14 files changed, 56 insertions(+), 0 deletions(-)
+
+diff --git a/ebfc/brainfuck.c b/ebfc/brainfuck.c
+index 0d87e21..ccfb755 100644
+--- a/ebfc/brainfuck.c
++++ b/ebfc/brainfuck.c
+@@ -8,7 +8,11 @@
+ #include <stdlib.h>
+ #include <string.h>
+ #include <stddef.h>
++#ifdef __linux__
+ #include <linux/elf.h>
++#else
++#include <elf.h>
++#endif
+ #include "elfparts.h"
+ #include "ebfc.h"
+
+diff --git a/ebfc/dynamic.c b/ebfc/dynamic.c
+index a92b447..b867716 100644
+--- a/ebfc/dynamic.c
++++ b/ebfc/dynamic.c
+@@ -5,7 +5,11 @@
+ */
+
+ #include <stdlib.h>
++#ifdef __linux__
+ #include <linux/elf.h>
++#else
++#include <elf.h>
++#endif
+ #include "elfparts.h"
+ #include "gen.h"
+
+diff --git a/ebfc/ebfc.c b/ebfc/ebfc.c
+index 1e971ce..b94270b 100644
+--- a/ebfc/ebfc.c
++++ b/ebfc/ebfc.c
+@@ -14,7 +14,11 @@
+ #include <fcntl.h>
+ #include <sys/stat.h>
+ #include <getopt.h>
++#ifdef __linux__
+ #include <linux/elf.h>
++#else
++#include <elf.h>
++#endif
+ #include "elfparts.h"
+ #include "ebfc.h"
+
+diff --git a/ebfc/ehdr.c b/ebfc/ehdr.c
+index f8048f9..7d84b3e 100644
+--- a/ebfc/ehdr.c
++++ b/ebfc/ehdr.c
+@@ -5,7 +5,11 @@
+ */
+
+ #include <stdlib.h>
++#ifdef __linux__
+ #include <linux/elf.h>
++#else
++#include <elf.h>
++#endif
+ #include "elfparts.h"
+ #include "gen.h"
+
+diff --git a/ebfc/elfparts.c b/ebfc/elfparts.c
+index bac38b9..312b60e 100644
+--- a/ebfc/elfparts.c
++++ b/ebfc/elfparts.c
+@@ -7,7 +7,11 @@
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <errno.h>
++#ifdef __linux__
+ #include <linux/elf.h>
++#else
++#include <elf.h>
++#endif
+ #include "elfparts.h"
+ #include "gen.h"
+
+diff --git a/ebfc/got.c b/ebfc/got.c
+index f1e9986..3f584d1 100644
+--- a/ebfc/got.c
++++ b/ebfc/got.c
+@@ -5,7 +5,11 @@
+ */
+
+ #include <stdlib.h>
++#ifdef __linux__
+ #include <linux/elf.h>
++#else
++#include <elf.h>
++#endif
+ #include "elfparts.h"
+ #include "gen.h"
+
+diff --git a/ebfc/hash.c b/ebfc/hash.c
+index 1ee53fc..f359a2f 100644
+--- a/ebfc/hash.c
++++ b/ebfc/hash.c
+@@ -6,7 +6,11 @@
+
+ #include <stdlib.h>
+ #include <string.h>
++#ifdef __linux__
+ #include <linux/elf.h>
++#else
++#include <elf.h>
++#endif
+ #include "elfparts.h"
+ #include "gen.h"
+
+diff --git a/ebfc/phdrtab.c b/ebfc/phdrtab.c
+index d562d23..f4545ca 100644
+--- a/ebfc/phdrtab.c
++++ b/ebfc/phdrtab.c
+@@ -5,7 +5,11 @@
+ */
+
+ #include <stdlib.h>
++#ifdef __linux__
+ #include <linux/elf.h>
++#else
++#include <elf.h>
++#endif
+ #include "elfparts.h"
+ #include "gen.h"
+
+diff --git a/ebfc/progbits.c b/ebfc/progbits.c
+index 17a7533..8d7f93f 100644
+--- a/ebfc/progbits.c
++++ b/ebfc/progbits.c
+@@ -5,7 +5,11 @@
+ */
+
+ #include <stdlib.h>
++#ifdef __linux__
+ #include <linux/elf.h>
++#else
++#include <elf.h>
++#endif
+ #include "elfparts.h"
+ #include "gen.h"
+
+diff --git a/ebfc/rel.c b/ebfc/rel.c
+index 1c53d47..581de78 100644
+--- a/ebfc/rel.c
++++ b/ebfc/rel.c
+@@ -6,7 +6,11 @@
+
+ #include <stdlib.h>
+ #include <string.h>
++#ifdef __linux__
+ #include <linux/elf.h>
++#else
++#include <elf.h>
++#endif
+ #include "elfparts.h"
+ #include "gen.h"
+
+diff --git a/ebfc/shdrtab.c b/ebfc/shdrtab.c
+index 2ae0318..8a38c9c 100644
+--- a/ebfc/shdrtab.c
++++ b/ebfc/shdrtab.c
+@@ -5,7 +5,11 @@
+ */
+
+ #include <stdlib.h>
++#ifdef __linux__
+ #include <linux/elf.h>
++#else
++#include <elf.h>
++#endif
+ #include "elfparts.h"
+ #include "gen.h"
+
+diff --git a/ebfc/strtab.c b/ebfc/strtab.c
+index 02c91c3..cfa11dc 100644
+--- a/ebfc/strtab.c
++++ b/ebfc/strtab.c
+@@ -5,7 +5,11 @@
+ */
+
+ #include <stdlib.h>
++#ifdef __linux__
+ #include <linux/elf.h>
++#else
++#include <elf.h>
++#endif
+ #include <string.h>
+ #include "elfparts.h"
+ #include "gen.h"
+diff --git a/ebfc/symtab.c b/ebfc/symtab.c
+index 93dad34..d721f4f 100644
+--- a/ebfc/symtab.c
++++ b/ebfc/symtab.c
+@@ -6,7 +6,11 @@
+
+ #include <stdlib.h>
+ #include <string.h>
++#ifdef __linux__
+ #include <linux/elf.h>
++#else
++#include <elf.h>
++#endif
+ #include "elfparts.h"
+ #include "gen.h"
+
+diff --git a/rebind/rebind.c b/rebind/rebind.c
+index 5608cae..f740c47 100644
+--- a/rebind/rebind.c
++++ b/rebind/rebind.c
+@@ -7,7 +7,11 @@
+ #include <string.h>
+ #include <errno.h>
+ #include <unistd.h>
++#ifdef __linux__
+ #include <linux/elf.h>
++#else
++#include <elf.h>
++#endif
+
+ #ifndef TRUE
+ #define TRUE 1
+--
+1.7.0
+
diff --git a/patches/elfkickers-2.0a.orig/0005-05_add_et_core_elfls.diff.patch b/patches/elfkickers-2.0a.orig/0005-05_add_et_core_elfls.diff.patch
new file mode 100644
index 000000000..8f36ff8f5
--- /dev/null
+++ b/patches/elfkickers-2.0a.orig/0005-05_add_et_core_elfls.diff.patch
@@ -0,0 +1,24 @@
+From 50913d16ecb261ad4bbecaa7fa3c310ccb6ebbd3 Mon Sep 17 00:00:00 2001
+From: the debian project <info@debian.org>
+Date: Thu, 11 Mar 2010 01:11:14 +0100
+Subject: [PATCH 5/6] 05_add_et_core_elfls.diff
+
+---
+ elfls/elfls.c | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+diff --git a/elfls/elfls.c b/elfls/elfls.c
+index feb5b27..04410d2 100644
+--- a/elfls/elfls.c
++++ b/elfls/elfls.c
+@@ -317,6 +317,7 @@ static int readelfhdr(void)
+ return FALSE;
+ switch (elffhdr.e_type) {
+ case ET_REL:
++ case ET_CORE:
+ case ET_EXEC:
+ case ET_DYN:
+ return TRUE;
+--
+1.7.0
+
diff --git a/patches/elfkickers-2.0a.orig/0006-mjn3-sstrip.patch b/patches/elfkickers-2.0a.orig/0006-mjn3-sstrip.patch
new file mode 100644
index 000000000..4b5dafdf6
--- /dev/null
+++ b/patches/elfkickers-2.0a.orig/0006-mjn3-sstrip.patch
@@ -0,0 +1,729 @@
+From 8566366ba5248eaf7e5e3e2c1933d2a80465a8f9 Mon Sep 17 00:00:00 2001
+From: Manuel Novoa III <mjn3@codepoet.org>
+Date: Thu, 11 Mar 2010 01:19:07 +0100
+Subject: [PATCH 6/6] mjn3-sstrip
+
+===================================================================
+---
+ sstrip/sstrip.c | 649 ++++++++++++++++++++++++++++++++++---------------------
+ 1 files changed, 404 insertions(+), 245 deletions(-)
+
+diff --git a/sstrip/sstrip.c b/sstrip/sstrip.c
+index d0997b9..1842f05 100644
+--- a/sstrip/sstrip.c
++++ b/sstrip/sstrip.c
+@@ -1,5 +1,55 @@
++/* http://www.muppetlabs.com/~breadbox/software/elfkickers.html */
++
+ /* sstrip: Copyright (C) 1999-2001 by Brian Raiter, under the GNU
+ * General Public License. No warranty. See COPYING for details.
++ *
++ * Aug 23, 2004 Hacked by Manuel Novoa III <mjn3@codepoet.org> to
++ * handle targets of different endianness and/or elf class, making
++ * it more useful in a cross-devel environment.
++ */
++
++/* ============== original README ===================
++ *
++ * sstrip is a small utility that removes the contents at the end of an
++ * ELF file that are not part of the program's memory image.
++ *
++ * Most ELF executables are built with both a program header table and a
++ * section header table. However, only the former is required in order
++ * for the OS to load, link and execute a program. sstrip attempts to
++ * extract the ELF header, the program header table, and its contents,
++ * leaving everything else in the bit bucket. It can only remove parts of
++ * the file that occur at the end, after the parts to be saved. However,
++ * this almost always includes the section header table, and occasionally
++ * a few random sections that are not used when running a program.
++ *
++ * It should be noted that the GNU bfd library is (understandably)
++ * dependent on the section header table as an index to the file's
++ * contents. Thus, an executable file that has no section header table
++ * cannot be used with gdb, objdump, or any other program based upon the
++ * bfd library, at all. In fact, the program will not even recognize the
++ * file as a valid executable. (This limitation is noted in the source
++ * code comments for bfd, and is marked "FIXME", so this may change at
++ * some future date. However, I would imagine that it is a pretty
++ * low-priority item, as executables without a section header table are
++ * rare in the extreme.) This probably also explains why strip doesn't
++ * offer the option to do this.
++ *
++ * Shared library files may also have their section header table removed.
++ * Such a library will still function; however, it will no longer be
++ * possible for a compiler to link a new program against it.
++ *
++ * As an added bonus, sstrip also tries to removes trailing zero bytes
++ * from the end of the file. (This normally cannot be done with an
++ * executable that has a section header table.)
++ *
++ * sstrip is a very simplistic program. It depends upon the common
++ * practice of putting the parts of the file that contribute to the
++ * memory image at the front, and the remaining material at the end. This
++ * permits it to discard the latter material without affecting file
++ * offsets and memory addresses in what remains. Of course, the ELF
++ * standard permits files to be organized in almost any order, so if a
++ * pathological linker decided to put its section headers at the top,
++ * sstrip would be useless on such executables.
+ */
+
+ #include <stdio.h>
+@@ -9,28 +59,21 @@
+ #include <unistd.h>
+ #include <fcntl.h>
+ #include <elf.h>
+-#include <asm/elf.h>
++#include <endian.h>
++#include <byteswap.h>
+
+ #ifndef TRUE
+ #define TRUE 1
+ #define FALSE 0
+ #endif
+
+-#if ELF_CLASS == ELFCLASS32
+-#define Elf_Ehdr Elf32_Ehdr
+-#define Elf_Phdr Elf32_Phdr
+-#else
+-#define Elf_Ehdr Elf64_Ehdr
+-#define Elf_Phdr Elf64_Phdr
+-#endif
+-
+ /* The name of the program.
+ */
+-static char const *progname;
++static char const *progname;
+
+ /* The name of the current file.
+ */
+-static char const *filename;
++static char const *filename;
+
+
+ /* A simple error-handling function. FALSE is always returned for the
+@@ -38,227 +81,321 @@ static char const *filename;
+ */
+ static int err(char const *errmsg)
+ {
+- fprintf(stderr, "%s: %s: %s\n", progname, filename, errmsg);
+- return FALSE;
++ fprintf(stderr, "%s: %s: %s\n", progname, filename, errmsg);
++ return FALSE;
+ }
+
+-/* A macro for I/O errors: The given error message is used only when
+- * errno is not set.
++/* A flag to signal the need for endian reversal.
+ */
+-#define ferr(msg) (err(errno ? strerror(errno) : (msg)))
++static int do_reverse_endian;
+
+-/* readelfheader() reads the ELF header into our global variable, and
+- * checks to make sure that this is in fact a file that we should be
+- * munging.
++/* Get a value from the elf header, compensating for endianness.
+ */
+-static int readelfheader(int fd, Elf_Ehdr *ehdr)
+-{
+- errno = 0;
+- if (read(fd, ehdr, sizeof *ehdr) != sizeof *ehdr)
+- return ferr("missing or incomplete ELF header.");
+-
+- /* Check the ELF signature.
+- */
+- if (!(ehdr->e_ident[EI_MAG0] == ELFMAG0 &&
+- ehdr->e_ident[EI_MAG1] == ELFMAG1 &&
+- ehdr->e_ident[EI_MAG2] == ELFMAG2 &&
+- ehdr->e_ident[EI_MAG3] == ELFMAG3))
+- return err("missing ELF signature.");
+-
+- /* Compare the file's class and endianness with the program's.
+- */
+- if (ehdr->e_ident[EI_DATA] != ELF_DATA)
+- return err("ELF file has different endianness.");
+- if (ehdr->e_ident[EI_CLASS] != ELF_CLASS)
+- return err("ELF file has different word size.");
+-
+- /* Check the target architecture.
+- */
+- if (ehdr->e_machine != ELF_ARCH)
+- return err("ELF file created for different architecture.");
+-
+- /* Verify the sizes of the ELF header and the program segment
+- * header table entries.
+- */
+- if (ehdr->e_ehsize != sizeof(Elf_Ehdr))
+- return err("unrecognized ELF header size.");
+- if (ehdr->e_phentsize != sizeof(Elf_Phdr))
+- return err("unrecognized program segment header size.");
+-
+- /* Finally, check the file type.
+- */
+- if (ehdr->e_type != ET_EXEC && ehdr->e_type != ET_DYN)
+- return err("not an executable or shared-object library.");
+-
+- return TRUE;
+-}
+-
+-/* readphdrtable() loads the program segment header table into memory.
++#define EGET(X) \
++ (__extension__ ({ \
++ uint64_t __res; \
++ if (!do_reverse_endian) { \
++ __res = (X); \
++ } else if (sizeof(X) == 1) { \
++ __res = (X); \
++ } else if (sizeof(X) == 2) { \
++ __res = bswap_16((X)); \
++ } else if (sizeof(X) == 4) { \
++ __res = bswap_32((X)); \
++ } else if (sizeof(X) == 8) { \
++ __res = bswap_64((X)); \
++ } else { \
++ fprintf(stderr, "%s: %s: EGET failed for size %d\n", \
++ progname, filename, sizeof(X)); \
++ exit(EXIT_FAILURE); \
++ } \
++ __res; \
++ }))
++
++/* Set a value 'Y' in the elf header to 'X', compensating for endianness.
+ */
+-static int readphdrtable(int fd, Elf_Ehdr const *ehdr, Elf_Phdr **phdrs)
+-{
+- size_t size;
++#define ESET(Y,X) \
++ do if (!do_reverse_endian) { \
++ Y = (X); \
++ } else if (sizeof(Y) == 1) { \
++ Y = (X); \
++ } else if (sizeof(Y) == 2) { \
++ Y = bswap_16((uint16_t)(X)); \
++ } else if (sizeof(Y) == 4) { \
++ Y = bswap_32((uint32_t)(X)); \
++ } else if (sizeof(Y) == 8) { \
++ Y = bswap_64((uint64_t)(X)); \
++ } else { \
++ fprintf(stderr, "%s: %s: ESET failed for size %d\n", \
++ progname, filename, sizeof(Y)); \
++ exit(EXIT_FAILURE); \
++ } while (0)
+
+- if (!ehdr->e_phoff || !ehdr->e_phnum)
+- return err("ELF file has no program header table.");
+
+- size = ehdr->e_phnum * sizeof **phdrs;
+- if (!(*phdrs = malloc(size)))
+- return err("Out of memory!");
++/* A macro for I/O errors: The given error message is used only when
++ * errno is not set.
++ */
++#define ferr(msg) (err(errno ? strerror(errno) : (msg)))
++
+
+- errno = 0;
+- if (read(fd, *phdrs, size) != (ssize_t)size)
+- return ferr("missing or incomplete program segment header table.");
+
+- return TRUE;
++#define HEADER_FUNCTIONS(CLASS) \
++ \
++/* readelfheader() reads the ELF header into our global variable, and \
++ * checks to make sure that this is in fact a file that we should be \
++ * munging. \
++ */ \
++static int readelfheader ## CLASS (int fd, Elf ## CLASS ## _Ehdr *ehdr) \
++{ \
++ if (read(fd, ((char *)ehdr)+EI_NIDENT, sizeof(*ehdr) - EI_NIDENT) \
++ != sizeof(*ehdr) - EI_NIDENT) \
++ return ferr("missing or incomplete ELF header."); \
++ \
++ /* Verify the sizes of the ELF header and the program segment \
++ * header table entries. \
++ */ \
++ if (EGET(ehdr->e_ehsize) != sizeof(Elf ## CLASS ## _Ehdr)) \
++ return err("unrecognized ELF header size."); \
++ if (EGET(ehdr->e_phentsize) != sizeof(Elf ## CLASS ## _Phdr)) \
++ return err("unrecognized program segment header size."); \
++ \
++ /* Finally, check the file type. \
++ */ \
++ if (EGET(ehdr->e_type) != ET_EXEC && EGET(ehdr->e_type) != ET_DYN) \
++ return err("not an executable or shared-object library."); \
++ \
++ return TRUE; \
++} \
++ \
++/* readphdrtable() loads the program segment header table into memory. \
++ */ \
++static int readphdrtable ## CLASS (int fd, Elf ## CLASS ## _Ehdr const *ehdr, \
++ Elf ## CLASS ## _Phdr **phdrs) \
++{ \
++ size_t size; \
++ \
++ if (!EGET(ehdr->e_phoff) || !EGET(ehdr->e_phnum) \
++) return err("ELF file has no program header table."); \
++ \
++ size = EGET(ehdr->e_phnum) * sizeof **phdrs; \
++ if (!(*phdrs = malloc(size))) \
++ return err("Out of memory!"); \
++ \
++ errno = 0; \
++ if (read(fd, *phdrs, size) != (ssize_t)size) \
++ return ferr("missing or incomplete program segment header table."); \
++ \
++ return TRUE; \
++} \
++ \
++/* getmemorysize() determines the offset of the last byte of the file \
++ * that is referenced by an entry in the program segment header table. \
++ * (Anything in the file after that point is not used when the program \
++ * is executing, and thus can be safely discarded.) \
++ */ \
++static int getmemorysize ## CLASS (Elf ## CLASS ## _Ehdr const *ehdr, \
++ Elf ## CLASS ## _Phdr const *phdrs, \
++ unsigned long *newsize) \
++{ \
++ Elf ## CLASS ## _Phdr const *phdr; \
++ unsigned long size, n; \
++ int i; \
++ \
++ /* Start by setting the size to include the ELF header and the \
++ * complete program segment header table. \
++ */ \
++ size = EGET(ehdr->e_phoff) + EGET(ehdr->e_phnum) * sizeof *phdrs; \
++ if (size < sizeof *ehdr) \
++ size = sizeof *ehdr; \
++ \
++ /* Then keep extending the size to include whatever data the \
++ * program segment header table references. \
++ */ \
++ for (i = 0, phdr = phdrs ; i < EGET(ehdr->e_phnum) ; ++i, ++phdr) { \
++ if (EGET(phdr->p_type) != PT_NULL) { \
++ n = EGET(phdr->p_offset) + EGET(phdr->p_filesz); \
++ if (n > size) \
++ size = n; \
++ } \
++ } \
++ \
++ *newsize = size; \
++ return TRUE; \
++} \
++ \
++/* modifyheaders() removes references to the section header table if \
++ * it was stripped, and reduces program header table entries that \
++ * included truncated bytes at the end of the file. \
++ */ \
++static int modifyheaders ## CLASS (Elf ## CLASS ## _Ehdr *ehdr, \
++ Elf ## CLASS ## _Phdr *phdrs, \
++ unsigned long newsize) \
++{ \
++ Elf ## CLASS ## _Phdr *phdr; \
++ int i; \
++ \
++ /* If the section header table is gone, then remove all references \
++ * to it in the ELF header. \
++ */ \
++ if (EGET(ehdr->e_shoff) >= newsize) { \
++ ESET(ehdr->e_shoff,0); \
++ ESET(ehdr->e_shnum,0); \
++ ESET(ehdr->e_shentsize,0); \
++ ESET(ehdr->e_shstrndx,0); \
++ } \
++ \
++ /* The program adjusts the file size of any segment that was \
++ * truncated. The case of a segment being completely stripped out \
++ * is handled separately. \
++ */ \
++ for (i = 0, phdr = phdrs ; i < EGET(ehdr->e_phnum) ; ++i, ++phdr) { \
++ if (EGET(phdr->p_offset) >= newsize) { \
++ ESET(phdr->p_offset,newsize); \
++ ESET(phdr->p_filesz,0); \
++ } else if (EGET(phdr->p_offset) + EGET(phdr->p_filesz) > newsize) { \
++ newsize -= EGET(phdr->p_offset); \
++ ESET(phdr->p_filesz, newsize); \
++ } \
++ } \
++ \
++ return TRUE; \
++} \
++ \
++/* commitchanges() writes the new headers back to the original file \
++ * and sets the file to its new size. \
++ */ \
++static int commitchanges ## CLASS (int fd, Elf ## CLASS ## _Ehdr const *ehdr, \
++ Elf ## CLASS ## _Phdr *phdrs, \
++ unsigned long newsize) \
++{ \
++ size_t n; \
++ \
++ /* Save the changes to the ELF header, if any. \
++ */ \
++ if (lseek(fd, 0, SEEK_SET)) \
++ return ferr("could not rewind file"); \
++ errno = 0; \
++ if (write(fd, ehdr, sizeof *ehdr) != sizeof *ehdr) \
++ return err("could not modify file"); \
++ \
++ /* Save the changes to the program segment header table, if any. \
++ */ \
++ if (lseek(fd, EGET(ehdr->e_phoff), SEEK_SET) == (off_t)-1) { \
++ err("could not seek in file."); \
++ goto warning; \
++ } \
++ n = EGET(ehdr->e_phnum) * sizeof *phdrs; \
++ if (write(fd, phdrs, n) != (ssize_t)n) { \
++ err("could not write to file"); \
++ goto warning; \
++ } \
++ \
++ /* Eleventh-hour sanity check: don't truncate before the end of \
++ * the program segment header table. \
++ */ \
++ if (newsize < EGET(ehdr->e_phoff) + n) \
++ newsize = EGET(ehdr->e_phoff) + n; \
++ \
++ /* Chop off the end of the file. \
++ */ \
++ if (ftruncate(fd, newsize)) { \
++ err("could not resize file"); \
++ goto warning; \
++ } \
++ \
++ return TRUE; \
++ \
++ warning: \
++ return err("ELF file may have been corrupted!"); \
+ }
+
+-/* getmemorysize() determines the offset of the last byte of the file
+- * that is referenced by an entry in the program segment header table.
+- * (Anything in the file after that point is not used when the program
+- * is executing, and thus can be safely discarded.)
++
++/* First elements of Elf32_Ehdr and Elf64_Ehdr are common.
+ */
+-static int getmemorysize(Elf_Ehdr const *ehdr, Elf_Phdr const *phdrs,
+- unsigned long *newsize)
++static int readelfheaderident(int fd, Elf32_Ehdr *ehdr)
+ {
+- Elf32_Phdr const *phdr;
+- unsigned long size, n;
+- int i;
+-
+- /* Start by setting the size to include the ELF header and the
+- * complete program segment header table.
+- */
+- size = ehdr->e_phoff + ehdr->e_phnum * sizeof *phdrs;
+- if (size < sizeof *ehdr)
+- size = sizeof *ehdr;
+-
+- /* Then keep extending the size to include whatever data the
+- * program segment header table references.
+- */
+- for (i = 0, phdr = phdrs ; i < ehdr->e_phnum ; ++i, ++phdr) {
+- if (phdr->p_type != PT_NULL) {
+- n = phdr->p_offset + phdr->p_filesz;
+- if (n > size)
+- size = n;
++ errno = 0;
++ if (read(fd, ehdr, EI_NIDENT) != EI_NIDENT)
++ return ferr("missing or incomplete ELF header.");
++
++ /* Check the ELF signature.
++ */
++ if (!(ehdr->e_ident[EI_MAG0] == ELFMAG0 &&
++ ehdr->e_ident[EI_MAG1] == ELFMAG1 &&
++ ehdr->e_ident[EI_MAG2] == ELFMAG2 &&
++ ehdr->e_ident[EI_MAG3] == ELFMAG3))
++ {
++ err("missing ELF signature.");
++ return -1;
++ }
++
++ /* Compare the file's class and endianness with the program's.
++ */
++#if __BYTE_ORDER == __LITTLE_ENDIAN
++ if (ehdr->e_ident[EI_DATA] == ELFDATA2LSB) {
++ do_reverse_endian = 0;
++ } else if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB) {
++/* fprintf(stderr, "ELF file has different endianness.\n"); */
++ do_reverse_endian = 1;
++ }
++#elif __BYTE_ORDER == __BIG_ENDIAN
++ if (ehdr->e_ident[EI_DATA] == ELFDATA2LSB) {
++/* fprintf(stderr, "ELF file has different endianness.\n"); */
++ do_reverse_endian = 1;
++ } else if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB) {
++ do_reverse_endian = 0;
++ }
++#else
++#error unkown endianness
++#endif
++ else {
++ err("Unsupported endianness");
++ return -1;
+ }
+- }
+
+- *newsize = size;
+- return TRUE;
++ /* Check the target architecture.
++ */
++/* if (EGET(ehdr->e_machine) != ELF_ARCH) { */
++/* /\* return err("ELF file created for different architecture."); *\/ */
++/* fprintf(stderr, "ELF file created for different architecture.\n"); */
++/* } */
++ return ehdr->e_ident[EI_CLASS];
+ }
+
++
++HEADER_FUNCTIONS(32)
++
++HEADER_FUNCTIONS(64)
++
+ /* truncatezeros() examines the bytes at the end of the file's
+ * size-to-be, and reduces the size to exclude any trailing zero
+ * bytes.
+ */
+ static int truncatezeros(int fd, unsigned long *newsize)
+ {
+- unsigned char contents[1024];
+- unsigned long size, n;
+-
+- size = *newsize;
+- do {
+- n = sizeof contents;
+- if (n > size)
+- n = size;
+- if (lseek(fd, size - n, SEEK_SET) == (off_t)-1)
+- return ferr("cannot seek in file.");
+- if (read(fd, contents, n) != (ssize_t)n)
+- return ferr("cannot read file contents");
+- while (n && !contents[--n])
+- --size;
+- } while (size && !n);
+-
+- /* Sanity check.
+- */
+- if (!size)
+- return err("ELF file is completely blank!");
+-
+- *newsize = size;
+- return TRUE;
+-}
+-
+-/* modifyheaders() removes references to the section header table if
+- * it was stripped, and reduces program header table entries that
+- * included truncated bytes at the end of the file.
+- */
+-static int modifyheaders(Elf_Ehdr *ehdr, Elf_Phdr *phdrs,
+- unsigned long newsize)
+-{
+- Elf32_Phdr *phdr;
+- int i;
+-
+- /* If the section header table is gone, then remove all references
+- * to it in the ELF header.
+- */
+- if (ehdr->e_shoff >= newsize) {
+- ehdr->e_shoff = 0;
+- ehdr->e_shnum = 0;
+- ehdr->e_shentsize = 0;
+- ehdr->e_shstrndx = 0;
+- }
+-
+- /* The program adjusts the file size of any segment that was
+- * truncated. The case of a segment being completely stripped out
+- * is handled separately.
+- */
+- for (i = 0, phdr = phdrs ; i < ehdr->e_phnum ; ++i, ++phdr) {
+- if (phdr->p_offset >= newsize) {
+- phdr->p_offset = newsize;
+- phdr->p_filesz = 0;
+- } else if (phdr->p_offset + phdr->p_filesz > newsize) {
+- phdr->p_filesz = newsize - phdr->p_offset;
+- }
+- }
+-
+- return TRUE;
+-}
+-
+-/* commitchanges() writes the new headers back to the original file
+- * and sets the file to its new size.
+- */
+-static int commitchanges(int fd, Elf_Ehdr const *ehdr, Elf_Phdr *phdrs,
+- unsigned long newsize)
+-{
+- size_t n;
+-
+- /* Save the changes to the ELF header, if any.
+- */
+- if (lseek(fd, 0, SEEK_SET))
+- return ferr("could not rewind file");
+- errno = 0;
+- if (write(fd, ehdr, sizeof *ehdr) != sizeof *ehdr)
+- return err("could not modify file");
+-
+- /* Save the changes to the program segment header table, if any.
+- */
+- if (lseek(fd, ehdr->e_phoff, SEEK_SET) == (off_t)-1) {
+- err("could not seek in file.");
+- goto warning;
+- }
+- n = ehdr->e_phnum * sizeof *phdrs;
+- if (write(fd, phdrs, n) != (ssize_t)n) {
+- err("could not write to file");
+- goto warning;
+- }
+-
+- /* Eleventh-hour sanity check: don't truncate before the end of
+- * the program segment header table.
+- */
+- if (newsize < ehdr->e_phoff + n)
+- newsize = ehdr->e_phoff + n;
+-
+- /* Chop off the end of the file.
+- */
+- if (ftruncate(fd, newsize)) {
+- err("could not resize file");
+- goto warning;
+- }
+-
+- return TRUE;
+-
+- warning:
+- return err("ELF file may have been corrupted!");
++ unsigned char contents[1024];
++ unsigned long size, n;
++
++ size = *newsize;
++ do {
++ n = sizeof contents;
++ if (n > size)
++ n = size;
++ if (lseek(fd, size - n, SEEK_SET) == (off_t)-1)
++ return ferr("cannot seek in file.");
++ if (read(fd, contents, n) != (ssize_t)n)
++ return ferr("cannot read file contents");
++ while (n && !contents[--n])
++ --size;
++ } while (size && !n);
++
++ /* Sanity check.
++ */
++ if (!size)
++ return err("ELF file is completely blank!");
++
++ *newsize = size;
++ return TRUE;
+ }
+
+ /* main() loops over the cmdline arguments, leaving all the real work
+@@ -266,44 +403,66 @@ static int commitchanges(int fd, Elf_Ehdr const *ehdr, Elf_Phdr *phdrs,
+ */
+ int main(int argc, char *argv[])
+ {
+- int fd;
+- Elf_Ehdr ehdr;
+- Elf_Phdr *phdrs;
+- unsigned long newsize;
+- char **arg;
+- int failures = 0;
+-
+- if (argc < 2 || argv[1][0] == '-') {
+- printf("Usage: sstrip FILE...\n"
+- "sstrip discards all nonessential bytes from an executable.\n\n"
+- "Version 2.0 Copyright (C) 2000,2001 Brian Raiter.\n"
+- "This program is free software, licensed under the GNU\n"
+- "General Public License. There is absolutely no warranty.\n");
+- return EXIT_SUCCESS;
+- }
+-
+- progname = argv[0];
+-
+- for (arg = argv + 1 ; *arg != NULL ; ++arg) {
+- filename = *arg;
+-
+- fd = open(*arg, O_RDWR);
+- if (fd < 0) {
+- ferr("can't open");
+- ++failures;
+- continue;
++ int fd;
++ union {
++ Elf32_Ehdr ehdr32;
++ Elf64_Ehdr ehdr64;
++ } e;
++ union {
++ Elf32_Phdr *phdrs32;
++ Elf64_Phdr *phdrs64;
++ } p;
++ unsigned long newsize;
++ char **arg;
++ int failures = 0;
++
++ if (argc < 2 || argv[1][0] == '-') {
++ printf("Usage: sstrip FILE...\n"
++ "sstrip discards all nonessential bytes from an executable.\n\n"
++ "Version 2.0-X Copyright (C) 2000,2001 Brian Raiter.\n"
++ "Cross-devel hacks Copyright (C) 2004 Manuel Novoa III.\n"
++ "This program is free software, licensed under the GNU\n"
++ "General Public License. There is absolutely no warranty.\n");
++ return EXIT_SUCCESS;
+ }
+
+- if (!(readelfheader(fd, &ehdr) &&
+- readphdrtable(fd, &ehdr, &phdrs) &&
+- getmemorysize(&ehdr, phdrs, &newsize) &&
+- truncatezeros(fd, &newsize) &&
+- modifyheaders(&ehdr, phdrs, newsize) &&
+- commitchanges(fd, &ehdr, phdrs, newsize)))
+- ++failures;
+-
+- close(fd);
+- }
++ progname = argv[0];
++
++ for (arg = argv + 1 ; *arg != NULL ; ++arg) {
++ filename = *arg;
++
++ fd = open(*arg, O_RDWR);
++ if (fd < 0) {
++ ferr("can't open");
++ ++failures;
++ continue;
++ }
++
++ switch (readelfheaderident(fd, &e.ehdr32)) {
++ case ELFCLASS32:
++ if (!(readelfheader32(fd, &e.ehdr32) &&
++ readphdrtable32(fd, &e.ehdr32, &p.phdrs32) &&
++ getmemorysize32(&e.ehdr32, p.phdrs32, &newsize) &&
++ truncatezeros(fd, &newsize) &&
++ modifyheaders32(&e.ehdr32, p.phdrs32, newsize) &&
++ commitchanges32(fd, &e.ehdr32, p.phdrs32, newsize)))
++ ++failures;
++ break;
++ case ELFCLASS64:
++ if (!(readelfheader64(fd, &e.ehdr64) &&
++ readphdrtable64(fd, &e.ehdr64, &p.phdrs64) &&
++ getmemorysize64(&e.ehdr64, p.phdrs64, &newsize) &&
++ truncatezeros(fd, &newsize) &&
++ modifyheaders64(&e.ehdr64, p.phdrs64, newsize) &&
++ commitchanges64(fd, &e.ehdr64, p.phdrs64, newsize)))
++ ++failures;
++ break;
++ default:
++ ++failures;
++ break;
++ }
++ close(fd);
++ }
+
+- return failures ? EXIT_FAILURE : EXIT_SUCCESS;
++ return failures ? EXIT_FAILURE : EXIT_SUCCESS;
+ }
+--
+1.7.0
+
diff --git a/patches/elfkickers-2.0a.orig/series b/patches/elfkickers-2.0a.orig/series
new file mode 100644
index 000000000..a61de33c8
--- /dev/null
+++ b/patches/elfkickers-2.0a.orig/series
@@ -0,0 +1,6 @@
+0001-01_add_toplevel_makefile.diff.patch
+0002-02_update_subdirs_makefile.diff.patch
+0003-03_add_include_string.h.diff.patch
+0004-04_bsd_include_elf.h.diff.patch
+0005-05_add_et_core_elfls.diff.patch
+0006-mjn3-sstrip.patch
diff --git a/rules/host-elfkickers.in b/rules/host-elfkickers.in
new file mode 100644
index 000000000..bf481d3de
--- /dev/null
+++ b/rules/host-elfkickers.in
@@ -0,0 +1,6 @@
+## SECTION=hosttools
+
+config HOST_ELFKICKERS
+ tristate
+ help
+ collection of programs dealing with the ELF file format
diff --git a/rules/host-elfkickers.make b/rules/host-elfkickers.make
new file mode 100644
index 000000000..50345e7e9
--- /dev/null
+++ b/rules/host-elfkickers.make
@@ -0,0 +1,51 @@
+# -*-makefile-*-
+#
+# Copyright (C) 2010 by Marc Kleine-Budde <mkl@pengutronix.de>
+#
+# See CREDITS for details about who has contributed to this project.
+#
+# For further information about the PTXdist project and license conditions
+# see the README file.
+#
+
+#
+# We provide this package
+#
+HOST_PACKAGES-$(PTXCONF_HOST_ELFKICKERS) += host-elfkickers
+
+#
+# Paths and names
+#
+HOST_ELFKICKERS_VERSION := 2.0a
+HOST_ELFKICKERS_SUFFIX := tar.gz
+HOST_ELFKICKERS := elfkickers-$(HOST_ELFKICKERS_VERSION).orig
+HOST_ELFKICKERS_TARBALL := elfkickers_$(HOST_ELFKICKERS_VERSION).orig.$(HOST_ELFKICKERS_SUFFIX)
+HOST_ELFKICKERS_URL := http://archive.ubuntu.com/ubuntu/pool/universe/e/elfkickers/$(HOST_ELFKICKERS_TARBALL)
+HOST_ELFKICKERS_SOURCE := $(SRCDIR)/$(HOST_ELFKICKERS_TARBALL)
+HOST_ELFKICKERS_DIR := $(HOST_BUILDDIR)/$(HOST_ELFKICKERS)
+
+# ----------------------------------------------------------------------------
+# Get
+# ----------------------------------------------------------------------------
+
+$(HOST_ELFKICKERS_SOURCE):
+ @$(call targetinfo)
+ @$(call get, HOST_ELFKICKERS)
+
+# ----------------------------------------------------------------------------
+# Prepare
+# ----------------------------------------------------------------------------
+
+HOST_ELFKICKERS_MAKE_ENV := $(HOST_ENV_CC)
+HOST_ELFKICKERS_CONF_TOOL := NO
+
+# ----------------------------------------------------------------------------
+# Install
+# ----------------------------------------------------------------------------
+
+$(STATEDIR)/host-elfkickers.install:
+ @$(call targetinfo)
+ cp "$(HOST_ELFKICKERS_DIR)/sstrip/sstrip" "$(PTXDIST_SYSROOT_HOST)/bin"
+ @$(call touch)
+
+# vim: syntax=make