diff options
author | Marc Kleine-Budde <mkl@pengutronix.de> | 2010-03-11 02:18:54 +0100 |
---|---|---|
committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2010-03-11 12:04:48 +0100 |
commit | 9be918afe2d55843cbf14eccd7d58071dbdfbcfe (patch) | |
tree | 06886160cd2dd1be57b01b895bbed36df840c49d | |
parent | 00b53abd55c0bc1040dd66e028178e1ae58f4987 (diff) | |
download | ptxdist-9be918afe2d55843cbf14eccd7d58071dbdfbcfe.tar.gz ptxdist-9be918afe2d55843cbf14eccd7d58071dbdfbcfe.tar.xz |
[host-elfkickers] new package
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
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 |