X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Femultempl%2Felf-generic.em;h=32c102dda4c8909a240ee1981767b857750f9259;hb=8056826a68e7cb370425c56703a52af98fa159fe;hp=dd0907ccf82c8bac9746281ed2416eb5870862f3;hpb=00bb149b2841c91bab43c976161e87fe26c86092;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/emultempl/elf-generic.em b/ld/emultempl/elf-generic.em index dd0907ccf8..32c102dda4 100644 --- a/ld/emultempl/elf-generic.em +++ b/ld/emultempl/elf-generic.em @@ -1,11 +1,11 @@ # This shell script emits a C file. -*- C -*- -# Copyright 2006 Free Software Foundation, Inc. +# Copyright (C) 2006-2014 Free Software Foundation, Inc. # -# This file is part of GLD, the Gnu Linker. +# This file is part of the GNU Binutils. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, @@ -14,14 +14,15 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +# MA 02110-1301, USA. # # This file is sourced from elf32.em and from ELF targets that use # generic.em. # -cat >>e${EMULATION_NAME}.c <xvec->flavour == bfd_target_elf_flavour + if (link_info.output_bfd->xvec->flavour == bfd_target_elf_flavour && !link_info.relocatable) { bfd_size_type phdr_size; - phdr_size = elf_tdata (output_bfd)->program_header_size; + phdr_size = elf_program_header_size (link_info.output_bfd); /* If we don't have user supplied phdrs, throw away any previous linker generated program headers. */ if (lang_phdr_list == NULL) - elf_tdata (output_bfd)->segment_map = NULL; - if (!_bfd_elf_map_sections_to_segments (output_bfd, &link_info)) + elf_seg_map (link_info.output_bfd) = NULL; + if (!_bfd_elf_map_sections_to_segments (link_info.output_bfd, + &link_info)) einfo ("%F%P: map sections to segments failed: %E\n"); - if (phdr_size != elf_tdata (output_bfd)->program_header_size) - need_layout = TRUE; + if (phdr_size != elf_program_header_size (link_info.output_bfd)) + { + if (tries > 6) + /* The first few times we allow any change to + phdr_size . */ + need_layout = TRUE; + else if (phdr_size + < elf_program_header_size (link_info.output_bfd)) + /* After that we only allow the size to grow. */ + need_layout = TRUE; + else + elf_program_header_size (link_info.output_bfd) = phdr_size; + } } } while (need_layout && --tries);