>From ab715a8321f96f9b1115011d5a40e70ac52d672c Mon Sep 17 00:00:00 2001 From: Richard Jones Date: Tue, 28 Jul 2009 17:55:35 +0100 Subject: [PATCH] Lib.pm: Add file_architecture command. This command detects the architecture of some types of binaries, libraries, kernel modules and initrd images. --- .gitignore | 6 ++- images/Makefile.am | 44 +++++++++++- images/README-binfiles | 13 ++++ images/bin-i586-dynamic | Bin 0 -> 4616 bytes images/bin-sparc-dynamic | Bin 0 -> 5060 bytes images/bin-win32.exe | Bin 0 -> 21617 bytes images/bin-win64.exe | Bin 0 -> 44557 bytes images/bin-x86_64-dynamic | Bin 0 -> 6484 bytes images/lib-i586.so | Bin 0 -> 3834 bytes images/lib-sparc.so | Bin 0 -> 4536 bytes images/lib-win32.dll | Bin 0 -> 16402 bytes images/lib-win64.dll | Bin 0 -> 34777 bytes images/lib-x86_64.so | Bin 0 -> 5467 bytes perl/lib/Sys/Guestfs/Lib.pm | 161 ++++++++++++++++++++++++++++++++++++++++++- perl/t/500-lib-load.t | 26 +++++++ perl/t/510-lib-file-arch.t | 62 +++++++++++++++++ 16 files changed, 306 insertions(+), 6 deletions(-) create mode 100644 images/README-binfiles create mode 100755 images/bin-i586-dynamic create mode 100755 images/bin-sparc-dynamic create mode 100755 images/bin-win32.exe create mode 100755 images/bin-win64.exe create mode 100755 images/bin-x86_64-dynamic create mode 100755 images/lib-i586.so create mode 100755 images/lib-sparc.so create mode 100755 images/lib-win32.dll create mode 100755 images/lib-win64.dll create mode 100755 images/lib-x86_64.so create mode 100644 perl/t/500-lib-load.t create mode 100644 perl/t/510-lib-file-arch.t diff --git a/.gitignore b/.gitignore index d66ed99..f2064a3 100644 --- a/.gitignore +++ b/.gitignore @@ -81,6 +81,8 @@ images/100kallzeroes images/100krandom images/10klines images/initrd +images/initrd-x86_64.img +images/initrd-x86_64.img.gz images/test.sqsh initramfs initramfs.timestamp @@ -123,6 +125,7 @@ missing *.o ocaml/bindtests ocaml/bindtests.ml +ocaml/dllmlguestfs.so ocaml/examples/lvs ocaml/guestfs_c_actions.c ocaml/guestfs.ml @@ -156,9 +159,9 @@ python/guestfs.pyc ruby/bindtests.rb ruby/ext/guestfs/extconf.h ruby/ext/guestfs/_guestfs.c +ruby/ext/guestfs/_guestfs.so ruby/ext/guestfs/mkmf.log ruby/Rakefile -*.so src/guestfs-actions.c src/guestfs-actions.h src/guestfs-bindtests.c @@ -166,6 +169,7 @@ src/guestfs_protocol.c src/guestfs_protocol.h src/guestfs_protocol.x src/guestfs-structs.h +src/.libs/libguestfs.so src/.pod2text.data src/stamp-generator stamp-h1 diff --git a/images/Makefile.am b/images/Makefile.am index 56a22fd..0ff91f6 100644 --- a/images/Makefile.am +++ b/images/Makefile.am @@ -22,7 +22,18 @@ EXTRA_DIST = \ helloworld.tar \ helloworld.tar.gz \ mbr-ext2-empty.img.gz \ - empty known-1 known-2 known-3 + empty known-1 known-2 known-3 \ + bin-i586-dynamic \ + bin-sparc-dynamic \ + bin-win32.exe \ + bin-win64.exe \ + bin-x86_64-dynamic \ + lib-i586.so \ + lib-sparc.so \ + lib-win32.dll \ + lib-win64.dll \ + lib-x86_64.so + noinst_DATA = test.sqsh @@ -37,7 +48,17 @@ squash_files_src = \ $(srcdir)/empty \ $(srcdir)/known-1 \ $(srcdir)/known-2 \ - $(srcdir)/known-3 + $(srcdir)/known-3 \ + $(srcdir)/bin-i586-dynamic \ + $(srcdir)/bin-sparc-dynamic \ + $(srcdir)/bin-win32.exe \ + $(srcdir)/bin-win64.exe \ + $(srcdir)/bin-x86_64-dynamic \ + $(srcdir)/lib-i586.so \ + $(srcdir)/lib-sparc.so \ + $(srcdir)/lib-win32.dll \ + $(srcdir)/lib-win64.dll \ + $(srcdir)/lib-x86_64.so squash_files_build = \ $(builddir)/100kallzeroes \ @@ -45,7 +66,9 @@ squash_files_build = \ $(builddir)/100kallspaces \ $(builddir)/100krandom \ $(builddir)/10klines \ - $(builddir)/initrd + $(builddir)/initrd \ + $(builddir)/initrd-x86_64.img \ + $(builddir)/initrd-x86_64.img.gz squash_files = $(squash_files_src) $(squash_files_build) @@ -86,3 +109,18 @@ $(builddir)/initrd: empty known-1 known-2 known-3 rm -f $@ $@-t for f in $^; do echo $$f; done | cpio -o -H newc | gzip --best > $@-t mv $@-t $@ + +# Create a dummy initrd with a single file called 'bin/nash' which +# is used to test the file-arch command. +$(builddir)/initrd-x86_64.img: bin-x86_64-dynamic + rm -rf bin $@ $@-t + mkdir bin + cp $< bin/nash + echo bin/nash | cpio -o -H newc > $@-t + mv $@-t $@ + rm -rf bin $@-t + +$(builddir)/initrd-x86_64.img.gz: initrd-x86_64.img + rm -f $@ $@-t + gzip --best -c $< > $@-t + mv $@-t $@ diff --git a/images/README-binfiles b/images/README-binfiles new file mode 100644 index 0000000..f99fc84 --- /dev/null +++ b/images/README-binfiles @@ -0,0 +1,13 @@ +The bin-* and lib-* files are used for testing the +Sys::Guestfs::Lib::file_architecture API. + +The bin-* files are generated from empty source files (ie. +"main(){}") on the respective architectures. + +The lib-* files are generated from a (really) empty source file called +lib.c which is linked into a library using gcc -shared on the +respective architectures. + +If you are concerned that these binary files "lack source" then you +can just remove them, but you may need to patch out tests in the perl/ +directory. diff --git a/images/bin-i586-dynamic b/images/bin-i586-dynamic new file mode 100755 index 0000000000000000000000000000000000000000..4f770633b47386ce8ab5a99eb6e35d1ae57b9de1 GIT binary patch literal 4616 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 E4Rlo`%K!iX literal 0 HcmV?d00001 diff --git a/images/bin-sparc-dynamic b/images/bin-sparc-dynamic new file mode 100755 index 0000000000000000000000000000000000000000..138839af7840cc549a02937310df21c799984b7c GIT binary patch literal 5060 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 literal 0 HcmV?d00001 diff --git a/images/bin-win64.exe b/images/bin-win64.exe new file mode 100755 index 0000000000000000000000000000000000000000..98bddc028a5f0f95d155a970813d489265a624a3 GIT binary patch literal 44557 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 literal 0 HcmV?d00001 diff --git a/images/lib-sparc.so b/images/lib-sparc.so new file mode 100755 index 0000000000000000000000000000000000000000..7feec75eb2222139e80c33095d8061bdedc6546b GIT binary patch literal 4536 zcmdT{U2IfE6rQ{7Z3`5vfPhNkN*YrlTo)(=i3ztXOKB-Bl#-w^xxMW!?VA0;-CJyl zk>y7pG{(gEA9}o&1|NF#XwM^CJSy!*`000)--fD|vJk;$NuyD7OktHrS&HOIdej#}V_BDF%Y4Jr!l;clTI+<9h`XMPI(_-P9}PvBxM=NY+Z1(HTdS-!Y_mck z|8cC=Y@87cMc@zy$smNomv^SNgaxYCcu^W$0h}I&xvul$5>#`bl3m z&p|(}^as+%+udRpAeZEia5|m5*(AVR2qgAEF?_4}l zd`t-YV7YvA)Vz3<3+He{?~*aIWE6_MB2*C72Fh$razB8F^vpv=RHMC!iw(G~y_85B2_UGH;5!I)rN}p_DsW~s3) z4UAvTiSA>d4Ot$HAF$oh{@u^d`8fKwP|i>F#+!xW!E(qJbw%jx3*{J2F_zEoD&J&3 z{;mBx$q&}$b23g~os~fdEwrSrh_2j^T=P6T=JL$QmM5=4zYaFB3UTK1Y&0;7Vm3Gp zo&)9{uEIW|9oZMyD}sBd7Q7fHjEs7y0LgRoZ7|QJ`fRy8iSk}Z_RE000^AOH1DL*d zM*L>{M}##LiJU0^$pk@v0=nGK#G*AC-4JfV=VW=f*=n{T;nk7I-ps?S1td4I$QaXwCDB-EAQoeIjFTv)=O9enIWrhD4B|{OvZ&ogKmCMSn-hzYWmX4 z`Ih~OTt1o2Oal&VxkSok1*PpvdBTz(CCf_;LzkZ>D>3No&AI7>u=>4hE|1W@c%~mA z_$6W-E0>jRy6I#;+R36ezD}r;O{WtX?=F|fgYf4X=9)gEn0rGL*EPw)di@KMe%veM zW-yN*68*^Q!Q3zK;~tXx=$Nw6mpS0SXK@r*$D|Y|?)31^n=3H^G&*pjPw`1AY_m16OQ8zvBSN zo$MdZH+jaDfOUJ6?C)1#H4ff0j&aB zpxj`tH0gL62PM}6D{G(Y3afVIo}^vHmwS&ujhXvQ8u2|Og?jl9JLd_+eIqf?4QjF; z>?(h9573`upuHgf{qHGMv!pQ336Na7^skptu2UHw-)E3vj#I!sj}rJY1@JwTz!Ma} z%p36)3SiC&@U(XcG1i5&a~}iCIi>$XiPax4@4`BVNRE7$)FVFjku

