Allow objdump to recognise the System.Runtime.dll files that get shipped with .NET...
authorOmar Majid <omajid@redhat.com>
Tue, 23 Jul 2019 08:44:57 +0000 (09:44 +0100)
committerNick Clifton <nickc@redhat.com>
Tue, 23 Jul 2019 08:44:57 +0000 (09:44 +0100)
include * coff/i386.h (IMAGE_FILE_MACHINE_NATIVE_APPLE_OVERRIDE): Define.
(IMAGE_FILE_MACHINE_NATIVE_FREEBSD_OVERRIDE): Define.
(IMAGE_FILE_MACHINE_NATIVE_LINUX_OVERRIDE): Define.
(IMAGE_FILE_MACHINE_NATIVE_NETBSD_OVERRIDE): Define.
(I386_APPLE_MAGIC): Define.
(I386_FREEBSD_MAGIC): Define.
(I386_LINUX_MAGIC): Define.
(I386_NETBSD_MAGIC): Define.
(I386BADMAG): Extend macro to allow new magic numbers.
* coff/x86_64.h (IMAGE_FILE_MACHINE_NATIVE_APPLE_OVERRIDE): Define.
(IMAGE_FILE_MACHINE_NATIVE_FREEBSD_OVERRIDE): Define.
(IMAGE_FILE_MACHINE_NATIVE_LINUX_OVERRIDE): Define.
(IMAGE_FILE_MACHINE_NATIVE_NETBSD_OVERRIDE): Define.
(AMD64_APPLE_MAGIC): Define.
(AMD64_FREEBSD_MAGIC): Define.
(AMD64_LINUX_MAGIC): Define.
(AMD64_NETBSD_MAGIC): Define.
(AMD64BADMAG): Extend macro to allow new magic numbers.

bfd * coffcode.h (coff_set_arch_mach_hook): Handle I386_APPLE_MAGIC,
I386_FREEBSD_MAGIC, I386_LINUX_MAGIC, I386_NETBSD_MAGIC,
AMD64_APPLE_MAGIC, AMD64_FREEBSD_MAGIC, AMD64_LINUX_MAGIC,
AMD64_NETBSD_MAGIC.
* peXXigen.c: Add comment about source of .NET magic numbers.

binutils* Makefile.am (AUTOMAKE_OPTIONS): Add subdir-objects
(GENTESTDLLSPROG): Define.
(TEST_PROGS): Add GENTESTDLLSPROG.
* Makefile.in: Regenerate.
* testsuite/binutils-all/objdump.exp
(test_objdump_dotnet_assemblies): New proc.
Run the new proc.
* testsuite/gentestdlls.c: New source file.

bfd/ChangeLog
bfd/coffcode.h
bfd/peXXigen.c
binutils/ChangeLog
binutils/Makefile.am
binutils/Makefile.in
binutils/testsuite/binutils-all/objdump.exp
binutils/testsuite/gentestdlls.c [new file with mode: 0644]
include/ChangeLog
include/coff/i386.h
include/coff/x86_64.h

index 62e4beb66ed6ae47084ad6e0f5fd8e106be7abb0..2beeb3dfe190279d8b8f9be2ec9a12f6c04792a0 100644 (file)
@@ -1,3 +1,11 @@
+2019-07-23  Omar Majid  <omajid@redhat.com>
+
+       * coffcode.h (coff_set_arch_mach_hook): Handle I386_APPLE_MAGIC,
+       I386_FREEBSD_MAGIC, I386_LINUX_MAGIC, I386_NETBSD_MAGIC,
+       AMD64_APPLE_MAGIC, AMD64_FREEBSD_MAGIC, AMD64_LINUX_MAGIC,
+       AMD64_NETBSD_MAGIC.
+       * peXXigen.c: Add comment about source of .NET magic numbers.
+
 2019-07-19  Alan Modra  <amodra@gmail.com>
 
        * reloc.c (BFD_RELOC_PPC64_TPREL34, BFD_RELOC_PPC64_DTPREL34),
index c67bfbb0e6da0494b62abcd4f0baa6d6508aedd2..c3f13300a43c97dd357fc434506b983f958e9c2d 100644 (file)
@@ -2107,11 +2107,19 @@ coff_set_arch_mach_hook (bfd *abfd, void * filehdr)
     case I386PTXMAGIC:
     case I386AIXMAGIC:         /* Danbury PS/2 AIX C Compiler.  */
     case LYNXCOFFMAGIC:
