X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Femultempl%2Farmelf.em;h=34028eefac49ff7232f7f5b1406d8e1fb0e3dabe;hb=7341d5e22f1061016411734ba162d362ac5928db;hp=948bf8d7f93c1d81460d15e4a0fefca2e9081756;hpb=35fc36a8d684a136f959212c873945844be76971;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/emultempl/armelf.em b/ld/emultempl/armelf.em index 948bf8d7f9..34028eefac 100644 --- a/ld/emultempl/armelf.em +++ b/ld/emultempl/armelf.em @@ -1,7 +1,5 @@ # This shell script emits a C file. -*- C -*- -# Copyright 1991, 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, -# 2004, 2005, 2006, 2007, 2008, 2009 -# Free Software Foundation, Inc. +# Copyright (C) 1991-2014 Free Software Foundation, Inc. # # This file is part of the GNU Binutils. # @@ -30,10 +28,10 @@ fragment <the_bfd, stub_sec, 3); + bfd_set_section_alignment (stub_file->the_bfd, stub_sec, alignment_power); output_section = input_section->output_section; - secname = bfd_get_section_name (output_section->owner, output_section); - os = lang_output_section_find (secname); + os = lang_output_section_get (output_section); info.input_section = input_section; lang_list_init (&info.add); - lang_add_section (&info.add, stub_sec, os); + lang_add_section (&info.add, stub_sec, NULL, os); if (info.add.head == NULL) goto err_ret; @@ -239,7 +238,7 @@ build_section_lists (lang_statement_union_type *statement) { asection *i = statement->input_section.section; - if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag + if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS && (i->flags & SEC_EXCLUDE) == 0 && i->output_section != NULL && i->output_section->owner == link_info.output_bfd) @@ -253,19 +252,19 @@ compare_output_sec_vma (const void *a, const void *b) asection *asec = *(asection **) a, *bsec = *(asection **) b; asection *aout = asec->output_section, *bout = bsec->output_section; bfd_vma avma, bvma; - + /* If there's no output section for some reason, compare equal. */ if (!aout || !bout) return 0; - + avma = aout->vma + asec->output_offset; bvma = bout->vma + bsec->output_offset; - + if (avma > bvma) return 1; else if (avma < bvma) return -1; - + return 0; } @@ -285,10 +284,10 @@ gld${EMULATION_NAME}_after_allocation (void) { bfd *abfd = is->the_bfd; asection *sec; - + if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0) continue; - + for (sec = abfd->sections; sec != NULL; sec = sec->next) { asection *out_sec = sec->output_section; @@ -298,13 +297,13 @@ gld${EMULATION_NAME}_after_allocation (void) && elf_section_type (sec) == SHT_PROGBITS && (elf_section_flags (sec) & SHF_EXECINSTR) != 0 && (sec->flags & SEC_EXCLUDE) == 0 - && sec->sec_info_type != ELF_INFO_TYPE_JUST_SYMS + && sec->sec_info_type != SEC_INFO_TYPE_JUST_SYMS && out_sec != bfd_abs_section_ptr) { if (sec_count == list_size) { list_size *= 2; - sec_list = (asection **) + sec_list = (asection **) xrealloc (sec_list, list_size * sizeof (asection *)); } @@ -312,13 +311,13 @@ gld${EMULATION_NAME}_after_allocation (void) } } } - + qsort (sec_list, sec_count, sizeof (asection *), &compare_output_sec_vma); - + if (elf32_arm_fix_exidx_coverage (sec_list, sec_count, &link_info, merge_exidx_entries)) need_laying_out = 1; - + free (sec_list); } @@ -464,7 +463,8 @@ arm_elf_create_output_section_statements (void) target2_type, fix_v4bx, use_blx, vfp11_denorm_fix, no_enum_size_warning, no_wchar_size_warning, - pic_veneer, fix_cortex_a8); + pic_veneer, fix_cortex_a8, + fix_arm1176); stub_file = lang_add_input_file ("linker stubs", lang_input_file_is_fake_enum, @@ -478,7 +478,7 @@ arm_elf_create_output_section_statements (void) einfo ("%X%P: can not create BFD %E\n"); return; } - + stub_file->the_bfd->flags |= BFD_LINKER_CREATED; ldlang_add_file (stub_file); @@ -529,6 +529,9 @@ PARSE_AND_LIST_PROLOGUE=' #define OPTION_FIX_CORTEX_A8 314 #define OPTION_NO_FIX_CORTEX_A8 315 #define OPTION_NO_MERGE_EXIDX_ENTRIES 316 +#define OPTION_FIX_ARM1176 317 +#define OPTION_NO_FIX_ARM1176 318 +#define OPTION_LONG_PLT 319 ' PARSE_AND_LIST_SHORTOPTS=p @@ -551,6 +554,9 @@ PARSE_AND_LIST_LONGOPTS=' { "fix-cortex-a8", no_argument, NULL, OPTION_FIX_CORTEX_A8 }, { "no-fix-cortex-a8", no_argument, NULL, OPTION_NO_FIX_CORTEX_A8 }, { "no-merge-exidx-entries", no_argument, NULL, OPTION_NO_MERGE_EXIDX_ENTRIES }, + { "fix-arm1176", no_argument, NULL, OPTION_FIX_ARM1176 }, + { "no-fix-arm1176", no_argument, NULL, OPTION_NO_FIX_ARM1176 }, + { "long-plt", no_argument, NULL, OPTION_LONG_PLT }, ' PARSE_AND_LIST_OPTIONS=' @@ -565,21 +571,23 @@ PARSE_AND_LIST_OPTIONS=' fprintf (file, _(" --vfp11-denorm-fix Specify how to fix VFP11 denorm erratum\n")); fprintf (file, _(" --no-enum-size-warning Don'\''t warn about objects with incompatible\n" " enum sizes\n")); - fprintf (file, _(" --no-wchar-size-warning Don'\''t warn about objects with incompatible" + fprintf (file, _(" --no-wchar-size-warning Don'\''t warn about objects with incompatible\n" " wchar_t sizes\n")); fprintf (file, _(" --pic-veneer Always generate PIC interworking veneers\n")); + fprintf (file, _(" --long-plt Generate long .plt entries\n" + " to handle large .plt/.got displacements\n")); fprintf (file, _("\ - --stub-group-size=N Maximum size of a group of input sections that can be\n\ - handled by one stub section. A negative value\n\ - locates all stubs after their branches (with a\n\ - group size of -N), while a positive value allows\n\ - two groups of input sections, one before, and one\n\ - after each stub section. Values of +/-1 indicate\n\ - the linker should choose suitable defaults.\n" - )); + --stub-group-size=N Maximum size of a group of input sections that\n\ + can be handled by one stub section. A negative\n\ + value locates all stubs after their branches\n\ + (with a group size of -N), while a positive\n\ + value allows two groups of input sections, one\n\ + before, and one after each stub section.\n\ + Values of +/-1 indicate the linker should\n\ + choose suitable defaults.\n")); fprintf (file, _(" --[no-]fix-cortex-a8 Disable/enable Cortex-A8 Thumb-2 branch erratum fix\n")); fprintf (file, _(" --no-merge-exidx-entries Disable merging exidx entries\n")); - + fprintf (file, _(" --[no-]fix-arm1176 Disable/enable ARM1176 BLX immediate erratum fix\n")); ' PARSE_AND_LIST_ARGS_CASES=' @@ -662,7 +670,19 @@ PARSE_AND_LIST_ARGS_CASES=' case OPTION_NO_MERGE_EXIDX_ENTRIES: merge_exidx_entries = 0; + break; + + case OPTION_FIX_ARM1176: + fix_arm1176 = 1; + break; + + case OPTION_NO_FIX_ARM1176: + fix_arm1176 = 0; + break; + case OPTION_LONG_PLT: + bfd_elf32_arm_use_long_plt (); + break; ' # We have our own before_allocation etc. functions, but they call