Make it compile again by adding a more portable setfold.sh script.

committer: mfx <mfx> 962038500 +0000
This commit is contained in:
Markus F.X.J. Oberhumer
2000-06-26 16:55:00 +00:00
parent 9be680108e
commit aba09d07c9
11 changed files with 97 additions and 51 deletions
+3
View File
@@ -0,0 +1,3 @@
*.upx
upx
upx.map
View File
+27
View File
@@ -0,0 +1,27 @@
*.asx
*.asy
*.bin
*.i
*.lst
*.map
*.o
l_com.h
l_djgpp2.h
l_exe.h
l_le_n2b.h
l_le_n2d.h
l_lx_n2b.h
l_lx_n2d.h
l_sh_n2b.h
l_sh_n2d.h
l_sys.h
l_tmt.h
l_t_n2b.h
l_t_n2bs.h
l_t_n2d.h
l_t_n2ds.h
l_w32pe.h
l_wcle.h
stubify.h
upxb
upxd
+30 -47
View File
@@ -61,7 +61,7 @@ APP = perl -w scripts/app.pl
BIN2H = perl -w scripts/bin2h.pl
BRANDELF = perl -w scripts/brandelf.pl
O2BIN = perl -w scripts/o2bin.pl
SETFOLD = perl -w scripts/setfold.pl
SETFOLD = /bin/sh scripts/setfold.sh
##STRIPELF = perl -w scripts/stripelf.pl
STRIPELF = ./util/sstrip/sstrip
@@ -95,14 +95,14 @@ mostlyclean:
-rm -f *~ *.bin *.bkp *.i *.lst *.map
clean: mostlyclean
-rm -f *.o *.asx *.asy upxb upxd
-rm -f *.o *.asx *.asy
distclean: clean
# This command is intended for maintainers to use; it deletes files
# that may require special tools to rebuild.
maintainer-clean: distclean
-rm -f $(STUBS)
-rm -f $(STUBS) upxb upxd
ident: all
ident *.bin
@@ -188,12 +188,9 @@ l_w32pe.h: l_w32pe.asx
l_lx_n2b.h: l_lx_exec.c l_xe_n2b.o l_lx_exec86.lds Makefile
$(CC_LINUX) -DNRV2B -o $T.o -c $<
ld -T l_lx_exec86.lds -Map l_lx_n2b.map -o $T.bin \
ld -T l_lx_exec86.lds -Map $T.map -o $T.bin \
l_xe_n2b.o $T.o
fold=`nm $T.bin | grep fold_begin | sed 's/.....\(...\).*/0x\1/'`; \
objcopy -S -R .comment -R .note $T.bin; \
$(SETFOLD) $T.bin $$fold
$(STRIPELF) $T.bin
$(SETFOLD) $T.bin
$(BRANDELF) $T.bin
$(BIN2H) $T.bin linux_i386exec_nrv2b_loader $@
@@ -201,10 +198,7 @@ l_le_n2b.h: l_lx_elf.c l_6e_n2b.o l_lx_elf86.lds
$(CC_LINUX) -DNRV2B -o $T.o -c $<
ld -T l_lx_elf86.lds -Map $T.map -o $T.bin \
l_6e_n2b.o $T.o
fold=`nm $T.bin | grep fold_begin | sed 's/.....\(...\).*/0x\1/'`; \
objcopy -S -R .comment -R .note $T.bin; \
$(SETFOLD) $T.bin $$fold
$(STRIPELF) $T.bin
$(SETFOLD) $T.bin
$(BRANDELF) $T.bin
$(BIN2H) $T.bin linux_i386elf_nrv2b_loader $@
@@ -212,10 +206,7 @@ l_sh_n2b.h: l_lx_sh.c l_6h_n2b.o l_lx_sh86.lds
$(CC_LINUX) -DNRV2B -o $T.o -c $<
ld -T l_lx_sh86.lds -Map $T.map -o $T.bin \
l_6h_n2b.o $T.o
fold=`nm $T.bin | grep fold_begin | sed 's/.....\(...\).*/0x\1/'`; \
objcopy -S -R .comment -R .note $T.bin; \
$(SETFOLD) $T.bin $$fold
$(STRIPELF) $T.bin
$(SETFOLD) $T.bin
$(BRANDELF) $T.bin
$(BIN2H) $T.bin linux_i386sh_nrv2b_loader $@
@@ -233,10 +224,7 @@ l_lx_n2d.h: l_lx_exec.c l_xe_n2d.o l_lx_exec86.lds
$(CC_LINUX) -DNRV2D -o $T.o -c $<
ld -T l_lx_exec86.lds -Map $T.map -o $T.bin \
l_xe_n2d.o $T.o
fold=`nm $T.bin | grep fold_begin | sed 's/.....\(...\).*/0x\1/'`; \
objcopy -S -R .comment -R .note $T.bin; \
$(SETFOLD) $T.bin $$fold
$(STRIPELF) $T.bin
$(SETFOLD) $T.bin
$(BRANDELF) $T.bin
$(BIN2H) $T.bin linux_i386exec_nrv2d_loader $@
@@ -244,10 +232,7 @@ l_le_n2d.h: l_lx_elf.c l_6e_n2d.o l_lx_elf86.lds
$(CC_LINUX) -DNRV2D -o $T.o -c $<
ld -T l_lx_elf86.lds -Map $T.map -o $T.bin \
l_6e_n2d.o $T.o
fold=`nm $T.bin | grep fold_begin | sed 's/.....\(...\).*/0x\1/'`; \
objcopy -S -R .comment -R .note $T.bin; \
$(SETFOLD) $T.bin $$fold
$(STRIPELF) $T.bin
$(SETFOLD) $T.bin
$(BRANDELF) $T.bin
$(BIN2H) $T.bin linux_i386elf_nrv2d_loader $@
@@ -255,10 +240,7 @@ l_sh_n2d.h: l_lx_sh.c l_6h_n2d.o l_lx_sh86.lds
$(CC_LINUX) -DNRV2D -o $T.o -c $<
ld -T l_lx_sh86.lds -Map $T.map -o $T.bin \
l_6h_n2d.o $T.o
fold=`nm $T.bin | grep fold_begin | sed 's/.....\(...\).*/0x\1/'`; \
objcopy -S -R .comment -R .note $T.bin; \
$(SETFOLD) $T.bin $$fold
$(STRIPELF) $T.bin
$(SETFOLD) $T.bin
$(BRANDELF) $T.bin
$(BIN2H) $T.bin linux_i386sh_nrv2d_loader $@
@@ -273,20 +255,21 @@ l_6h_n2d.o: l_lx_sh86.asm
l_lx_sep.o: l_lx_sep.c
$(CC_LINUX) -c $<
upxb: l_lx_sep.o l_lx_sep86.asm
$(NASM) -i$(UCL_I386)/ -f elf -dNRV2B -o upxb.o l_lx_sep86.asm
ld -T l_lx_sep86.lds -Map upxb.map -o upxb upxb.o l_lx_sep.o
objcopy -S -R .comment -R .note upxb
$(STRIPELF) upxb
$(BRANDELF) upxb
$(NASM) -i$(UCL_I386)/ -f elf -dNRV2B -o $T.o l_lx_sep86.asm
ld -T l_lx_sep86.lds -Map $T.map -o $@ $T.o l_lx_sep.o
objcopy -S -R .comment -R .note $@
$(STRIPELF) $@
$(BRANDELF) $@
upxd: l_lx_sep.o l_lx_sep86.asm
$(NASM) -i$(UCL_I386)/ -f elf -dNRV2D -o upxd.o l_lx_sep86.asm
ld -T l_lx_sep86.lds -Map upxd.map -o upxd upxd.o l_lx_sep.o
objcopy -S -R .comment -R .note upxd
$(STRIPELF) upxd
$(BRANDELF) upxd
$(NASM) -i$(UCL_I386)/ -f elf -dNRV2D -o $T.o l_lx_sep86.asm
ld -T l_lx_sep86.lds -Map $T.map -o $@ $T.o l_lx_sep.o
objcopy -S -R .comment -R .note $@
$(STRIPELF) $@
$(BRANDELF) $@
# /***********************************************************************
# // dependencies
@@ -316,14 +299,14 @@ l_xe_n2d.o: n2d_d32.ash $(DEPS1)
l_6e_n2d.o: n2d_d32.ash $(DEPS1)
l_6h_n2d.o: n2d_d32.ash $(DEPS1)
l_lx_n2b.h: linux.hh
l_lx_n2d.h: linux.hh
l_le_n2b.h: linux.hh
l_le_n2d.h: linux.hh
l_sh_n2b.h: linux.hh
l_sh_n2d.h: linux.hh
upxb: linux.hh
upxd: linux.hh
l_lx_n2b.h: linux.hh
l_lx_n2d.h: linux.hh
l_le_n2b.h: linux.hh
l_le_n2d.h: linux.hh
l_sh_n2b.h: linux.hh
l_sh_n2d.h: linux.hh
upxb: linux.hh
upxd: linux.hh
.NOEXPORT:
+3 -3
View File
@@ -270,7 +270,7 @@ do_xmap(int fdi, Elf32_Ehdr const *const ehdr, f_expand *const f_decompress,
(char const *)ehdr);
unsigned long base = (ET_DYN==ehdr->e_type) ? 0x40000000 : 0;
int j;
for (j=0; j < ehdr->e_phnum; ++phdr, ++j)
for (j=0; j < ehdr->e_phnum; ++phdr, ++j)
if (PT_PHDR==phdr->p_type) {
a->a_un.a_val = phdr->p_vaddr;
}
@@ -340,7 +340,7 @@ ERR_LAB
do_brk(haddr);
}
}
if (close(fdi) != 0)
if (close(fdi) != 0)
err_exit(11);
if (ET_DYN==ehdr->e_type) {
return ehdr->e_entry + base;
@@ -402,7 +402,7 @@ void *upx_main(
// ----- Step 4: decompress blocks -----
//
// Get Elf32_Ehdr. First set xo.size = size[0] = uncompressed size
// Get Elf32_Ehdr. First set xo.size = size[0] = uncompressed size
if (0!=xread(fdi, (void *)&xo, sizeof(xo))) {
err_exit(15);
}
-98
View File
@@ -1,98 +0,0 @@
The GNU bfd binary file descriptor package, part of the GNU binutils package,
contains code to recognize an Elf file by looking at fields in the file header.
Many programs (such as gdb, size, objdump, objcopy, strip and others) use bfd.
Unfortunately, bfd has been overly strict. In releases binutils-2.9.1.0.4,
binutils-2.9.1.0.23, binutils-2.9.5.0.0, gdb-4.17, and probably others,
bfd does not recognize a file with zero in Elf32_Ehdr.e_shoff, .e_shentsize,
or .e_shnum, even though the operating system kernel does not care, and many
bfd clients would work just fine in these cases.
Because of its desire to create small size compressed executables, UPX
generates and uses Elf files with zero in .e_shoff, .e_shentsizes, and .e_shnum.
As a result, many widely-distributed instances of gdb, size, objdump, etc.,
refuse to work on UPX-packed executables.
Here is a patch to bfd/elfcode.h which enables many bfd clients to work
with UPX-packed executables. The last two lines of the patch are
if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
return -1;
--- elfcode.h.orig Mon Jun 16 11:45:32 1997
+++ elfcode.h Sat Apr 22 10:18:56 2000
@@ -1,5 +1,5 @@
/* ELF executable support for BFD.
- Copyright 1991, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
+ Copyright 1991, 92, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
Written by Fred Fish @ Cygnus Support, from information published
in "UNIX System V Release 4, Programmers Guide: ANSI C and
@@ -517,14 +517,14 @@
elf_debug_file (i_ehdrp);
#endif
- /* If there is no section header table, we're hosed. */
- if (i_ehdrp->e_shoff == 0)
+ /* If there is no section header table, and relocatable, then we're hosed. */
+ if (i_ehdrp->e_shoff == 0 && i_ehdrp->e_type == ET_REL)
goto got_wrong_format_error;
/* As a simple sanity check, verify that the what BFD thinks is the
size of each section header table entry actually matches the size
- recorded in the file. */
- if (i_ehdrp->e_shentsize != sizeof (x_shdr))
+ recorded in the file, but only if there are any sections. */
+ if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
goto got_wrong_format_error;
ebd = get_elf_backend_data (abfd);
@@ -579,6 +579,7 @@
/* Allocate space for a copy of the section header table in
internal form, seek to the section header table in the file,
read it in, and convert it to internal form. */
+ if (i_ehdrp->e_shnum!=0) {
i_shdrp = ((Elf_Internal_Shdr *)
bfd_alloc (abfd, sizeof (*i_shdrp) * i_ehdrp->e_shnum));
elf_elfsections (abfd) = ((Elf_Internal_Shdr **)
@@ -609,6 +610,7 @@
if (! bfd_section_from_shdr (abfd, i_ehdrp->e_shstrndx))
goto got_no_match;
}
+ }
/* Read in the program headers. */
if (i_ehdrp->e_phnum == 0)
@@ -644,6 +646,7 @@
bfd_section_from_shdr with it (since this particular strtab is
used to find all of the ELF section names.) */
+ if (i_ehdrp->e_shstrndx != 0) {
shstrtab = bfd_elf_get_str_section (abfd, i_ehdrp->e_shstrndx);
if (!shstrtab)
goto got_no_match;
@@ -657,6 +660,7 @@
if (! bfd_section_from_shdr (abfd, shindex))
goto got_no_match;
}
+ }
/* Let the backend double check the format and override global
information. */
@@ -930,7 +934,7 @@
{
Elf_Internal_Shdr *hdr;
Elf_Internal_Shdr *verhdr;
- long symcount; /* Number of external ELF symbols */
+ unsigned long symcount; /* Number of external ELF symbols */
elf_symbol_type *sym; /* Pointer to current bfd symbol */
elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
Elf_Internal_Sym i_sym;
@@ -978,7 +982,7 @@
sym = symbase = NULL;
else
{
- long i;
+ unsigned long i;
if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
return -1;
+5 -1
View File
@@ -29,7 +29,11 @@ $fname = shift || die;
sysopen (FH,$fname,2) || die;
binmode FH;
$val = oct shift || die;
$val = shift || die "$val";
###print STDERR "$val\n";
$val = oct($val); # acutally hex()
###print STDERR "$val\n";
die unless $val;
$num = pack("V", $val);
# 0x34 = sizeof(Elf32_Ehdr)
+23
View File
@@ -0,0 +1,23 @@
#!/bin/sh
set -e
file="$1"
# get directory of this script
bindir=`echo "$0" | sed -e 's|[^/][^/]*$||'`
bindir=`cd "$bindir" && pwd`
sstrip="$bindir/../util/sstrip/sstrip"
# get address of symbol "fold_begin"
fold=`nm -f bsd "$file" | grep fold_begin | sed 's/^0*\([0-9a-fA-F]*\).*/0x\1/'`
# strip
objcopy -S -R .comment -R .note "$file"
"$sstrip" "$file"
# patch address
perl -w "$bindir/setfold.pl" "$file" "$fold"
exit 0