+    case I386_APPLE_MAGIC:
+    case I386_FREEBSD_MAGIC:
+    case I386_LINUX_MAGIC:
+    case I386_NETBSD_MAGIC:
       arch = bfd_arch_i386;
       break;
 #endif
 #ifdef AMD64MAGIC
     case AMD64MAGIC:
+    case AMD64_APPLE_MAGIC:
+    case AMD64_FREEBSD_MAGIC:
+    case AMD64_LINUX_MAGIC:
+    case AMD64_NETBSD_MAGIC:
       arch = bfd_arch_i386;
       machine = bfd_mach_x86_64;
       break;
index 77fb4933e73e61d466ade551be8f6d79b509cbe7..ee6da6480d83f8928a8b5e42581073667df46e5d 100644 (file)
    "Peering Inside the PE: A Tour of the Win32 Portable Executable
    File Format", MSJ 1994, Volume 9.
 
+   The PE/PEI format is also used by .NET. ECMA-335 describes this:
+
+   "Standard ECMA-335 Common Language Infrastructure (CLI)", 6th Edition, June 2012.
+
+   This is also available at
+   https://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf.
+
    The *sole* difference between the pe format and the pei format is that the
    latter has an MSDOS 2.0 .exe header on the front that prints the message
    "This app must be run under Windows." (or some such).
index d7231713e7a4d6d23e20e0710048f31abeecfe13..5238b4702646a3cb7f5f32fc399e32334b1c89b6 100644 (file)
@@ -1,3 +1,14 @@
+2019-07-23  Omar Majid  <omajid@redhat.com>
+
+       * Makefile.am (AUTOMAKE_OPTIONS): Add subdir-objects
+       (GENTESTDLLSPROG): Define.
+       (TEST_PROGS): Add GENTESTDLLSPROG.
+       * Makefile.in: Regenerate.
+       * testsuite/binutils-all/objdump.exp
+       (test_objdump_dotnet_assemblies): New proc.
+       Run the new proc.
+       * testsuite/gentestdlls.c: New source file.
+
 2019-06-28  Nick Clifton  <nickc@redhat.com>
 
        PR 24707
index 128494ca9eef9523c5a67b830fde2abb856c4315..de93ffa0400758bbb5911b1f2496bd210065ca2b 100644 (file)
@@ -17,7 +17,7 @@
 # <http://www.gnu.org/licenses/>.
 #
 
-AUTOMAKE_OPTIONS = dejagnu no-dist foreign
+AUTOMAKE_OPTIONS = dejagnu no-dist foreign subdir-objects
 ACLOCAL_AMFLAGS = -I .. -I ../config -I ../bfd
 
 SUBDIRS = doc po
@@ -93,8 +93,9 @@ EXTRA_SCRIPTS = embedspu
 ## Test programs.
 BFDTEST1_PROG = bfdtest1
 BFDTEST2_PROG = bfdtest2
+GENTESTDLLS_PROG = testsuite/gentestdlls
 
-TEST_PROGS = $(BFDTEST1_PROG) $(BFDTEST2_PROG)
+TEST_PROGS = $(BFDTEST1_PROG) $(BFDTEST2_PROG) $(GENTESTDLLS_PROG)
 
 ## We need a special rule to install the programs which are built with
 ## -new, and to rename cxxfilt to c++filt.
index 13b3b1993218fc37e16bccdecbd1e44babf2728c..16c078fdd32c1f9967cdb2dac15314e0219b866b 100644 (file)
@@ -113,7 +113,7 @@ bin_PROGRAMS = $(am__EXEEXT_5) $(am__EXEEXT_6) $(am__EXEEXT_7) \
        @BUILD_SRCONV@ @BUILD_DLLTOOL@ @BUILD_WINDRES@ @BUILD_WINDMC@ \
        $(am__EXEEXT_11) $(am__EXEEXT_12) $(am__EXEEXT_13) \
        @BUILD_DLLWRAP@ $(am__empty)
