aboutsummaryrefslogtreecommitdiff
path: root/binutils/testsuite
diff options
context:
space:
mode:
authorOmar Majid <omajid@redhat.com>2019-07-23 09:44:57 +0100
committerNick Clifton <nickc@redhat.com>2019-07-23 09:44:57 +0100
commit1dd1bc4daf99ec7ad1f9a6feea8cf4ebe715a92d (patch)
tree968e6d80c069a68fcb0bc8630dd2b67ab14362e3 /binutils/testsuite
parent5ba29434765feed692b6342a8b0f853050be2402 (diff)
downloadgdb-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.exp43
-rw-r--r--binutils/testsuite/gentestdlls.c152
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;
+}