diff options
author | Omar Majid <omajid@redhat.com> | 2019-07-23 09:44:57 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2019-07-23 09:44:57 +0100 |
commit | 1dd1bc4daf99ec7ad1f9a6feea8cf4ebe715a92d (patch) | |
tree | 968e6d80c069a68fcb0bc8630dd2b67ab14362e3 /binutils/testsuite | |
parent | 5ba29434765feed692b6342a8b0f853050be2402 (diff) | |
download | gdb-1dd1bc4daf99ec7ad1f9a6feea8cf4ebe715a92d.zip gdb-1dd1bc4daf99ec7ad1f9a6feea8cf4ebe715a92d.tar.gz gdb-1dd1bc4daf99ec7ad1f9a6feea8cf4ebe715a92d.tar.bz2 |
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.
Diffstat (limited to 'binutils/testsuite')
-rw-r--r-- | binutils/testsuite/binutils-all/objdump.exp | 43 | ||||
-rw-r--r-- | binutils/testsuite/gentestdlls.c | 152 |
2 files changed, 195 insertions, 0 deletions
diff --git a/binutils/testsuite/binutils-all/objdump.exp b/binutils/testsuite/binutils-all/objdump.exp index beaf44f..b46fd0a 100644 --- a/binutils/testsuite/binutils-all/objdump.exp +++ b/binutils/testsuite/binutils-all/objdump.exp @@ -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 index 0000000..b1463c0 --- /dev/null +++ b/binutils/testsuite/gentestdlls.c @@ -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; +} |