Hilko Bengen
2011-Aug-24 15:16 UTC
[Libguestfs] [PATCH] febootstrap-supermin-helper: Replace objcopy call for embedding init binary
objcopy needs "output-target" and "binary-architecture" parameters which makes it necessary to keep a list of known architectures. The bin2s.pl script generates input for the GNU assembler which should produce an object file that is equivalent to that produced by objcopy. I have successfully tested the change on an amd64 Debian/unstable system. --- helper/Makefile.am | 10 ++++++++-- helper/bin2s.pl | 45 +++++++++++++++++++++++++++++++++++++++++++++ helper/elf-default-arch | 32 -------------------------------- 3 files changed, 53 insertions(+), 34 deletions(-) create mode 100755 helper/bin2s.pl delete mode 100755 helper/elf-default-arch diff --git a/helper/Makefile.am b/helper/Makefile.am index 01a6af1..ab7f692 100644 --- a/helper/Makefile.am +++ b/helper/Makefile.am @@ -45,11 +45,17 @@ init_LDFLAGS = -static # http://www.doof.me.uk/2010/05/07/cute-objcopy-hack/ ELF_DEFAULT_ARCH = $(shell $(srcdir)/elf-default-arch | gawk '{ print $$1 }') DEFAULT_ARCH = $(shell $(srcdir)/elf-default-arch | gawk '{ print $$2 }') -ext2init.o: init + +CLEANFILES = ext2init.S + +ext2init.o: ext2init.S + $(CC) -o $@ -c $< + +ext2init.S: init strip --strip-all $< @file $< | grep -isq static || \ (echo "*** error: init is not staticly linked"; exit 1) - objcopy -I binary -B $(DEFAULT_ARCH) -O $(ELF_DEFAULT_ARCH) $< $@ + ./bin2s.pl $< $@ man_MANS = \ febootstrap-supermin-helper.8 diff --git a/helper/bin2s.pl b/helper/bin2s.pl new file mode 100755 index 0000000..2c78b5e --- /dev/null +++ b/helper/bin2s.pl @@ -0,0 +1,45 @@ +#!/usr/bin/perl + +# This script creates a source file for the GNU assembler which shuold +# result in an object file equivalent to that of +# +# objcopy -I binary -B $(DEFAULT_ARCH) -O $(ELF_DEFAULT_ARCH) <in> <out> + +use strict; +use warnings; + +die "usage: $0 <in> <out>\n" if @ARGV != 2; + +my ($infile, $outfile) = @ARGV; +my ($buf, $i, $sz); +open my $ifh, '<', $infile or die "open $infile: $!"; +open my $ofh, '>', $outfile or die "open $outfile: $!"; + +print $ofh <<"EOF"; +/* This file has been automatically generated from $infile by $0 */ + +\t.globl\t_binary_${infile}_start +\t.globl\t_binary_${infile}_end +\t.globl\t_binary_${infile}_size + +\t.section\t.data +_binary_${infile}_start: +EOF + +$sz = 0; +while ( $i = read $ifh, $buf, 12 ) { + print $ofh "\t.byte\t" + . join( ',', map { sprintf '0x%02x', ord $_ } split //, $buf ) . "\n"; + $sz += $i; +} +die "read $infile (at offset $sz): $!\n" if not defined $i; +close $ifh; + +print $ofh <<"EOF"; + +_binary_${infile}_end: + +\t.equ _binary_${infile}_size, $sz +EOF + +close $ofh; diff --git a/helper/elf-default-arch b/helper/elf-default-arch deleted file mode 100755 index 54af14d..0000000 --- a/helper/elf-default-arch +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh - -# Copyright (C) 2010 Red Hat Inc. -# -# This program is free software; you can redistribute it and/or modify -# it 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; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -# Calculate the default ELF object architecture for this format. -# There doesn't seem to be an easy way to derive this from binutils, -# so instead we hard code it. - -case $(uname -m) in - i[3456]86) echo "elf32-i386 i386" ;; - x86_64) echo "elf64-x86-64 i386" ;; - s390) echo "elf32-s390 s390:31-bit" ;; - s390x) echo "elf64-s390 s390:31-bit" ;; - ppc) echo "elf32-powerpc powerpc" ;; - ppc64) echo "elf64-powerpc powerpc" ;; - *) - echo "This architecture is not recognized. Please update helper/elf-default-arch." - exit 1 -esac -- 1.7.5.4
Richard W.M. Jones
2011-Aug-25 08:45 UTC
[Libguestfs] [PATCH] febootstrap-supermin-helper: Replace objcopy call for embedding init binary
On Wed, Aug 24, 2011 at 05:16:51PM +0200, Hilko Bengen wrote:> objcopy needs "output-target" and "binary-architecture" parameters > which makes it necessary to keep a list of known architectures. > > The bin2s.pl script generates input for the GNU assembler which should > produce an object file that is equivalent to that produced by objcopy. > > I have successfully tested the change on an amd64 Debian/unstable system. > --- > helper/Makefile.am | 10 ++++++++-- > helper/bin2s.pl | 45 +++++++++++++++++++++++++++++++++++++++++++++ > helper/elf-default-arch | 32 -------------------------------- > 3 files changed, 53 insertions(+), 34 deletions(-) > create mode 100755 helper/bin2s.pl > delete mode 100755 helper/elf-default-arch > > diff --git a/helper/Makefile.am b/helper/Makefile.am > index 01a6af1..ab7f692 100644 > --- a/helper/Makefile.am > +++ b/helper/Makefile.am > @@ -45,11 +45,17 @@ init_LDFLAGS = -static > # http://www.doof.me.uk/2010/05/07/cute-objcopy-hack/ > ELF_DEFAULT_ARCH = $(shell $(srcdir)/elf-default-arch | gawk '{ print $$1 }') > DEFAULT_ARCH = $(shell $(srcdir)/elf-default-arch | gawk '{ print $$2 }') > -ext2init.o: init > + > +CLEANFILES = ext2init.S > + > +ext2init.o: ext2init.S > + $(CC) -o $@ -c $< > + > +ext2init.S: init > strip --strip-all $< > @file $< | grep -isq static || \ > (echo "*** error: init is not staticly linked"; exit 1) > - objcopy -I binary -B $(DEFAULT_ARCH) -O $(ELF_DEFAULT_ARCH) $< $@ > + ./bin2s.pl $< $@ > > man_MANS = \ > febootstrap-supermin-helper.8 > diff --git a/helper/bin2s.pl b/helper/bin2s.pl > new file mode 100755 > index 0000000..2c78b5e > --- /dev/null > +++ b/helper/bin2s.pl > @@ -0,0 +1,45 @@ > +#!/usr/bin/perl > + > +# This script creates a source file for the GNU assembler which shuold > +# result in an object file equivalent to that of > +# > +# objcopy -I binary -B $(DEFAULT_ARCH) -O $(ELF_DEFAULT_ARCH) <in> <out> > + > +use strict; > +use warnings; > + > +die "usage: $0 <in> <out>\n" if @ARGV != 2; > + > +my ($infile, $outfile) = @ARGV; > +my ($buf, $i, $sz); > +open my $ifh, '<', $infile or die "open $infile: $!"; > +open my $ofh, '>', $outfile or die "open $outfile: $!"; > + > +print $ofh <<"EOF"; > +/* This file has been automatically generated from $infile by $0 */ > + > +\t.globl\t_binary_${infile}_start > +\t.globl\t_binary_${infile}_end > +\t.globl\t_binary_${infile}_size > + > +\t.section\t.data > +_binary_${infile}_start: > +EOF > + > +$sz = 0; > +while ( $i = read $ifh, $buf, 12 ) { > + print $ofh "\t.byte\t" > + . join( ',', map { sprintf '0x%02x', ord $_ } split //, $buf ) . "\n"; > + $sz += $i; > +} > +die "read $infile (at offset $sz): $!\n" if not defined $i; > +close $ifh; > + > +print $ofh <<"EOF"; > + > +_binary_${infile}_end: > + > +\t.equ _binary_${infile}_size, $sz > +EOF > + > +close $ofh; > diff --git a/helper/elf-default-arch b/helper/elf-default-arch > deleted file mode 100755 > index 54af14d..0000000 > --- a/helper/elf-default-arch > +++ /dev/null > @@ -1,32 +0,0 @@ > -#!/bin/sh - > -# Copyright (C) 2010 Red Hat Inc. > -# > -# This program is free software; you can redistribute it and/or modify > -# it 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; if not, write to the Free Software > -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. > - > -# Calculate the default ELF object architecture for this format. > -# There doesn't seem to be an easy way to derive this from binutils, > -# so instead we hard code it. > - > -case $(uname -m) in > - i[3456]86) echo "elf32-i386 i386" ;; > - x86_64) echo "elf64-x86-64 i386" ;; > - s390) echo "elf32-s390 s390:31-bit" ;; > - s390x) echo "elf64-s390 s390:31-bit" ;; > - ppc) echo "elf32-powerpc powerpc" ;; > - ppc64) echo "elf64-powerpc powerpc" ;; > - *) > - echo "This architecture is not recognized. Please update helper/elf-default-arch." > - exit 1 > -esacACK. I pushed this with a couple of minor modifications. Thanks for fixing this hopefully once and for all :-) Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones libguestfs lets you edit virtual machines. Supports shell scripting, bindings from many languages. http://libguestfs.org
Reasonably Related Threads
- [PATCH v2 supermin 0/1] Fix embedding of init
- [PATCH v2 supermin 1/1] Switch binary embedding to a C source
- [PATCH supermin] bin2s: make sure the data is aligned
- [PATCH supermin 0/2] Allow an alternate libc to be used for init.
- [PATCH] init: Use .rodata instead of .data.