-noinst_PROGRAMS = $(am__EXEEXT_17) $(am__EXEEXT_20) @BUILD_MISC@
+noinst_PROGRAMS = $(am__EXEEXT_17) $(am__EXEEXT_21) @BUILD_MISC@
 EXTRA_PROGRAMS = srconv$(EXEEXT) sysdump$(EXEEXT) coffdump$(EXEEXT) \
        $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
        $(am__EXEEXT_4)
@@ -169,7 +169,8 @@ am__EXEEXT_16 = cxxfilt$(EXEEXT)
 am__EXEEXT_17 = $(am__EXEEXT_14) $(am__EXEEXT_15) $(am__EXEEXT_16)
 am__EXEEXT_18 = bfdtest1$(EXEEXT)
 am__EXEEXT_19 = bfdtest2$(EXEEXT)
-am__EXEEXT_20 = $(am__EXEEXT_18) $(am__EXEEXT_19)
+am__EXEEXT_20 = testsuite/gentestdlls$(EXEEXT)
+am__EXEEXT_21 = $(am__EXEEXT_18) $(am__EXEEXT_19) $(am__EXEEXT_20)
 PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
 am__objects_1 = bucomm.$(OBJEXT) version.$(OBJEXT) filemode.$(OBJEXT)
 am_addr2line_OBJECTS = addr2line.$(OBJEXT) $(am__objects_1)
@@ -243,6 +244,12 @@ strip_new_LDADD = $(LDADD)
 am_sysdump_OBJECTS = sysdump.$(OBJEXT) $(am__objects_1)
 sysdump_OBJECTS = $(am_sysdump_OBJECTS)
 sysdump_LDADD = $(LDADD)
+testsuite_gentestdlls_SOURCES = testsuite/gentestdlls.c
+am__dirstamp = $(am__leading_dot)dirstamp
+testsuite_gentestdlls_OBJECTS = testsuite/gentestdlls.$(OBJEXT)
+testsuite_gentestdlls_LDADD = $(LDADD)
+testsuite_gentestdlls_DEPENDENCIES = $(BFDLIB) $(LIBIBERTY) \
+       $(am__DEPENDENCIES_1)
 am_windmc_OBJECTS = windmc.$(OBJEXT) mcparse.$(OBJEXT) mclex.$(OBJEXT) \
        winduni.$(OBJEXT) $(am__objects_1)
 windmc_OBJECTS = $(am_windmc_OBJECTS)
@@ -338,8 +345,8 @@ SOURCES = $(addr2line_SOURCES) $(ar_SOURCES) $(EXTRA_ar_SOURCES) \
        $(nm_new_SOURCES) $(objcopy_SOURCES) $(objdump_SOURCES) \
        $(EXTRA_objdump_SOURCES) $(ranlib_SOURCES) $(readelf_SOURCES) \
        $(size_SOURCES) $(srconv_SOURCES) $(strings_SOURCES) \
-       $(strip_new_SOURCES) $(sysdump_SOURCES) $(windmc_SOURCES) \
-       $(windres_SOURCES)
+       $(strip_new_SOURCES) $(sysdump_SOURCES) \
+       testsuite/gentestdlls.c $(windmc_SOURCES) $(windres_SOURCES)
 RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
        ctags-recursive dvi-recursive html-recursive info-recursive \
        install-data-recursive install-dvi-recursive \
@@ -548,7 +555,7 @@ top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 zlibdir = @zlibdir@
 zlibinc = @zlibinc@
-AUTOMAKE_OPTIONS = dejagnu no-dist foreign
+AUTOMAKE_OPTIONS = dejagnu no-dist foreign subdir-objects
 ACLOCAL_AMFLAGS = -I .. -I ../config -I ../bfd
 SUBDIRS = doc po
 tooldir = $(exec_prefix)/$(target_alias)
@@ -595,7 +602,8 @@ bin_SCRIPTS = @BUILD_INSTALL_MISC@
 EXTRA_SCRIPTS = embedspu
 BFDTEST1_PROG = bfdtest1
 BFDTEST2_PROG = bfdtest2
-TEST_PROGS = $(BFDTEST1_PROG) $(BFDTEST2_PROG)
+GENTESTDLLS_PROG = testsuite/gentestdlls
+TEST_PROGS = $(BFDTEST1_PROG) $(BFDTEST2_PROG) $(GENTESTDLLS_PROG)
 RENAMED_PROGS = $(NM_PROG) $(STRIP_PROG) $(DEMANGLER_PROG)
 
 # Stuff that goes in tooldir/ if appropriate.
