binutils: remove some unused obsolete versions

Signed-off-by: Felix Fietkau <nbd@openwrt.org>

SVN-Revision: 37093
v19.07.3_mercusys_ac12_duma
Felix Fietkau 11 years ago
parent 8221b89088
commit 6260e6ef48

@ -7,17 +7,10 @@ choice
help
Select the version of binutils you wish to use.
config BINUTILS_VERSION_2_19_1
bool "binutils 2.19.1"
config BINUTILS_VERSION_2_20_1
depends on avr32
bool "binutils 2.20.1"
config BINUTILS_VERSION_2_21_1
depends on !avr32 || (avr32 && BROKEN)
bool "binutils 2.21.1"
config BINUTILS_VERSION_2_22
depends on !avr32 || (avr32 && BROKEN)
bool "binutils 2.22"
@ -38,9 +31,7 @@ config EXTRA_BINUTILS_CONFIG_OPTIONS
config BINUTILS_VERSION
string
prompt "Binutils Version" if (TOOLCHAINOPTS && NULL)
default "2.19.1" if BINUTILS_VERSION_2_19_1
default "2.20.1" if BINUTILS_VERSION_2_20_1
default "2.21.1" if BINUTILS_VERSION_2_21_1
default "2.22" if BINUTILS_VERSION_2_22
default "2.23.1" if BINUTILS_VERSION_2_23_1
default "2.20.1" if avr32

@ -13,15 +13,9 @@ BIN_VERSION:=$(PKG_VERSION)
PKG_SOURCE_URL:=@GNU/binutils/
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
ifeq ($(PKG_VERSION),2.19.1)
PKG_MD5SUM:=023222f392e9546bcbb0b4c0960729be
endif
ifeq ($(PKG_VERSION),2.20.1)
PKG_MD5SUM:=9cdfb9d6ec0578c166d3beae5e15c4e5
endif
ifeq ($(PKG_VERSION),2.21.1)
PKG_MD5SUM:=bde820eac53fa3a8d8696667418557ad
endif
ifeq ($(PKG_VERSION),2.22)
PKG_MD5SUM:=ee0f10756c84979622b992a4a61ea3f5
endif

@ -1,22 +0,0 @@
--- a/configure
+++ b/configure
@@ -2313,7 +2313,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
@@ -562,7 +562,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"

