1# This shell script emits a C file. -*- C -*- 2# Copyright (C) 2006-2016 Free Software Foundation, Inc. 3# 4# This file is part of the GNU Binutils. 5# 6# This program is free software; you can redistribute it and/or modify 7# it under the terms of the GNU General Public License as published by 8# the Free Software Foundation; either version 3 of the License, or 9# (at your option) any later version. 10# 11# This program is distributed in the hope that it will be useful, 12# but WITHOUT ANY WARRANTY; without even the implied warranty of 13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14# GNU General Public License for more details. 15# 16# You should have received a copy of the GNU General Public License 17# along with this program; if not, write to the Free Software 18# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 19# MA 02110-1301, USA. 20# 21 22# This file is sourced from elf32.em and from ELF targets that use 23# generic.em. 24# 25fragment <<EOF 26 27static void 28gld${EMULATION_NAME}_map_segments (bfd_boolean need_layout) 29{ 30 int tries = 10; 31 32 do 33 { 34 lang_relax_sections (need_layout); 35 need_layout = FALSE; 36 37 if (link_info.output_bfd->xvec->flavour == bfd_target_elf_flavour 38 && !bfd_link_relocatable (&link_info)) 39 { 40 bfd_size_type phdr_size; 41 42 phdr_size = elf_program_header_size (link_info.output_bfd); 43 /* If we don't have user supplied phdrs, throw away any 44 previous linker generated program headers. */ 45 if (lang_phdr_list == NULL) 46 elf_seg_map (link_info.output_bfd) = NULL; 47 if (!_bfd_elf_map_sections_to_segments (link_info.output_bfd, 48 &link_info)) 49 einfo ("%F%P: map sections to segments failed: %E\n"); 50 51 if (phdr_size != elf_program_header_size (link_info.output_bfd)) 52 { 53 if (tries > 6) 54 /* The first few times we allow any change to 55 phdr_size . */ 56 need_layout = TRUE; 57 else if (phdr_size 58 < elf_program_header_size (link_info.output_bfd)) 59 /* After that we only allow the size to grow. */ 60 need_layout = TRUE; 61 else 62 elf_program_header_size (link_info.output_bfd) = phdr_size; 63 } 64 } 65 } 66 while (need_layout && --tries); 67 68 if (tries == 0) 69 einfo (_("%P%F: looping in map_segments")); 70} 71EOF 72