@@ -940,6 +948,18 @@ strip-new$(EXEEXT): $(strip_new_OBJECTS) $(strip_new_DEPENDENCIES) $(EXTRA_strip
 sysdump$(EXEEXT): $(sysdump_OBJECTS) $(sysdump_DEPENDENCIES) $(EXTRA_sysdump_DEPENDENCIES) 
        @rm -f sysdump$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(sysdump_OBJECTS) $(sysdump_LDADD) $(LIBS)
+testsuite/$(am__dirstamp):
+       @$(MKDIR_P) testsuite
+       @: > testsuite/$(am__dirstamp)
+testsuite/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) testsuite/$(DEPDIR)
+       @: > testsuite/$(DEPDIR)/$(am__dirstamp)
+testsuite/gentestdlls.$(OBJEXT): testsuite/$(am__dirstamp) \
+       testsuite/$(DEPDIR)/$(am__dirstamp)
+
+testsuite/gentestdlls$(EXEEXT): $(testsuite_gentestdlls_OBJECTS) $(testsuite_gentestdlls_DEPENDENCIES) $(EXTRA_testsuite_gentestdlls_DEPENDENCIES) testsuite/$(am__dirstamp)
+       @rm -f testsuite/gentestdlls$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(testsuite_gentestdlls_OBJECTS) $(testsuite_gentestdlls_LDADD) $(LIBS)
 mcparse.h: mcparse.c
        @if test ! -f $@; then rm -f mcparse.c; else :; fi
        @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) mcparse.c; else :; fi