4*-uV%>Ln? z?)MKB*}t`DsYpAL&-=tS)t&)6+j|OF&bz{cn1%w%wf_;|VgSE}d=Y9ps`;e)S48`A zd@!(oAM5-AGrwQV=pWX%X)}WA-!H&LK#k?vAy)Axbv}&{^IUKKXcJ=VZ=xm;b+M@weJnIakvVCsK zk>6*>9U2z+`tD05yhPkuyKc>TL4%Ww4+AwvM8BI#IgWF?dh&bk#D~)95#KFXp!yW+ z+$_7arMqQ&%+ZKl()v_nd2#T2G_%nu6CSu6acf7{rj`z;Ys;2hu^y+VWm89tBai2^ z&Y+u#r|>%V)1aE!(cKk|ZQk7-LzX(XwY0`6bv8fQ*|NPY3jgWv?%O=B^(%bFi@NgC P4!+K9JNVG{U-AC{m?pQ; literal 0 HcmV?d00001 diff --git a/images/lib-win32.dll b/images/lib-win32.dll new file mode 100755 index 0000000000000000000000000000000000000000..e1a2d2e6d30ec35ae4ada8fe0473ed603ca99e2f GIT binary patch literal 16402 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 StOFUr<4dVbQ|%II#s2_!9zG}l literal 0 HcmV?d00001 diff --git a/images/lib-win64.dll b/images/lib-win64.dll new file mode 100755 index 0000000000000000000000000000000000000000..ca94485c04b7663aef4b64976ca34609a1b790f0 GIT binary patch literal 34777 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 literal 0 HcmV?d00001 diff --git a/images/lib-x86_64.so b/images/lib-x86_64.so new file mode 100755 index 0000000000000000000000000000000000000000..8cee4d202fc167f5cb2809048577b7c130dd0567 GIT binary patch literal 5467 zcmdT|U5pe(5U#ytVO3-i0TD4wKoih7ZV>P^LHAe=2DAJKcLsxInA_ds*6fe&%#p(w zB{@hGa)}y$9(>UFqS2V}pb3%~fA9}|xkOF;&ly5;iiz@|;tOk4Pk+Zu?_M+}KG>U` z>iVjxtGc_or>7t3Eo|&cBnTx*w~^vzgh);cK2Ae}C`a9t;^$(zLg}V1h}vpPv=EfY zQaa*eCjTuhw^AVvI;lfCrzz~ZwB2@Xw_V$T9?<%r2wS=%|6N*c(rZ{I1yppU+<7`E zNu2+*ME%WYqa^<~ZSAN0@sr2it{p0#uRTy$_{`z&zj7{W6E)X-kr=K9+_fMcTI_JgV1EgD+ux z8I&UQ9tH~-#!gKm+^TW;#{ck*_77v%WPO&cWQyTbmdU+ipSz>Hx8euoX1?nAe%YsLWuR#L4SOxQ<&qb8Y%}2d zVQUQ4OSGx5d41kpWv{Z=z$H-^&kKGbD%|Z{mH4F$FRt(ub&(gcizZ)@R>o3iIK2vE*M7^yIkMml)+wxKjY z?EeuKoa||x$}FXmC&GyPS#PKAR8C?UJ=Y4ZbjGf}i5b>&M$e?Vk4KUs7(OeV-7U6i z{4#1lc+`|@^i_muepQ{oDCgL!blN5NZFiP7=u%DaW+@ z;*h19rk7~CNYkXIlRAHNGX%NpNm3+#q+AgaI;stUZ`VBXc#qbT{YVPhJKqZ9&uV=h zAJrd>!>^iOsO5he^02l4{)zX4>FIYJ7j4StZ?#tNR=v_%ZLhYo)~amwmh77BT5H9Q za>;VMAjEH2y^?qI|Dm$&@2>^k0NH-f4CxSR^+r&(_tuB)f#FKEbVH>?iW~C$A+k&R z>ued)pczW`m79L0QI9b$%bMk?CkDE9e>EUmZPa#99^ty$uI=)WJJ|GUWwMJwqv>w!6;|B}Co?IicHUZy)Ap!w+D zE11py-#NEokM#`NtqqZGSXUb66BUuHW!PiAgZ`=&#johV9_uj2n6wRh>>r@mFIYtt ztWWR`S7hzN9_tkp`v&5N9%w(?%U%E;`vIt>9ZCG+8}VzHN?bwT1jGIVx<^1R@DF?R zzs|C#{ZXw53O#{k4>j#a7?ZfL-{SlP3VT*jMSMkz&rH;QLi-1`qRL!{J-A@tnD#>i}Z^K)YLcmr?frh$4XhMX`JuPcrpG;i677L zU%CkUthUeUIR4K5MZ-R)?Q`1R^k?!f8TNReJO9xBb+(t>LHu~%;5+4joVdzK+3Wa^_%W_>uIc3e+~uKt(Qs(6 zq0%(ZBu9()NmM1t5hE|+cyj8z7sqE1_VYNNBJ9&~d?sZ(bSlYjI_#@){q)p1Fpjr> zPl`OrJLyEn_W4bQM2|F-!kEV= z6y84X&nvt={#Ui%al`MsjCUHhkEEThvn_MJzEgO6KK!Kc40RiE{-N7x%M%_bi)CiX zOoK0Hd|rqAU&;6~vk~Td8JBw&Gq3K{xOx9_*EIU~GT!N)g^FIa8o5%TVl(iA;lV+> z$af?8zHK|)!seZQa?|2&h;eu1Bcf8n-CJ!8cvV-O;azWdg!o{7f3+NxOZM7T-D^k$ zZlyFL+|8s8{%&cwR@)Chy<0aZHyd~KZ0U8ui5t`}cu^k=$_wA function lets you get the architecture for a +particular binary or library in the guest. By "architecture" we mean +what processor it is compiled for (eg. C or C). + +The function works on at least the following types of files: + +=over 4 + +=item * + +many types of Un*x binary + +=item * + +many types of Un*x shared library + +=item * + +Windows Win32 and Win64 binaries + +=item * + +Windows Win32 and Win64 DLLs + +Win32 binaries and DLLs return C. + +Win64 binaries and DLLs return C. + +=item * + +Linux kernel modules + +=item * + +Linux new-style initrd images + +=item * + +some non-x86 Linux vmlinuz kernels + +=back + +What it can't do currently: + +=over 4 + +=item * + +static libraries (libfoo.a) + +=item * + +Linux old-style initrd as compressed ext2 filesystem (RHEL 3) + +=item * + +x86 Linux vmlinuz kernels + +x86 vmlinuz images (bzImage format) consist of a mix of 16-, 32- and +compressed code, and are horribly hard to unpack. If you want to find +the architecture of a kernel, use the architecture of the associated +initrd or kernel module(s) instead. + +=back + +=cut + +sub _elf_arch_to_canonical +{ + local $_ = shift; + + if ($_ eq "Intel 80386") { + return "i386"; + } elsif ($_ eq "Intel 80486") { + return "i486"; # probably not in the wild + } elsif ($_ eq "x86-64") { + return "x86_64"; + } elsif (/SPARC32/) { + return "sparc"; + } elsif (/SPARC V9/) { + return "sparc64"; + } elsif ($_ eq "IA-64") { + return "ia64"; + } elsif (/64.*PowerPC/) { + return "ppc64"; + } elsif (/PowerPC/) { + return "ppc"; + } else { + warn __x("returning non-canonical architecture type '{arch}'", + arch => $_); + return $_; + } +} + +my @_initrd_binaries = ("nash", "modprobe", "sh", "bash"); + +sub file_architecture +{ + local $_; + my $g = shift; + my $path = shift; + + # Our basic tool is 'file' ... + my $file = $g->file ($path); + + if ($file =~ /ELF.*(?:executable|shared object), (.+?),/) { + # ELF executable or shared object. We need to convert + # what file(1) prints into the canonical form. + return _elf_arch_to_canonical ($1); + } elsif ($file =~ /PE32 executable/) { + return "i386"; # Win32 executable or DLL + } elsif ($file =~ /PE32\+ executable/) { + return "x86_64"; # Win64 executable or DLL + } + + elsif ($file =~ /cpio archive/) { + # Probably an initrd. + my $zcat = "cat"; + if ($file =~ /gzip/) { + $zcat = "zcat"; + } elsif ($file =~ /bzip2/) { + $zcat = "bzcat"; + } + + # Download and unpack it to find a binary file. + my $dir = tempdir (CLEANUP => 1); + $g->download ($path, "$dir/initrd"); + + my $bins = join " ", map { "bin/$_" } @_initrd_binaries; + my $cmd = "cd $dir && $zcat initrd | cpio -id $bins"; + my $r = system ($cmd); + die __x("cpio command failed: {error}", error => $?) + unless $r == 0; + + foreach my $bin (@_initrd_binaries) { + if (-f "$dir/bin/$bin") { + open PIPE, "file $dir/bin/$bin |"; + local $/ = undef; + $_ = ; + if (/ELF.*executable, (.+?),/) { + return _elf_arch_to_canonical ($1); + } + } + } + + die __x("file_architecture: no known binaries found in initrd image: {path}", + path => $path); + } + + die __x("file_architecture: unknown architecture: {path}", + path => $path); +} + =head1 OPERATING SYSTEM INSPECTION FUNCTIONS The functions in this section can be used to inspect the operating @@ -1093,8 +1250,8 @@ sub mount_operating_system $g->umount_all (); The C function inspects the mounted operating -system for installed applications, installed kernels, kernel modules -and more. +system for installed applications, installed kernels, kernel modules, +system architecture, and more. It adds extra keys to the existing C<%os> hash reflecting what it finds. These extra keys are: diff --git a/perl/t/500-lib-load.t b/perl/t/500-lib-load.t new file mode 100644 index 0000000..1407169 --- /dev/null +++ b/perl/t/500-lib-load.t @@ -0,0 +1,26 @@ +# libguestfs Perl bindings -*- perl -*- +# Copyright (C) 2009 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. + +use strict; +use warnings; +use Test::More tests => 1; + +use Sys::Guestfs; +use Sys::Guestfs::Lib; + +# Just check Lib can be loaded. +ok (1); diff --git a/perl/t/510-lib-file-arch.t b/perl/t/510-lib-file-arch.t new file mode 100644 index 0000000..14392e8 --- /dev/null +++ b/perl/t/510-lib-file-arch.t @@ -0,0 +1,62 @@ +# libguestfs Perl bindings -*- perl -*- +# Copyright (C) 2009 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. + +use strict; +use warnings; +use Test::More tests => 17; + +use Sys::Guestfs; +use Sys::Guestfs::Lib; + +my $h = Sys::Guestfs->new (); +ok ($h); + +$h->add_drive_ro ("../images/test.sqsh"); +ok (1); + +$h->launch (); +ok (1); +$h->wait_ready (); +ok (1); + +$h->mount_vfs ("ro", "squashfs", "/dev/sda", "/"); +ok (1); + +is (Sys::Guestfs::Lib::file_architecture ($h, "/bin-i586-dynamic"), + "i386"); +is (Sys::Guestfs::Lib::file_architecture ($h, "/bin-sparc-dynamic"), + "sparc"); +is (Sys::Guestfs::Lib::file_architecture ($h, "/bin-win32.exe"), + "i386"); +is (Sys::Guestfs::Lib::file_architecture ($h, "/bin-win64.exe"), + "x86_64"); +is (Sys::Guestfs::Lib::file_architecture ($h, "/bin-x86_64-dynamic"), + "x86_64"); +is (Sys::Guestfs::Lib::file_architecture ($h, "/lib-i586.so"), + "i386"); +is (Sys::Guestfs::Lib::file_architecture ($h, "/lib-sparc.so"), + "sparc"); +is (Sys::Guestfs::Lib::file_architecture ($h, "/lib-win32.dll"), + "i386"); +is (Sys::Guestfs::Lib::file_architecture ($h, "/lib-win64.dll"), + "x86_64"); +is (Sys::Guestfs::Lib::file_architecture ($h, "/lib-x86_64.so"), + "x86_64"); +is (Sys::Guestfs::Lib::file_architecture ($h, "/initrd-x86_64.img"), + "x86_64"); +is (Sys::Guestfs::Lib::file_architecture ($h, "/initrd-x86_64.img.gz"), + "x86_64"); -- 1.6.2.5