diff options
-rw-r--r-- | bfd/ChangeLog | 10 | ||||
-rw-r--r-- | bfd/archures.c | 4 | ||||
-rw-r--r-- | bfd/bfd-in2.h | 6 | ||||
-rw-r--r-- | bfd/cpu-i386.c | 69 | ||||
-rw-r--r-- | ld/ChangeLog | 6 | ||||
-rw-r--r-- | ld/emulparams/elf32_x86_64_nacl.sh | 1 | ||||
-rw-r--r-- | ld/emulparams/elf_i386_nacl.sh | 1 | ||||
-rw-r--r-- | ld/emulparams/elf_x86_64_nacl.sh | 1 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 12 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/ia32-2.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/ia32-3.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/ilp32-2.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/ilp32-3.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/lp64-2.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/lp64-3.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/x86-64.exp | 6 |
16 files changed, 116 insertions, 12 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ebae60d..815503b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,15 @@ 2013-08-26 Roland McGrath <mcgrathr@google.com> + * archures.c (bfd_mach_i386_nacl, bfd_mach_i386_i386_nacl): New macros. + (bfd_mach_x86_64_nacl, bfd_mach_x64_32_nacl): New macros. + * cpu-i386.c (bfd_arch_i386_onebyte_nop_fill): New function. + (bfd_i386_nacl_arch): New variable. + (bfd_x86_64_nacl_arch, bfd_x64_32_nacl_arch): New variables. + (bfd_x64_32_arch_intel_syntax): Link them into the list. + * bfd-in2.h: Regenerate. + +2013-08-26 Roland McGrath <mcgrathr@google.com> + * elf-nacl.c (nacl_modify_segment_map): Fix logic reordering the elf_segment_map list. If an executable segment is page-aligned but does not end with a full page, then append a fake section into diff --git a/bfd/archures.c b/bfd/archures.c index d00b0e1..53962bf 100644 --- a/bfd/archures.c +++ b/bfd/archures.c @@ -189,9 +189,13 @@ DESCRIPTION .#define bfd_mach_i386_i386 (1 << 2) .#define bfd_mach_x86_64 (1 << 3) .#define bfd_mach_x64_32 (1 << 4) +.#define bfd_mach_i386_nacl (1 << 5) .#define bfd_mach_i386_i386_intel_syntax (bfd_mach_i386_i386 | bfd_mach_i386_intel_syntax) .#define bfd_mach_x86_64_intel_syntax (bfd_mach_x86_64 | bfd_mach_i386_intel_syntax) .#define bfd_mach_x64_32_intel_syntax (bfd_mach_x64_32 | bfd_mach_i386_intel_syntax) +.#define bfd_mach_i386_i386_nacl (bfd_mach_i386_i386 | bfd_mach_i386_nacl) +.#define bfd_mach_x86_64_nacl (bfd_mach_x86_64 | bfd_mach_i386_nacl) +.#define bfd_mach_x64_32_nacl (bfd_mach_x64_32 | bfd_mach_i386_nacl) . bfd_arch_l1om, {* Intel L1OM *} .#define bfd_mach_l1om (1 << 5) .#define bfd_mach_l1om_intel_syntax (bfd_mach_l1om | bfd_mach_i386_intel_syntax) diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 0cf9a29..41f7a68 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -7,7 +7,7 @@ /* Main header file for the bfd library -- portable access to object files. - Copyright 1990-2013 2013 Free Software Foundation, Inc. + Copyright 1990-2013 Free Software Foundation, Inc. Contributed by Cygnus Support. @@ -1944,9 +1944,13 @@ enum bfd_architecture #define bfd_mach_i386_i386 (1 << 2) #define bfd_mach_x86_64 (1 << 3) #define bfd_mach_x64_32 (1 << 4) +#define bfd_mach_i386_nacl (1 << 5) #define bfd_mach_i386_i386_intel_syntax (bfd_mach_i386_i386 | bfd_mach_i386_intel_syntax) #define bfd_mach_x86_64_intel_syntax (bfd_mach_x86_64 | bfd_mach_i386_intel_syntax) #define bfd_mach_x64_32_intel_syntax (bfd_mach_x64_32 | bfd_mach_i386_intel_syntax) +#define bfd_mach_i386_i386_nacl (bfd_mach_i386_i386 | bfd_mach_i386_nacl) +#define bfd_mach_x86_64_nacl (bfd_mach_x86_64 | bfd_mach_i386_nacl) +#define bfd_mach_x64_32_nacl (bfd_mach_x64_32 | bfd_mach_i386_nacl) bfd_arch_l1om, /* Intel L1OM */ #define bfd_mach_l1om (1 << 5) #define bfd_mach_l1om_intel_syntax (bfd_mach_l1om | bfd_mach_i386_intel_syntax) diff --git a/bfd/cpu-i386.c b/bfd/cpu-i386.c index 6174612..2a6bb97 100644 --- a/bfd/cpu-i386.c +++ b/bfd/cpu-i386.c @@ -1,6 +1,6 @@ /* BFD support for the Intel 386 architecture. Copyright 1992, 1994, 1995, 1996, 1998, 2000, 2001, 2002, 2004, 2005, - 2007, 2009, 2010, 2011 + 2007, 2009, 2010, 2011, 2013 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -119,6 +119,71 @@ bfd_arch_i386_long_nop_fill (bfd_size_type count, return bfd_arch_i386_fill (count, code, TRUE); } +/* Fill the buffer with zero, or one-byte nop instructions if CODE is TRUE. */ + +static void * +bfd_arch_i386_onebyte_nop_fill (bfd_size_type count, + bfd_boolean is_bigendian ATTRIBUTE_UNUSED, + bfd_boolean code) +{ + void *fill = bfd_malloc (count); + if (fill != NULL) + memset (fill, code ? 0x90 : 0, count); + return fill; +} + + +static const bfd_arch_info_type bfd_x64_32_nacl_arch = +{ + 64, /* 64 bits in a word */ + 64, /* 64 bits in an address */ + 8, /* 8 bits in a byte */ + bfd_arch_i386, + bfd_mach_x64_32_nacl, + "i386", + "i386:x64-32:nacl", + 3, + FALSE, + bfd_i386_compatible, + bfd_default_scan, + bfd_arch_i386_onebyte_nop_fill, + NULL +}; + +static const bfd_arch_info_type bfd_x86_64_nacl_arch = +{ + 64, /* 64 bits in a word */ + 64, /* 64 bits in an address */ + 8, /* 8 bits in a byte */ + bfd_arch_i386, + bfd_mach_x86_64_nacl, + "i386", + "i386:x86-64:nacl", + 3, + FALSE, + bfd_i386_compatible, + bfd_default_scan, + bfd_arch_i386_onebyte_nop_fill, + &bfd_x64_32_nacl_arch +}; + +const bfd_arch_info_type bfd_i386_nacl_arch = +{ + 32, /* 32 bits in a word */ + 32, /* 32 bits in an address */ + 8, /* 8 bits in a byte */ + bfd_arch_i386, + bfd_mach_i386_i386_nacl, + "i386", + "i386:nacl", + 3, + TRUE, + bfd_i386_compatible, + bfd_default_scan, + bfd_arch_i386_onebyte_nop_fill, + &bfd_x86_64_nacl_arch +}; + static const bfd_arch_info_type bfd_x64_32_arch_intel_syntax = { 64, /* 64 bits in a word */ @@ -133,7 +198,7 @@ static const bfd_arch_info_type bfd_x64_32_arch_intel_syntax = bfd_i386_compatible, bfd_default_scan, bfd_arch_i386_long_nop_fill, - 0 + &bfd_i386_nacl_arch }; static const bfd_arch_info_type bfd_x86_64_arch_intel_syntax = diff --git a/ld/ChangeLog b/ld/ChangeLog index 27b4be7..b834138 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2013-08-26 Roland McGrath <mcgrathr@google.com> + + * emulparams/elf_i386_nacl.sh (ARCH): Set to i386:nacl. + * emulparams/elf_x86_64_nacl.sh (ARCH): Set to i386:x86-64:nacl. + * emulparams/elf32_x86_64_nacl.sh (ARCH): Set to i386:x64-32:nacl. + 2013-08-23 Roland McGrath <mcgrathr@google.com> * emulparams/elf_nacl.sh (nacl_rodata_addr): Don't add in diff --git a/ld/emulparams/elf32_x86_64_nacl.sh b/ld/emulparams/elf32_x86_64_nacl.sh index 4570ef9..ea98b28 100644 --- a/ld/emulparams/elf32_x86_64_nacl.sh +++ b/ld/emulparams/elf32_x86_64_nacl.sh @@ -1,3 +1,4 @@ . ${srcdir}/emulparams/elf32_x86_64.sh . ${srcdir}/emulparams/elf_nacl.sh OUTPUT_FORMAT="elf32-x86-64-nacl" +ARCH="i386:x64-32:nacl" # The :nacl just means one-byte nops for code fill. diff --git a/ld/emulparams/elf_i386_nacl.sh b/ld/emulparams/elf_i386_nacl.sh index 81992d7..294f7f5 100644 --- a/ld/emulparams/elf_i386_nacl.sh +++ b/ld/emulparams/elf_i386_nacl.sh @@ -1,3 +1,4 @@ . ${srcdir}/emulparams/elf_i386.sh . ${srcdir}/emulparams/elf_nacl.sh OUTPUT_FORMAT="elf32-i386-nacl" +ARCH="i386:nacl" # The :nacl just means one-byte nops for code fill. diff --git a/ld/emulparams/elf_x86_64_nacl.sh b/ld/emulparams/elf_x86_64_nacl.sh index 7c79eee..a6966bd 100644 --- a/ld/emulparams/elf_x86_64_nacl.sh +++ b/ld/emulparams/elf_x86_64_nacl.sh @@ -1,3 +1,4 @@ . ${srcdir}/emulparams/elf_x86_64.sh . ${srcdir}/emulparams/elf_nacl.sh OUTPUT_FORMAT="elf64-x86-64-nacl" +ARCH="i386:x86-64:nacl" # The :nacl just means one-byte nops for code fill. diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 3adba9b..f27092f 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,5 +1,17 @@ 2013-08-26 Roland McGrath <mcgrathr@google.com> + * ld-x86-64/x86-64.exp (Mixed x86_64 and i386 input test 1): + Loosen string match to admit i386:x86-64*. + (Mixed x86_64 and i386 input test 2): Likewise. + * ld-x86-64/ilp32-2.d: Likewise. + * ld-x86-64/ilp32-3.d: Likewise. + * ld-x86-64/lp64-2.d: Likewise. + * ld-x86-64/lp64-3.d: Likewise. + * ld-x86-64/ia32-2.d: Likewise, and i386.* too. + * ld-x86-64/ia32-3.d: Likewise. + +2013-08-26 Roland McGrath <mcgrathr@google.com> + * ld-x86-64/ilp32-4-nacl.d: Loosen .shstrtab line regexp to match any file offset. * ld-x86-64/tlsbin-nacl.rd: Update expected code segment PT_LOAD. diff --git a/ld/testsuite/ld-x86-64/ia32-2.d b/ld/testsuite/ld-x86-64/ia32-2.d index 3a180b5..cea4927 100644 --- a/ld/testsuite/ld-x86-64/ia32-2.d +++ b/ld/testsuite/ld-x86-64/ia32-2.d @@ -1,4 +1,4 @@ #source: dummy.s #as: --32 #ld: -m elf_i386 tmpdir/start32.o tmpdir/foox32.o -#error: .*i386:x64-32 architecture of input file `tmpdir/foox32.o' is incompatible with i386 output +#error: .*i386:x64-32.* architecture of input file `tmpdir/foox32.o' is incompatible with i386.* output diff --git a/ld/testsuite/ld-x86-64/ia32-3.d b/ld/testsuite/ld-x86-64/ia32-3.d index 1528399..ecd8b2e 100644 --- a/ld/testsuite/ld-x86-64/ia32-3.d +++ b/ld/testsuite/ld-x86-64/ia32-3.d @@ -1,4 +1,4 @@ #source: dummy.s #as: --32 #ld: -m elf_i386 tmpdir/start32.o tmpdir/foo64.o -#error: .*i386:x86-64 architecture of input file `tmpdir/foo64.o' is incompatible with i386 output +#error: .*i386:x86-64.* architecture of input file `tmpdir/foo64.o' is incompatible with i386.* output diff --git a/ld/testsuite/ld-x86-64/ilp32-2.d b/ld/testsuite/ld-x86-64/ilp32-2.d index 19fc671..65b5298 100644 --- a/ld/testsuite/ld-x86-64/ilp32-2.d +++ b/ld/testsuite/ld-x86-64/ilp32-2.d @@ -1,4 +1,4 @@ #source: dummy.s #as: --x32 #ld: -m elf32_x86_64 tmpdir/startx32.o tmpdir/foo32.o -#error: .*i386 architecture of input file `tmpdir/foo32.o' is incompatible with i386:x64-32 output +#error: .*i386 architecture of input file `tmpdir/foo32.o' is incompatible with i386:x64-32.* output diff --git a/ld/testsuite/ld-x86-64/ilp32-3.d b/ld/testsuite/ld-x86-64/ilp32-3.d index fdd9065..b05e531 100644 --- a/ld/testsuite/ld-x86-64/ilp32-3.d +++ b/ld/testsuite/ld-x86-64/ilp32-3.d @@ -1,4 +1,4 @@ #source: dummy.s #as: --x32 #ld: -m elf32_x86_64 tmpdir/startx32.o tmpdir/foo64.o -#error: .*i386:x86-64 architecture of input file `tmpdir/foo64.o' is incompatible with i386:x64-32 output +#error: .*i386:x86-64 architecture of input file `tmpdir/foo64.o' is incompatible with i386:x64-32.* output diff --git a/ld/testsuite/ld-x86-64/lp64-2.d b/ld/testsuite/ld-x86-64/lp64-2.d index fde3202..7515881 100644 --- a/ld/testsuite/ld-x86-64/lp64-2.d +++ b/ld/testsuite/ld-x86-64/lp64-2.d @@ -1,4 +1,4 @@ #source: dummy.s #as: --64 #ld: -m elf_x86_64 tmpdir/start64.o tmpdir/foo32.o -#error: .*i386 architecture of input file `tmpdir/foo32.o' is incompatible with i386:x86-64 output +#error: .*i386 architecture of input file `tmpdir/foo32.o' is incompatible with i386:x86-64.* output diff --git a/ld/testsuite/ld-x86-64/lp64-3.d b/ld/testsuite/ld-x86-64/lp64-3.d index c89fbc4..e60efeb 100644 --- a/ld/testsuite/ld-x86-64/lp64-3.d +++ b/ld/testsuite/ld-x86-64/lp64-3.d @@ -1,4 +1,4 @@ #source: dummy.s #as: --64 #ld: -m elf_x86_64 tmpdir/start64.o tmpdir/foox32.o -#error: .*i386:x64-32 architecture of input file `tmpdir/foox32.o' is incompatible with i386:x86-64 output +#error: .*i386:x64-32 architecture of input file `tmpdir/foox32.o' is incompatible with i386:x86-64.* output diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index 0fd0312..8ca2da7 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -1,5 +1,5 @@ # Expect script for ld-x86_64 tests -# Copyright (C) 2002, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 +# Copyright (C) 2002, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 # Free Software Foundation # # This file is part of the GNU Binutils. @@ -163,7 +163,7 @@ global ld set test_name "Mixed x86_64 and i386 input test 1" set test mixed1 if { ![ld_simple_link $ld tmpdir/$test "-m$emul tmpdir/${test}a.o tmpdir/${test}b.o"] } { - if [string match "*i386 architecture of input file `tmpdir/${test}b.o' is incompatible with i386:x86-64 output*" $link_output] { + if [string match "*i386 architecture of input file `tmpdir/${test}b.o' is incompatible with i386:x86-64* output*" $link_output] { pass "$test_name" } { fail "$test_name" @@ -173,7 +173,7 @@ if { ![ld_simple_link $ld tmpdir/$test "-m$emul tmpdir/${test}a.o tmpdir/${test} set test_name "Mixed x86_64 and i386 input test 2" set test mixed2 if { ![ld_simple_link $ld tmpdir/$test "-m$emul tmpdir/${test}a.o tmpdir/${test}b.o"] } { - if [string match "*i386 architecture of input file `tmpdir/${test}b.o' is incompatible with i386:x86-64 output*" $link_output] { + if [string match "*i386 architecture of input file `tmpdir/${test}b.o' is incompatible with i386:x86-64* output*" $link_output] { pass "$test_name" } { fail "$test_name" |