forked from openwrt/openwrt
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
SVN-Revision: 18263
- Loading branch information
Felix Fietkau
committed
Nov 2, 2009
1 parent
426c8da
commit 4fd397f
Showing
8 changed files
with
328 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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" |
13 changes: 13 additions & 0 deletions
13
toolchain/binutils/patches/2.20/111-pr7093.elf32-arm.c.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,202 @@ | ||
--- 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")); | ||
@@ -11359,6 +11365,8 @@ 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}, | ||
+#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} | ||
@@ -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: |
22 changes: 22 additions & 0 deletions
22
toolchain/binutils/patches/2.20/300-001_ld_makefile_patch.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
20 changes: 20 additions & 0 deletions
20
toolchain/binutils/patches/2.20/300-012_check_ldrunpath_length.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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, |