@@ -992,6 +1012,7 @@ uninstall-binSCRIPTS:
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
+       -rm -f testsuite/*.$(OBJEXT)
 
 distclean-compile:
        -rm -f *.tab.c
@@ -1057,24 +1078,28 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/windres.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/winduni.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrstabs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@testsuite/$(DEPDIR)/gentestdlls.Po@am__quote@
 
 .c.o:
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_TRUE@   $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
 
 .c.obj:
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_TRUE@   $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .c.lo:
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@am__fastdepCC_TRUE@   $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@   $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
@@ -1090,6 +1115,7 @@ mostlyclean-libtool:
 
 clean-libtool:
        -rm -rf .libs _libs
+       -rm -rf testsuite/.libs testsuite/_libs
 
 distclean-libtool:
        -rm -f libtool config.lt
@@ -1269,6 +1295,8 @@ clean-generic:
 distclean-generic:
        -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
        -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+       -rm -f testsuite/$(DEPDIR)/$(am__dirstamp)
+       -rm -f testsuite/$(am__dirstamp)
        -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -1292,7 +1320,7 @@ clean-am: clean-binPROGRAMS clean-generic clean-libtool \
 
 distclean: distclean-recursive
        -rm -f $(am__CONFIG_DISTCLEAN_FILES)
-       -rm -rf ./$(DEPDIR)
+       -rm -rf ./$(DEPDIR) testsuite/$(DEPDIR)
        -rm -f Makefile
 distclean-am: clean-am distclean-DEJAGNU distclean-compile \
        distclean-generic distclean-hdr distclean-libtool \
@@ -1342,7 +1370,7 @@ installcheck-am: installcheck-local
 maintainer-clean: maintainer-clean-recursive
        -rm -f $(am__CONFIG_DISTCLEAN_FILES)
        -rm -rf $(top_srcdir)/autom4te.cache
-       -rm -rf ./$(DEPDIR)
+       -rm -rf ./$(DEPDIR) testsuite/$(DEPDIR)
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
index beaf44f954e27928451c04433710000696496e3c..b46fd0a8bb44d2616aa35852d88e18991a8f1fe3 100644 (file)
@@ -732,6 +732,49 @@ if {[is_elf_format]} then {
     remote_file host delete $testfile3
 }
 
+# Test objdump on .NET assemblies (PE files)
+
+proc test_objdump_dotnet_assemblies {} {
+    global OBJDUMP
+    global base_dir
+
+    set test "dotnet-assemblies"
+
+    set got [binutils_run "$base_dir/testsuite/gentestdlls" "tmpdir"]
+    set want "wrote dotnet-linux-x86-64.dll"
+    if ![regexp $want $got] then {
+       unsupported "$test"
+    }
+
+    set test "dotnet-assemblies (32-bit)"
+    set want "file format pei-i386"
+    set got [binutils_run $OBJDUMP "-x tmpdir/simple-i386.dll"]
+    if ![regexp $want $got] then {
+       if [regexp "file format not recognized" $got] then {
+           unsupported $test
+       } else {
+           fail "$test"
+       }
+    } else {
+       pass $test
+    }
+
+    set test "dotnet-assemblies (64-bit)"
+    set want "file format pei-x86-64"
+    set got [binutils_run $OBJDUMP "-x tmpdir/dotnet-linux-x86-64.dll"]
+    if ![regexp $want $got] then {
+       if [regexp "file format not recognized" $got] then {
+           unsupported $test
+       } else {
+           fail "$test"
+       }
+    } else {
+       pass $test
+    }
+}
+
+test_objdump_dotnet_assemblies
+
 # Options which are not tested: -a -D -R -T -x -l --stabs
 # I don't see any generic way to test any of these other than -a.
 # Tests could be written for specific targets, and that should be done
diff --git a/binutils/testsuite/gentestdlls.c b/binutils/testsuite/gentestdlls.c
new file mode 100644 (file)
index 0000000..b1463c0
--- /dev/null
@@ -0,0 +1,152 @@
+/* Copyright (C) 2019 Free Software Foundation, Inc.
+
+   This file is part of GNU Binutils.
+
+   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 3 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., 51 Franklin Street - Fifth Floor, Boston, MA
+   02110-1301, USA.  */
+
+
+/* This file generates a number of DLL (PE/COFF binaries traditionally
+   used on Windows) that we can then utilize in various tests to
+   ensure objdump can parse these file correctly.
+
+   See:
+   https://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf  */
+
+#include <memory.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+static void
+write_dos_header_and_stub (FILE* file)
+{
+  /* See ECMA-335 II.25.2.1.
+     Instead of lfanew, lets just hardcode the offset of the next byte
+     after this header (0x80).  */
+  char buffer[128] =
+    {
+     0x4d, 0x5a, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00,
+     0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+     0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+     0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+     0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, /* Last 4 bytes are precomputed lfanew.  */
+     0x0e, 0x1f, 0xba, 0x0e, 0x00, 0xb4, 0x09, 0xcd,
+     0x21, 0xb8, 0x01, 0x4c, 0xcd, 0x21, 0x54, 0x68,
+     0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72,
+     0x61, 0x6d, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f,
+     0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6e,
+     0x20, 0x69, 0x6e, 0x20, 0x44, 0x4f, 0x53, 0x20,
+     0x6d, 0x6f, 0x64, 0x65, 0x2e, 0x0d, 0x0d, 0x0a,
+     0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+    };
+
+  fwrite (buffer, 1, 128, file);
+}
+
+static void
+write_pe_signature (FILE* file)
+{
+  char buffer[4];
+  buffer[0] = 'P';
+  buffer[1] = 'E';
+  buffer[2] = 0;
+  buffer[3] = 0;
+  fwrite (buffer, 1, 4, file);
+}
+
+static void
+write_coff_header (FILE* file, uint16_t machine)
+{
+  char buffer[128];
+
+  memset (buffer, 0, sizeof (buffer));
+
+  /* Machine.  ECMA-335 says this must be 0x14c but that's not true anymore.  */
+  buffer[0] = machine & 0xff;
+  buffer[1] = machine >> 0x8;
+  fwrite (buffer, 2, 1, file);
+  memset (buffer, 0, sizeof (buffer));
+  /* NumberOfSections = 0 */
+  fwrite (buffer, 2, 1, file);
+  /* TimeDateStamp = 0 */
+  fwrite (buffer, 4, 1, file);
+  /* PointerToSymbolTable = 0 */
+  fwrite (buffer, 4, 1, file);
+  /* NumberOfSymbols = 0 */
+  fwrite (buffer, 4, 1, file);
+  /* OptionalHeaderSize = 0 */
+  fwrite (buffer, 2, 1, file);
+  /* Characteristics = 0x2000 */
+  buffer[0] = 0x00;
+  buffer[1] = 0x20;
+  fwrite (buffer, 2, 1, file);
+  memset (buffer, 0 , sizeof (buffer));
+}
+
+int
+main (int argc, char** argv)
+{
+  FILE* file;
+
+  if (argc < 2)
+    {
+      fprintf (stderr, "usage: %s output-directory\n", argv[0]);
+      exit (2);
+    }
+  if (chdir (argv[1]) != 0)
+    {
+      fprintf (stderr, "error: unable to change directory to %s\n", argv[0]);
+      exit (2);
+    }
+
+  /* Generate a simple DLL file.  */
+  file = fopen ("simple-i386.dll", "w");
+  if (file == NULL)
+    {
+      fprintf (stderr, "error: unable to open file for writing\n");
+      exit (1);
+    }
+
+  write_dos_header_and_stub (file);
+  write_pe_signature (file);
+  write_coff_header (file, 0x14c);
+  fclose (file);
+  printf ("wrote simple-i386.dll\n");
+
+  /* Generate a sample .NET Core on Linux dll file.  As opposed to the
+     more common DLLs that contain bytecode (CIL/MSIL), many .NET Core
+     DLLs are pre-compiled for specific architectures and platforms.
+     See https://github.com/jbevain/cecil/issues/337 for an example of
+     this value being used in practice.  */
+  file = fopen ("dotnet-linux-x86-64.dll", "w");
+  if (file == NULL)
+    {
+      fprintf (stderr, "error: unable to open file for writing\n");
+      exit (1);
+    }
+
+  write_dos_header_and_stub (file);
+  write_pe_signature (file);
+  write_coff_header (file, 0xfd1d /* x86-64 + Linux */);
+  fclose (file);
+  printf ("wrote dotnet-linux-x86-64.dll\n");
+
+  return 0;
+}
index bb5abb15d1a4f59923edd5c881a70ce35fd9d649..4c841e35954a2ee39c9b72343f571f21a6b5a301 100644 (file)
@@ -1,3 +1,24 @@
+2019-07-23  Omar Majid  <omajid@redhat.com>
+
+       * coff/i386.h (IMAGE_FILE_MACHINE_NATIVE_APPLE_OVERRIDE): Define.
+       (IMAGE_FILE_MACHINE_NATIVE_FREEBSD_OVERRIDE): Define.
+       (IMAGE_FILE_MACHINE_NATIVE_LINUX_OVERRIDE): Define.
+       (IMAGE_FILE_MACHINE_NATIVE_NETBSD_OVERRIDE): Define.
+       (I386_APPLE_MAGIC): Define.
+       (I386_FREEBSD_MAGIC): Define.
+       (I386_LINUX_MAGIC): Define.
+       (I386_NETBSD_MAGIC): Define.
+       (I386BADMAG): Extend macro to allow new magic numbers.
+       * coff/x86_64.h (IMAGE_FILE_MACHINE_NATIVE_APPLE_OVERRIDE): Define.
+       (IMAGE_FILE_MACHINE_NATIVE_FREEBSD_OVERRIDE): Define.
+       (IMAGE_FILE_MACHINE_NATIVE_LINUX_OVERRIDE): Define.
+       (IMAGE_FILE_MACHINE_NATIVE_NETBSD_OVERRIDE): Define.
+       (AMD64_APPLE_MAGIC): Define.
+       (AMD64_FREEBSD_MAGIC): Define.
+       (AMD64_LINUX_MAGIC): Define.
+       (AMD64_NETBSD_MAGIC): Define.
+       (AMD64BADMAG): Extend macro to allow new magic numbers.
+
 2019-07-19  Alan Modra  <amodra@gmail.com>
 
        * elf/ppc64.h (R_PPC64_TPREL34, R_PPC64_DTPREL34),
