This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH #1] mips*-kfreebsd-gnu support in BFD
- From: Robert Millan <rmh at gnu dot org>
- To: binutils at sourceware dot org, rdsandiford at googlemail dot com
- Date: Thu, 23 Dec 2010 19:20:23 +0100
- Subject: Re: [PATCH #1] mips*-kfreebsd-gnu support in BFD
- References: <1292341157.29336.0@thorin> <87ei98ohwz.fsf@firetop.home>
El 23/12/10 12:19:40, en/na Richard Sandiford va escriure:
> Here you've got bfd_elf32_ntradlittlemips_vec twice (first and
> third),
> no bfd_elf32_tradlittlemips_vec, and no
> bfd_elf32_ntradlittlemips_freebsd_vec.
> Same sort of problems for the big-endian case. This leads to a lot
> of
> errors
> when running the testsuite for mips64-unknown-kfreebsd-gnu
>
> Also, your GAS patch says that N32 is the default for mips64,
> but there's no corresponding config.bfd entry that sets
> bfd_elf32_ntrad*mips_freebsd_vec to be the default for
> mips64*-kfreebsd-gnu.
Here's a new patch. Sorry for the oversight (it's
difficult to keep track of so many vector names).
2010-12-23 Robert Millan <rmh@gnu.org>
* bfd/config.bfd: Recognize mips-freebsd and mips-kfreebsd-gnu.
* bfd/configure.host: Likewise.
* bfd/configure.in: Support for `bfd_elf32_ntradbigmips_freebsd_vec',
`bfd_elf32_ntradlittlemips_freebsd_vec',
`bfd_elf32_tradbigmips_freebsd_vec',
`bfd_elf32_tradlittlemips_freebsd_vec',
`bfd_elf64_tradbigmips_freebsd_vec' and
`bfd_elf64_tradlittlemips_freebsd_vec'.
* bfd/configure: Regenerate.
* bfd/elf32-mips.c: New target for FreeBSD support
(same as traditional MIPS but overrides ELF_OSABI
with ELFOSABI_FREEBSD).
* bfd/elf64-mips.c: Likewise.
* bfd/elfn32-mips.c: Likewise.
* bfd/targets.c (_bfd_target_vector): Add
`bfd_elf32_ntradbigmips_freebsd_vec',
`bfd_elf32_ntradlittlemips_freebsd_vec',
`bfd_elf32_tradbigmips_freebsd_vec',
`bfd_elf32_tradlittlemips_freebsd_vec',
`bfd_elf64_tradbigmips_freebsd_vec' and
`bfd_elf64_tradlittlemips_freebsd_vec'.
diff -Nur -x configure src.old/bfd/config.bfd src/bfd/config.bfd
--- src.old/bfd/config.bfd 2010-12-10 02:03:13.000000000 +0100
+++ src/bfd/config.bfd 2010-12-23 16:37:39.000000000 +0100
@@ -1016,6 +1016,40 @@
want64=true
;;
#ifdef BFD64
+ mips64*el-*-freebsd* | mips64*el-*-kfreebsd*-gnu)
+ # FreeBSD vectors
+ targ_defvec=bfd_elf32_ntradlittlemips_freebsd_vec
+ targ_selvecs="bfd_elf32_ntradbigmips_freebsd_vec bfd_elf32_tradlittlemips_freebsd_vec bfd_elf32_tradbigmips_freebsd_vec bfd_elf64_tradlittlemips_freebsd_vec bfd_elf64_tradbigmips_freebsd_vec"
+ # Generic vectors
+ targ_selvecs="${targ_selvecs} bfd_elf32_ntradlittlemips_vec bfd_elf32_ntradbigmips_vec bfd_elf32_tradlittlemips_vec bfd_elf32_tradbigmips_vec bfd_elf64_tradlittlemips_vec bfd_elf64_tradbigmips_vec"
+ want64=true
+ ;;
+ mips64*-*-freebsd* | mips64*-*-kfreebsd*-gnu)
+ # FreeBSD vectors
+ targ_defvec=bfd_elf32_ntradbigmips_freebsd_vec
+ targ_selvecs="bfd_elf32_ntradlittlemips_freebsd_vec bfd_elf32_tradbigmips_freebsd_vec bfd_elf32_tradlittlemips_freebsd_vec bfd_elf64_tradbigmips_freebsd_vec bfd_elf64_tradlittlemips_freebsd_vec"
+ # Generic vectors
+ targ_selvecs="${targ_selvecs} bfd_elf32_ntradbigmips_vec bfd_elf32_ntradlittlemips_vec bfd_elf32_tradbigmips_vec bfd_elf32_tradlittlemips_vec bfd_elf64_tradbigmips_vec bfd_elf64_tradlittlemips_vec"
+ want64=true
+ ;;
+#endif
+ mips*el-*-freebsd* | mips*el-*-kfreebsd*-gnu)
+ # FreeBSD vectors
+ targ_defvec=bfd_elf32_tradlittlemips_freebsd_vec
+ targ_selvecs="bfd_elf32_tradbigmips_freebsd_vec bfd_elf32_ntradlittlemips_freebsd_vec bfd_elf64_tradlittlemips_freebsd_vec bfd_elf32_ntradbigmips_freebsd_vec bfd_elf64_tradbigmips_freebsd_vec"
+ # Generic vectors
+ targ_selvecs="${targ_selvecs} bfd_elf32_tradlittlemips_vec bfd_elf32_tradbigmips_vec bfd_elf32_ntradlittlemips_vec bfd_elf64_tradlittlemips_vec bfd_elf32_ntradbigmips_vec bfd_elf64_tradbigmips_vec"
+ want64=true
+ ;;
+ mips*-*-freebsd* | mips*-*-kfreebsd*-gnu)
+ # FreeBSD vectors
+ targ_defvec=bfd_elf32_tradbigmips_freebsd_vec
+ targ_selvecs="bfd_elf32_tradlittlemips_freebsd_vec bfd_elf32_ntradbigmips_freebsd_vec bfd_elf64_tradbigmips_freebsd_vec bfd_elf32_ntradlittlemips_freebsd_vec bfd_elf64_tradlittlemips_freebsd_vec"
+ # Generic vectors
+ targ_selvecs="${targ_selvecs} bfd_elf32_tradbigmips_vec bfd_elf32_tradlittlemips_vec bfd_elf32_ntradbigmips_vec bfd_elf64_tradbigmips_vec bfd_elf32_ntradlittlemips_vec bfd_elf64_tradlittlemips_vec"
+ want64=true
+ ;;
+#ifdef BFD64
mmix-*-*)
targ_defvec=bfd_elf64_mmix_vec
targ_selvecs=bfd_mmo_vec
diff -Nur -x configure src.old/bfd/configure.host src/bfd/configure.host
--- src.old/bfd/configure.host 2010-02-15 20:25:47.000000000 +0100
+++ src/bfd/configure.host 2010-12-23 16:15:18.000000000 +0100
@@ -50,6 +50,7 @@
mips*-sgi-irix4*) HDEFINES="-G 4" ;;
mips*-sgi-irix6*) host64=true;;
mips64*-*-linux*) host64=true;;
+mips64*-*-freebsd* | mips64*-*-kfreebsd*-gnu) host64=true;;
mips*-*-sysv4*) ;;
mips*-*-sysv*) HDEFINES="-G 4" ;;
mips*-*-riscos*) HDEFINES="-G 4" ;;
diff -Nur -x configure src.old/bfd/configure.in src/bfd/configure.in
--- src.old/bfd/configure.in 2010-11-05 09:58:20.000000000 +0100
+++ src/bfd/configure.in 2010-12-23 16:15:18.000000000 +0100
@@ -748,8 +748,10 @@
bfd_elf32_msp430_vec) tb="$tb elf32-msp430.lo elf32.lo $elf" ;;
bfd_elf32_nbigmips_vec) tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
bfd_elf32_nlittlemips_vec) tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
- bfd_elf32_ntradbigmips_vec) tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
- bfd_elf32_ntradlittlemips_vec) tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
+ bfd_elf32_ntradbigmips_vec | bfd_elf32_ntradbigmips_freebsd_vec)
+ tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
+ bfd_elf32_ntradlittlemips_vec | bfd_elf32_ntradlittlemips_freebsd_vec)
+ tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
bfd_elf32_openrisc_vec) tb="$tb elf32-openrisc.lo elf32.lo $elf" ;;
bfd_elf32_or32_big_vec) tb="$tb elf32-or32.lo elf32.lo $elf" ;;
bfd_elf32_pj_vec) tb="$tb elf32-pj.lo elf32.lo $elf";;
@@ -788,8 +790,10 @@
bfd_elf32_spu_vec) tb="$tb elf32-spu.lo elf32.lo $elf" ;;
bfd_elf32_tic6x_be_vec) tb="$tb elf32-tic6x.lo elf32.lo $elf" ;;
bfd_elf32_tic6x_le_vec) tb="$tb elf32-tic6x.lo elf32.lo $elf" ;;
- bfd_elf32_tradbigmips_vec) tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;;
- bfd_elf32_tradlittlemips_vec) tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;;
+ bfd_elf32_tradbigmips_vec | bfd_elf32_tradbigmips_freebsd_vec)
+ tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;;
+ bfd_elf32_tradlittlemips_vec | bfd_elf32_tradlittlemips_freebsd_vec)
+ tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;;
bfd_elf32_us_cris_vec) tb="$tb elf32-cris.lo elf32.lo $elf" ;;
bfd_elf32_v850_vec) tb="$tb elf32-v850.lo elf32.lo $elf" ;;
bfd_elf32_vax_vec) tb="$tb elf32-vax.lo elf32.lo $elf" ;;
@@ -822,8 +826,10 @@
bfd_elf64_sparc_vec) tb="$tb elf64-sparc.lo elfxx-sparc.lo elf-vxworks.lo elf64.lo $elf"; target_size=64 ;;
bfd_elf64_sparc_freebsd_vec) tb="$tb elf64-sparc.lo elfxx-sparc.lo elf-vxworks.lo elf64.lo $elf"; target_size=64 ;;
bfd_elf64_sparc_sol2_vec) tb="$tb elf64-sparc.lo elfxx-sparc.lo elf-vxworks.lo elf64.lo $elf"; target_size=64 ;;
- bfd_elf64_tradbigmips_vec) tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
- bfd_elf64_tradlittlemips_vec) tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
+ bfd_elf64_tradbigmips_vec | bfd_elf64_tradbigmips_freebsd_vec)
+ tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
+ bfd_elf64_tradlittlemips_vec | bfd_elf64_tradlittlemips_freebsd_vec)
+ tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
bfd_elf64_x86_64_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
bfd_elf64_x86_64_sol2_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
bfd_elf64_x86_64_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
diff -Nur -x configure src.old/bfd/elf32-mips.c src/bfd/elf32-mips.c
--- src.old/bfd/elf32-mips.c 2010-08-25 16:53:42.000000000 +0200
+++ src/bfd/elf32-mips.c 2010-12-23 16:15:18.000000000 +0100
@@ -1725,6 +1725,37 @@
/* Include the target file again for this target. */
#include "elf32-target.h"
+/* FreeBSD support. */
+
+#undef TARGET_LITTLE_SYM
+#undef TARGET_LITTLE_NAME
+#undef TARGET_BIG_SYM
+#undef TARGET_BIG_NAME
+
+#define TARGET_LITTLE_SYM bfd_elf32_tradlittlemips_freebsd_vec
+#define TARGET_LITTLE_NAME "elf32-tradlittlemips-freebsd"
+#define TARGET_BIG_SYM bfd_elf32_tradbigmips_freebsd_vec
+#define TARGET_BIG_NAME "elf32-tradbigmips-freebsd"
+
+#undef ELF_OSABI
+#define ELF_OSABI ELFOSABI_FREEBSD
+
+/* The kernel recognizes executables as valid only if they carry a
+ "FreeBSD" label in the ELF header. So we put this label on all
+ executables and (for simplicity) also all other object files. */
+
+static void
+elf_fbsd_post_process_headers (bfd *abfd, struct bfd_link_info *info)
+{
+ _bfd_elf_set_osabi (abfd, info);
+}
+
+#undef elf_backend_post_process_headers
+#define elf_backend_post_process_headers elf_fbsd_post_process_headers
+#undef elf32_bed
+#define elf32_bed elf32_fbsd_tradbed
+
+#include "elf32-target.h"
/* Implement elf_backend_final_write_processing for VxWorks. */
static void
diff -Nur -x configure src.old/bfd/elf64-mips.c src/bfd/elf64-mips.c
--- src.old/bfd/elf64-mips.c 2010-10-04 16:13:09.000000000 +0200
+++ src/bfd/elf64-mips.c 2010-12-23 16:15:18.000000000 +0100
@@ -3354,3 +3354,36 @@
/* Include the target file again for this target. */
#include "elf64-target.h"
+
+
+/* FreeBSD support. */
+
+#undef TARGET_LITTLE_SYM
+#undef TARGET_LITTLE_NAME
+#undef TARGET_BIG_SYM
+#undef TARGET_BIG_NAME
+
+#define TARGET_LITTLE_SYM bfd_elf64_tradlittlemips_freebsd_vec
+#define TARGET_LITTLE_NAME "elf64-tradlittlemips-freebsd"
+#define TARGET_BIG_SYM bfd_elf64_tradbigmips_freebsd_vec
+#define TARGET_BIG_NAME "elf64-tradbigmips-freebsd"
+
+#undef ELF_OSABI
+#define ELF_OSABI ELFOSABI_FREEBSD
+
+/* The kernel recognizes executables as valid only if they carry a
+ "FreeBSD" label in the ELF header. So we put this label on all
+ executables and (for simplicity) also all other object files. */
+
+static void
+elf_fbsd_post_process_headers (bfd *abfd, struct bfd_link_info *info)
+{
+ _bfd_elf_set_osabi (abfd, info);
+}
+
+#undef elf_backend_post_process_headers
+#define elf_backend_post_process_headers elf_fbsd_post_process_headers
+#undef elf64_bed
+#define elf64_bed elf64_fbsd_tradbed
+
+#include "elf64-target.h"
diff -Nur -x configure src.old/bfd/elfn32-mips.c src/bfd/elfn32-mips.c
--- src.old/bfd/elfn32-mips.c 2010-08-25 16:53:45.000000000 +0200
+++ src/bfd/elfn32-mips.c 2010-12-23 16:15:18.000000000 +0100
@@ -2547,3 +2547,36 @@
/* Include the target file again for this target. */
#include "elf32-target.h"
+
+
+/* FreeBSD support. */
+
+#undef TARGET_LITTLE_SYM
+#undef TARGET_LITTLE_NAME
+#undef TARGET_BIG_SYM
+#undef TARGET_BIG_NAME
+
+#define TARGET_LITTLE_SYM bfd_elf32_ntradlittlemips_freebsd_vec
+#define TARGET_LITTLE_NAME "elf32-ntradlittlemips-freebsd"
+#define TARGET_BIG_SYM bfd_elf32_ntradbigmips_freebsd_vec
+#define TARGET_BIG_NAME "elf32-ntradbigmips-freebsd"
+
+#undef ELF_OSABI
+#define ELF_OSABI ELFOSABI_FREEBSD
+
+/* The kernel recognizes executables as valid only if they carry a
+ "FreeBSD" label in the ELF header. So we put this label on all
+ executables and (for simplicity) also all other object files. */
+
+static void
+elf_fbsd_post_process_headers (bfd *abfd, struct bfd_link_info *info)
+{
+ _bfd_elf_set_osabi (abfd, info);
+}
+
+#undef elf_backend_post_process_headers
+#define elf_backend_post_process_headers elf_fbsd_post_process_headers
+#undef elf32_bed
+#define elf32_bed elf32_fbsd_tradbed
+
+#include "elf32-target.h"
diff -Nur -x configure src.old/bfd/targets.c src/bfd/targets.c
--- src.old/bfd/targets.c 2010-10-22 14:08:28.000000000 +0200
+++ src/bfd/targets.c 2010-12-23 16:15:18.000000000 +0100
@@ -646,6 +646,8 @@
extern const bfd_target bfd_elf32_nlittlemips_vec;
extern const bfd_target bfd_elf32_ntradbigmips_vec;
extern const bfd_target bfd_elf32_ntradlittlemips_vec;
+extern const bfd_target bfd_elf32_ntradbigmips_freebsd_vec;
+extern const bfd_target bfd_elf32_ntradlittlemips_freebsd_vec;
extern const bfd_target bfd_elf32_openrisc_vec;
extern const bfd_target bfd_elf32_or32_big_vec;
extern const bfd_target bfd_elf32_pj_vec;
@@ -683,6 +685,8 @@
extern const bfd_target bfd_elf32_tic6x_le_vec;
extern const bfd_target bfd_elf32_tradbigmips_vec;
extern const bfd_target bfd_elf32_tradlittlemips_vec;
+extern const bfd_target bfd_elf32_tradbigmips_freebsd_vec;
+extern const bfd_target bfd_elf32_tradlittlemips_freebsd_vec;
extern const bfd_target bfd_elf32_us_cris_vec;
extern const bfd_target bfd_elf32_v850_vec;
extern const bfd_target bfd_elf32_vax_vec;
@@ -717,6 +721,8 @@
extern const bfd_target bfd_elf64_sparc_sol2_vec;
extern const bfd_target bfd_elf64_tradbigmips_vec;
extern const bfd_target bfd_elf64_tradlittlemips_vec;
+extern const bfd_target bfd_elf64_tradbigmips_freebsd_vec;
+extern const bfd_target bfd_elf64_tradlittlemips_freebsd_vec;
extern const bfd_target bfd_elf64_x86_64_freebsd_vec;
extern const bfd_target bfd_elf64_x86_64_sol2_vec;
extern const bfd_target bfd_elf64_x86_64_vec;
@@ -992,6 +998,8 @@
&bfd_elf32_nlittlemips_vec,
&bfd_elf32_ntradbigmips_vec,
&bfd_elf32_ntradlittlemips_vec,
+ &bfd_elf32_ntradbigmips_freebsd_vec,
+ &bfd_elf32_ntradlittlemips_freebsd_vec,
#endif
&bfd_elf32_openrisc_vec,
&bfd_elf32_or32_big_vec,
@@ -1034,6 +1042,8 @@
&bfd_elf32_tic6x_le_vec,
&bfd_elf32_tradbigmips_vec,
&bfd_elf32_tradlittlemips_vec,
+ &bfd_elf32_tradbigmips_freebsd_vec,
+ &bfd_elf32_tradlittlemips_freebsd_vec,
&bfd_elf32_us_cris_vec,
&bfd_elf32_v850_vec,
&bfd_elf32_vax_vec,
@@ -1069,6 +1079,8 @@
&bfd_elf64_sparc_sol2_vec,
&bfd_elf64_tradbigmips_vec,
&bfd_elf64_tradlittlemips_vec,
+ &bfd_elf64_tradbigmips_freebsd_vec,
+ &bfd_elf64_tradlittlemips_freebsd_vec,
&bfd_elf64_x86_64_freebsd_vec,
&bfd_elf64_x86_64_sol2_vec,
&bfd_elf64_x86_64_vec,