Allow objdump to recognise the System.Runtime.dll files that get shipped with .NET Core 2.1.

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.
This commit is contained in:
Omar Majid 2019-07-23 09:44:57 +01:00 committed by Nick Clifton
parent 5ba2943476
commit 1dd1bc4daf
11 changed files with 335 additions and 17 deletions

View 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),

View 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;

View File

@ -35,6 +35,13 @@
"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).

View 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

View 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.

View 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

View 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

View File

@ -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;
}

View 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),

View File

@ -43,7 +43,26 @@
#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)

View File

@ -29,7 +29,27 @@
#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. */