@ -1,13 +0,0 @@
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -4621,6 +4621,10 @@ bfd_elf32_arm_init_maps (bfd *abfd)
Elf_Internal_Shdr *hdr;
unsigned int i, localsyms;
+ /* 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;

@ -1,35 +0,0 @@
Source: Khem Raj <raj.khem@gmail.com>
Disposition: submit upstream.
Description:
We do not need to have the libtool patch anymore for binutils after
libtool has been updated upstream it include support for it. However
for building gas natively on uclibc systems we have to link it with
-lm so that it picks up missing symbols.
/local/build_area/BUILD/arm_v5t_le_uclibc/binutils-2.17.50/objdir/libiberty/pic/libiberty.a(floatformat.o): In function `floatformat_from_double':
floatformat.c:(.text+0x1ec): undefined reference to `frexp'
floatformat.c:(.text+0x2f8): undefined reference to `ldexp'
/local/build_area/BUILD/arm_v5t_le_uclibc/binutils-2.17.50/objdir/libiberty/pic/libiberty.a(floatformat.o): In function `floatformat_to_double':
floatformat.c:(.text+0x38a): undefined reference to `ldexp'
floatformat.c:(.text+0x3d2): undefined reference to `ldexp'
floatformat.c:(.text+0x43e): undefined reference to `ldexp' floatformat.c:(.text+0x4e2): undefined reference to `ldexp'
collect2: ld returned 1 exit status
make[4]: *** [as-new] Error 1
--- a/gas/configure.tgt
+++ b/gas/configure.tgt
@@ -415,6 +415,12 @@ case ${generic_target} in
*-*-netware) fmt=elf em=netware ;;
esac
+case ${generic_target} in
+ arm-*-*uclibc*)
+ need_libm=yes
+ ;;
+esac
+
case ${cpu_type} in
alpha | arm | i386 | ia64 | mips | ns32k | pdp11 | ppc | sparc | z80 | z8k)
bfd_gas=yes

@ -1,40 +0,0 @@
--- a/configure
+++ b/configure
@@ -2281,7 +2281,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)
@@ -2606,7 +2606,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
@@ -530,7 +530,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)
@@ -855,7 +855,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

@ -1,202 +0,0 @@
--- a/bfd/elf32-mips.c
+++ b/bfd/elf32-mips.c
@@ -1662,6 +1662,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
@@ -1686,6 +1695,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"
@@ -1789,6 +1800,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
@@ -677,6 +677,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))
@@ -689,6 +694,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) \
@@ -7583,7 +7591,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;
}
@@ -7689,6 +7699,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. */
@@ -7744,11 +7756,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:
@@ -7771,20 +7793,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,
@@ -12458,7 +12480,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
@@ -1874,6 +1874,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"));
@@ -11254,6 +11260,8 @@ struct option md_longopts[] =
{"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
#define OPTION_MVXWORKS_PIC (OPTION_ELF_BASE + 12)
{"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
+#define OPTION_NON_PIC_ABICALLS (OPTION_ELF_BASE + 13)
+ {"mnon-pic-abicalls", no_argument, NULL, OPTION_NON_PIC_ABICALLS},
#endif /* OBJ_ELF */
{NULL, no_argument, NULL, 0}
@@ -11672,6 +11680,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:

@ -1,22 +0,0 @@
--- a/ld/Makefile.am
+++ b/ld/Makefile.am
@@ -18,7 +18,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
@@ -291,7 +291,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

@ -1,20 +0,0 @@
--- a/ld/emultempl/elf32.em
+++ b/ld/emultempl/elf32.em
@@ -1219,6 +1219,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;
@@ -1404,6 +1406,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,

File diff suppressed because it is too large Load Diff

@ -1,22 +0,0 @@
--- a/configure
+++ b/configure
@@ -3180,7 +3180,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
@@ -652,7 +652,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"

@ -1,13 +0,0 @@
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -5637,6 +5637,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;

@ -1,35 +0,0 @@
Source: Khem Raj <raj.khem@gmail.com>
Disposition: submit upstream.
Description:
We do not need to have the libtool patch anymore for binutils after
libtool has been updated upstream it include support for it. However
for building gas natively on uclibc systems we have to link it with
-lm so that it picks up missing symbols.
/local/build_area/BUILD/arm_v5t_le_uclibc/binutils-2.17.50/objdir/libiberty/pic/libiberty.a(floatformat.o): In function `floatformat_from_double':
floatformat.c:(.text+0x1ec): undefined reference to `frexp'
floatformat.c:(.text+0x2f8): undefined reference to `ldexp'
/local/build_area/BUILD/arm_v5t_le_uclibc/binutils-2.17.50/objdir/libiberty/pic/libiberty.a(floatformat.o): In function `floatformat_to_double':
floatformat.c:(.text+0x38a): undefined reference to `ldexp'
floatformat.c:(.text+0x3d2): undefined reference to `ldexp'
floatformat.c:(.text+0x43e): undefined reference to `ldexp' floatformat.c:(.text+0x4e2): undefined reference to `ldexp'
collect2: ld returned 1 exit status
make[4]: *** [as-new] Error 1
--- a/gas/configure.tgt
+++ b/gas/configure.tgt
@@ -432,6 +432,12 @@ case ${generic_target} in
*-*-netware) fmt=elf em=netware ;;
esac
+case ${generic_target} in
+ arm-*-*uclibc*)
+ need_libm=yes
+ ;;
+esac
+
case ${cpu_type} in
alpha | arm | i386 | ia64 | microblaze | mips | ns32k | pdp11 | ppc | sparc | z80 | z8k)
bfd_gas=yes

@ -1,40 +0,0 @@
--- a/configure
+++ b/configure
@@ -3148,7 +3148,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)
@@ -3487,7 +3487,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
@@ -620,7 +620,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)
@@ -959,7 +959,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

@ -1,209 +0,0 @@
--- 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
@@ -1686,6 +1695,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"
@@ -1789,6 +1800,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
@@ -713,6 +713,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))
@@ -725,6 +730,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) \
@@ -7690,7 +7698,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;
}
@@ -7796,6 +7806,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. */
@@ -7851,11 +7863,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:
@@ -7878,20 +7900,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,
@@ -12607,7 +12629,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
@@ -64,6 +64,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
@@ -158,6 +161,15 @@ gprel16_reloc_p (unsigned int r_type)
return r_type == R_MIPS_GPREL16 || r_type == R_MIPS16_GPREL;
}
+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
@@ -1900,6 +1900,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"));
@@ -11256,6 +11262,7 @@ enum options
OPTION_PDR,
OPTION_NO_PDR,
OPTION_MVXWORKS_PIC,
+ OPTION_NON_PIC_ABICALLS,
#endif /* OBJ_ELF */
OPTION_END_OF_ENUM
};
@@ -11363,6 +11370,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}
@@ -11811,6 +11819,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:

@ -1,22 +0,0 @@
--- a/ld/Makefile.am
+++ b/ld/Makefile.am
@@ -37,7 +37,7 @@ endif
# 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
@@ -365,7 +365,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

@ -1,20 +0,0 @@
--- a/ld/emultempl/elf32.em
+++ b/ld/emultempl/elf32.em
@@ -1272,6 +1272,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;
@@ -1499,6 +1501,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;
for (abfd = link_info.input_bfds; abfd; abfd = abfd->link_next)
if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save