index 1d2ccff6f717d25b47af79fa0ebb0466b47154ba..8fd2b8d41d28b8ab7091616abdb05719e8a32f7c 100644 (file)
 
 #define LYNXCOFFMAGIC  0415
 
+/* .NET DLLs XOR the Machine number (above) with an override to
+    indicate that the DLL contains OS-specific machine code rather
+    than just IL or bytecode. See
+    https://github.com/dotnet/coreclr/blob/6f7aa7967c607b8c667518314ab937c0d7547025/src/inc/pedecoder.h#L94-L107. */
+#define IMAGE_FILE_MACHINE_NATIVE_APPLE_OVERRIDE   0x4644
+#define IMAGE_FILE_MACHINE_NATIVE_FREEBSD_OVERRIDE 0xadc4
+#define IMAGE_FILE_MACHINE_NATIVE_LINUX_OVERRIDE   0x7b79
+#define IMAGE_FILE_MACHINE_NATIVE_NETBSD_OVERRIDE  0x1993
+
+/* Used in some .NET DLLs that target a specific OS.  */
+#define I386_APPLE_MAGIC   (I386MAGIC ^ IMAGE_FILE_MACHINE_NATIVE_APPLE_OVERRIDE)
+#define I386_FREEBSD_MAGIC (I386MAGIC ^ IMAGE_FILE_MACHINE_NATIVE_FREEBSD_OVERRIDE)
+#define I386_LINUX_MAGIC   (I386MAGIC ^ IMAGE_FILE_MACHINE_NATIVE_LINUX_OVERRIDE)
+#define I386_NETBSD_MAGIC  (I386MAGIC ^ IMAGE_FILE_MACHINE_NATIVE_NETBSD_OVERRIDE)
+
 #define I386BADMAG(x) (  ((x).f_magic != I386MAGIC) \
