diff options
Diffstat (limited to 'toolchain/binutils')
8 files changed, 334 insertions, 0 deletions
diff --git a/toolchain/binutils/Config.in b/toolchain/binutils/Config.in index 7c54e784b..7b5127b46 100644 --- a/toolchain/binutils/Config.in +++ b/toolchain/binutils/Config.in @@ -17,6 +17,10 @@ choice depends !avr32 depends !ubicom32 bool "binutils 2.20" + config BINUTILS_VERSION_2_20_1 + depends !avr32 + depends !ubicom32 + bool "binutils 2.20.1" config BINUTILS_VERSION_CS depends !avr32 @@ -39,5 +43,6 @@ config BINUTILS_VERSION default "2.18" if BINUTILS_VERSION_2_18 default "2.19.1" if BINUTILS_VERSION_2_19_1 default "2.20" if BINUTILS_VERSION_2_20 + default "2.20.1" if BINUTILS_VERSION_2_20_1 default "2.19.1+cs" if BINUTILS_VERSION_CS default "2.19.1" diff --git a/toolchain/binutils/Makefile b/toolchain/binutils/Makefile index 91d982c00..5ded5f242 100644 --- a/toolchain/binutils/Makefile +++ b/toolchain/binutils/Makefile @@ -29,6 +29,9 @@ endif ifeq ($(PKG_VERSION),2.20) PKG_MD5SUM:=ee2d3e996e9a2d669808713360fa96f8 endif +ifeq ($(PKG_VERSION),2.20.1) + PKG_MD5SUM:=9cdfb9d6ec0578c166d3beae5e15c4e5 +endif PATCH_DIR:=./patches/$(PKG_VERSION) diff --git a/toolchain/binutils/patches/2.20.1/110-arm-eabi-conf.patch b/toolchain/binutils/patches/2.20.1/110-arm-eabi-conf.patch new file mode 100644 index 000000000..74c9653e5 --- /dev/null +++ b/toolchain/binutils/patches/2.20.1/110-arm-eabi-conf.patch @@ -0,0 +1,22 @@ +--- a/configure ++++ b/configure +@@ -3086,7 +3086,7 @@ case "${target}" in + noconfigdirs="$noconfigdirs target-libffi target-qthreads" + libgloss_dir=arm + ;; +- arm*-*-linux-gnueabi) ++ arm*-*-linux-*gnueabi) + noconfigdirs="$noconfigdirs target-qthreads" + case ${with_newlib} in + no) noconfigdirs="$noconfigdirs target-newlib target-libgloss" +--- a/configure.ac ++++ b/configure.ac +@@ -573,7 +573,7 @@ case "${target}" in + noconfigdirs="$noconfigdirs target-libffi target-qthreads" + libgloss_dir=arm + ;; +- arm*-*-linux-gnueabi) ++ arm*-*-linux-*gnueabi) + noconfigdirs="$noconfigdirs target-qthreads" + case ${with_newlib} in + no) noconfigdirs="$noconfigdirs target-newlib target-libgloss" diff --git a/toolchain/binutils/patches/2.20.1/111-pr7093.elf32-arm.c.patch b/toolchain/binutils/patches/2.20.1/111-pr7093.elf32-arm.c.patch new file mode 100644 index 000000000..76aa34372 --- /dev/null +++ b/toolchain/binutils/patches/2.20.1/111-pr7093.elf32-arm.c.patch @@ -0,0 +1,13 @@ +--- a/bfd/elf32-arm.c ++++ b/bfd/elf32-arm.c +@@ -5511,6 +5511,10 @@ bfd_elf32_arm_init_maps (bfd *abfd) + if (! is_arm_elf (abfd)) + return; + ++ /* PR 7093: Make sure that we are dealing with an arm elf binary. */ ++ if (! is_arm_elf (abfd)) ++ return; ++ + if ((abfd->flags & DYNAMIC) != 0) + return; + diff --git a/toolchain/binutils/patches/2.20.1/120-sh-conf.patch b/toolchain/binutils/patches/2.20.1/120-sh-conf.patch new file mode 100644 index 000000000..030fff375 --- /dev/null +++ b/toolchain/binutils/patches/2.20.1/120-sh-conf.patch @@ -0,0 +1,40 @@ +--- a/configure ++++ b/configure +@@ -3054,7 +3054,7 @@ case "${target}" in + am33_2.0-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; +- sh-*-linux*) ++ sh*-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; + sh*-*-pe|mips*-*-pe|*arm-wince-pe) +@@ -3390,7 +3390,7 @@ case "${target}" in + romp-*-*) + noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes target-libgloss ${libgcj}" + ;; +- sh-*-* | sh64-*-*) ++ sh*-*-* | sh64-*-*) + case "${host}" in + i[3456789]86-*-vsta) ;; # don't add gprof back in + i[3456789]86-*-go32*) ;; # don't add gprof back in +--- a/configure.ac ++++ b/configure.ac +@@ -541,7 +541,7 @@ case "${target}" in + am33_2.0-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; +- sh-*-linux*) ++ sh*-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; + sh*-*-pe|mips*-*-pe|*arm-wince-pe) +@@ -877,7 +877,7 @@ case "${target}" in + romp-*-*) + noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes target-libgloss ${libgcj}" + ;; +- sh-*-* | sh64-*-*) ++ sh*-*-* | sh64-*-*) + case "${host}" in + i[[3456789]]86-*-vsta) ;; # don't add gprof back in + i[[3456789]]86-*-go32*) ;; # don't add gprof back in diff --git a/toolchain/binutils/patches/2.20.1/200-mips_non_pic.patch b/toolchain/binutils/patches/2.20.1/200-mips_non_pic.patch new file mode 100644 index 000000000..56891432e --- /dev/null +++ b/toolchain/binutils/patches/2.20.1/200-mips_non_pic.patch @@ -0,0 +1,209 @@ +--- a/bfd/elf32-mips.c ++++ b/bfd/elf32-mips.c +@@ -1663,6 +1663,15 @@ static const struct ecoff_debug_swap mip + #define elf_backend_plt_readonly 1 + #define elf_backend_plt_sym_val _bfd_mips_elf_plt_sym_val + ++/* Most MIPS ELF files do not contain a traditional PLT; only VxWorks ++ and non-PIC dynamic executables do. These settings only affect ++ _bfd_elf_create_dynamic_sections, which is only called when we ++ do want a traditional PLT. */ ++#undef elf_backend_want_plt_sym ++#define elf_backend_want_plt_sym 1 ++#undef elf_backend_plt_readonly ++#define elf_backend_plt_readonly 1 ++ + #define elf_backend_discard_info _bfd_mips_elf_discard_info + #define elf_backend_ignore_discarded_relocs \ + _bfd_mips_elf_ignore_discarded_relocs +@@ -1687,6 +1696,8 @@ static const struct ecoff_debug_swap mip + #define bfd_elf32_bfd_print_private_bfd_data \ + _bfd_mips_elf_print_private_bfd_data + ++#define elf_backend_plt_sym_val _bfd_mips_elf_plt_sym_val ++ + /* Support for SGI-ish mips targets. */ + #define TARGET_LITTLE_SYM bfd_elf32_littlemips_vec + #define TARGET_LITTLE_NAME "elf32-littlemips" +@@ -1790,6 +1801,7 @@ mips_vxworks_final_write_processing (bfd + #undef elf_backend_additional_program_headers + #undef elf_backend_modify_segment_map + #undef elf_backend_symbol_processing ++#undef elf_backend_plt_sym_val + /* NOTE: elf_backend_rela_normal is not defined for MIPS. */ + + #include "elf32-target.h" +--- a/bfd/elfxx-mips.c ++++ b/bfd/elfxx-mips.c +@@ -694,6 +694,11 @@ static bfd *reldyn_sorting_bfd; + /* Nonzero if ABFD is using NewABI conventions. */ + #define NEWABI_P(abfd) (ABI_N32_P (abfd) || ABI_64_P (abfd)) + ++/* Nonzero if ABFD is a non-PIC object. */ ++#define NON_PIC_P(abfd) \ ++ (((elf_elfheader (abfd)->e_flags & EF_MIPS_PIC) == 0) \ ++ && ((elf_elfheader (abfd)->e_flags & EF_MIPS_CPIC) == EF_MIPS_CPIC)) ++ + /* The IRIX compatibility level we are striving for. */ + #define IRIX_COMPAT(abfd) \ + (get_elf_backend_data (abfd)->elf_backend_mips_irix_compat (abfd)) +@@ -706,6 +711,9 @@ static bfd *reldyn_sorting_bfd; + #define MIPS_ELF_OPTIONS_SECTION_NAME(abfd) \ + (NEWABI_P (abfd) ? ".MIPS.options" : ".options") + ++/* The name of the section holding non-PIC to PIC call stubs. */ ++#define NON_PIC_TO_PIC_STUB_SECTION_NAME ".MIPS.pic_stubs" ++ + /* True if NAME is the recognized name of any SHT_MIPS_OPTIONS section. + Some IRIX system files do not use MIPS_ELF_OPTIONS_SECTION_NAME. */ + #define MIPS_ELF_OPTIONS_SECTION_NAME_P(NAME) \ +@@ -7619,7 +7627,9 @@ _bfd_mips_elf_check_relocs (bfd *abfd, s + + /* We need a stub, not a plt entry for the undefined + function. But we record it as if it needs plt. See +- _bfd_elf_adjust_dynamic_symbol. */ ++ _bfd_elf_adjust_dynamic_symbol. Note that these relocations ++ are always used for PIC calls, even when using the new ++ non-PIC ABI. */ + h->needs_plt = 1; + h->type = STT_FUNC; + } +@@ -7725,6 +7735,8 @@ _bfd_mips_elf_check_relocs (bfd *abfd, s + case R_MIPS_32: + case R_MIPS_REL32: + case R_MIPS_64: ++ if (h != NULL) ++ h->non_got_ref = TRUE; + /* In VxWorks executables, references to external symbols + are handled using copy relocs or PLT stubs, so there's + no need to add a .rela.dyn entry for this relocation. */ +@@ -7780,11 +7792,21 @@ _bfd_mips_elf_check_relocs (bfd *abfd, s + case R_MIPS_GPREL16: + case R_MIPS_LITERAL: + case R_MIPS_GPREL32: ++ if (h != NULL ++ && (r_type == R_MIPS_GPREL16 || r_type == R_MIPS_GPREL32)) ++ h->non_got_ref = TRUE; ++ + if (SGI_COMPAT (abfd)) + mips_elf_hash_table (info)->compact_rel_size += + sizeof (Elf32_External_crinfo); + break; + ++ case R_MIPS_HI16: ++ case R_MIPS_LO16: ++ if (h != NULL && strcmp (h->root.root.string, "_gp_disp") != 0) ++ h->non_got_ref = TRUE; ++ break; ++ + /* This relocation describes the C++ object vtable hierarchy. + Reconstruct it for later use during GC. */ + case R_MIPS_GNU_VTINHERIT: +@@ -7807,20 +7829,20 @@ _bfd_mips_elf_check_relocs (bfd *abfd, s + + /* We must not create a stub for a symbol that has relocations + related to taking the function's address. This doesn't apply to +- VxWorks, where CALL relocs refer to a .got.plt entry instead of +- a normal .got entry. */ ++ VxWorks or the non-PIC ABI, where CALL relocs refer to a ++ .got.plt entry instead of a normal .got entry. */ + if (!htab->is_vxworks && h != NULL) + switch (r_type) + { +- default: +- ((struct mips_elf_link_hash_entry *) h)->no_fn_stub = TRUE; +- break; + case R_MIPS16_CALL16: + case R_MIPS_CALL16: + case R_MIPS_CALL_HI16: + case R_MIPS_CALL_LO16: + case R_MIPS_JALR: + break; ++ default: ++ ((struct mips_elf_link_hash_entry *) h)->no_fn_stub = TRUE; ++ break; + } + + /* See if this reloc would need to refer to a MIPS16 hard-float stub, +@@ -12514,7 +12536,9 @@ _bfd_mips_elf_merge_private_bfd_data (bf + break; + } + } +- if (null_input_bfd) ++ /* Dynamic objects normally have no sections, and do not reach ++ here - but they might if used as DYNOBJ. */ ++ if (null_input_bfd || (ibfd->flags & DYNAMIC) != 0) + return TRUE; + + ok = TRUE; +--- a/bfd/elfxx-mips.h ++++ b/bfd/elfxx-mips.h +@@ -63,6 +63,9 @@ extern bfd_boolean _bfd_mips_elf_finish_ + extern bfd_boolean _bfd_mips_vxworks_finish_dynamic_symbol + (bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, + Elf_Internal_Sym *); ++extern bfd_boolean _bfd_mips_nonpic_finish_dynamic_symbol ++ (bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, ++ Elf_Internal_Sym *); + extern bfd_boolean _bfd_mips_elf_finish_dynamic_sections + (bfd *, struct bfd_link_info *); + extern void _bfd_mips_elf_final_write_processing +@@ -153,6 +156,15 @@ extern const struct bfd_elf_special_sect + + extern bfd_boolean _bfd_mips_elf_common_definition (Elf_Internal_Sym *); + ++extern bfd_vma _bfd_mips_elf_plt_sym_val ++ (bfd_vma, const asection *, const arelent *); ++extern void _bfd_mips_elf_begin_write_processing ++ (bfd *abfd, struct bfd_link_info *link_info); ++extern bfd_boolean bfd_mips_elf_maybe_create_non_pic_to_pic_stubs_section ++ (struct bfd_link_info *); ++extern void _bfd_mips_post_process_headers ++ (bfd *abfd, struct bfd_link_info *link_info); ++ + #define elf_backend_common_definition _bfd_mips_elf_common_definition + #define elf_backend_name_local_section_symbols \ + _bfd_mips_elf_name_local_section_symbols +--- a/gas/config/tc-mips.c ++++ b/gas/config/tc-mips.c +@@ -1891,6 +1891,12 @@ md_begin (void) + as_bad (_("-G may not be used in position-independent code")); + g_switch_value = 0; + } ++ else if (mips_abicalls) ++ { ++ if (g_switch_seen && g_switch_value != 0) ++ as_bad (_("-G may not be used with abicalls")); ++ g_switch_value = 0; ++ } + + if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch)) + as_warn (_("Could not set architecture and machine")); +@@ -11264,6 +11264,7 @@ + OPTION_PDR, + OPTION_NO_PDR, + OPTION_MVXWORKS_PIC, ++ OPTION_NON_PIC_ABICALLS, + #endif /* OBJ_ELF */ + OPTION_END_OF_ENUM + }; +@@ -11365,6 +11372,7 @@ struct option md_longopts[] = + {"mpdr", no_argument, NULL, OPTION_PDR}, + {"mno-pdr", no_argument, NULL, OPTION_NO_PDR}, + {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC}, ++ {"mnon-pic-abicalls", no_argument, NULL, OPTION_NON_PIC_ABICALLS}, + #endif /* OBJ_ELF */ + + {NULL, no_argument, NULL, 0} +@@ -11783,6 +11791,11 @@ md_parse_option (int c, char *arg) + case OPTION_MVXWORKS_PIC: + mips_pic = VXWORKS_PIC; + break; ++ ++ case OPTION_NON_PIC_ABICALLS: ++ mips_pic = NO_PIC; ++ mips_abicalls = TRUE; ++ break; + #endif /* OBJ_ELF */ + + default: diff --git a/toolchain/binutils/patches/2.20.1/300-001_ld_makefile_patch.patch b/toolchain/binutils/patches/2.20.1/300-001_ld_makefile_patch.patch new file mode 100644 index 000000000..3ca4a5866 --- /dev/null +++ b/toolchain/binutils/patches/2.20.1/300-001_ld_makefile_patch.patch @@ -0,0 +1,22 @@ +--- a/ld/Makefile.am ++++ b/ld/Makefile.am +@@ -24,7 +24,7 @@ AM_CFLAGS = $(WARN_CFLAGS) + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +--- a/ld/Makefile.in ++++ b/ld/Makefile.in +@@ -333,7 +333,7 @@ AM_CFLAGS = $(WARN_CFLAGS) + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + BASEDIR = $(srcdir)/.. + BFDDIR = $(BASEDIR)/bfd + INCDIR = $(BASEDIR)/include diff --git a/toolchain/binutils/patches/2.20.1/300-012_check_ldrunpath_length.patch b/toolchain/binutils/patches/2.20.1/300-012_check_ldrunpath_length.patch new file mode 100644 index 000000000..08072a429 --- /dev/null +++ b/toolchain/binutils/patches/2.20.1/300-012_check_ldrunpath_length.patch @@ -0,0 +1,20 @@ +--- a/ld/emultempl/elf32.em ++++ b/ld/emultempl/elf32.em +@@ -1233,6 +1233,8 @@ fragment <<EOF + && command_line.rpath == NULL) + { + lib_path = (const char *) getenv ("LD_RUN_PATH"); ++ if ((lib_path) && (strlen (lib_path) == 0)) ++ lib_path = NULL; + if (gld${EMULATION_NAME}_search_needed (lib_path, &n, + force)) + break; +@@ -1418,6 +1420,8 @@ gld${EMULATION_NAME}_before_allocation ( + rpath = command_line.rpath; + if (rpath == NULL) + rpath = (const char *) getenv ("LD_RUN_PATH"); ++ if ((rpath) && (strlen (rpath) == 0)) ++ rpath = NULL; + if (! (bfd_elf_size_dynamic_sections + (link_info.output_bfd, command_line.soname, rpath, + command_line.filter_shlib, |