+                      && (x).f_magic != I386_APPLE_MAGIC \
+                      && (x).f_magic != I386_FREEBSD_MAGIC \
+                      && (x).f_magic != I386_LINUX_MAGIC \
+                      && (x).f_magic != I386_NETBSD_MAGIC \
                       && (x).f_magic != I386AIXMAGIC \
                       && (x).f_magic != I386PTXMAGIC \
                       && (x).f_magic != LYNXCOFFMAGIC)
index 3d0e6f085d717d5afd88d09b14f6464db0a01545..c0e6de3b1fdb8789793e905ed252e0f34816b064 100644 (file)
 
 #define AMD64MAGIC     0x8664
 
-#define AMD64BADMAG(x) ((x).f_magic != AMD64MAGIC)
+/* .NET DLLs XOR the Machine number (above) with an override to
+    indicate that the DLL contains OS-specific machine code rather
+    than just IL or bytecode. See
+    https://github.com/dotnet/coreclr/blob/6f7aa7967c607b8c667518314ab937c0d7547025/src/inc/pedecoder.h#L94-L107. */
+#define IMAGE_FILE_MACHINE_NATIVE_APPLE_OVERRIDE   0x4644
+#define IMAGE_FILE_MACHINE_NATIVE_FREEBSD_OVERRIDE 0xadc4
+#define IMAGE_FILE_MACHINE_NATIVE_LINUX_OVERRIDE   0x7b79
+#define IMAGE_FILE_MACHINE_NATIVE_NETBSD_OVERRIDE  0x1993
+
+/* Used in some .NET DLLs that target a specific OS.  */
+#define AMD64_APPLE_MAGIC   (AMD64MAGIC ^ IMAGE_FILE_MACHINE_NATIVE_APPLE_OVERRIDE)
+#define AMD64_FREEBSD_MAGIC (AMD64MAGIC ^ IMAGE_FILE_MACHINE_NATIVE_FREEBSD_OVERRIDE)
+#define AMD64_LINUX_MAGIC   (AMD64MAGIC ^ IMAGE_FILE_MACHINE_NATIVE_LINUX_OVERRIDE)
+#define AMD64_NETBSD_MAGIC  (AMD64MAGIC ^ IMAGE_FILE_MACHINE_NATIVE_NETBSD_OVERRIDE)
+
+#define AMD64BADMAG(x) (   ((x).f_magic != AMD64MAGIC) \
+                        && ((x).f_magic != AMD64_APPLE_MAGIC) \
+                        && ((x).f_magic != AMD64_FREEBSD_MAGIC) \
+                        && ((x).f_magic != AMD64_LINUX_MAGIC) \
+                        && ((x).f_magic != AMD64_NETBSD_MAGIC))
+
 #define IMAGE_NT_OPTIONAL_HDR64_MAGIC      0x20b
 
 #define OMAGIC          0404    /* Object files, eg as output.  */
This page took 0.038577 seconds and 4 git commands to generate.