OLD | NEW |
1 /* Lattice Mico32-specific support for 32-bit ELF | 1 /* Lattice Mico32-specific support for 32-bit ELF |
2 Copyright 2008, 2009, 2010, 2011 Free Software Foundation, Inc. | 2 Copyright 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. |
3 Contributed by Jon Beniston <jon@beniston.com> | 3 Contributed by Jon Beniston <jon@beniston.com> |
4 | 4 |
5 This file is part of BFD, the Binary File Descriptor library. | 5 This file is part of BFD, the Binary File Descriptor library. |
6 | 6 |
7 This program is free software; you can redistribute it and/or modify | 7 This program is free software; you can redistribute it and/or modify |
8 it under the terms of the GNU General Public License as published by | 8 it under the terms of the GNU General Public License as published by |
9 the Free Software Foundation; either version 3 of the License, or | 9 the Free Software Foundation; either version 3 of the License, or |
10 (at your option) any later version. | 10 (at your option) any later version. |
11 | 11 |
12 This program is distributed in the hope that it will be useful, | 12 This program is distributed in the hope that it will be useful, |
13 but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 GNU General Public License for more details. | 15 GNU General Public License for more details. |
16 | 16 |
17 You should have received a copy of the GNU General Public License | 17 You should have received a copy of the GNU General Public License |
18 along with this program; if not, write to the Free Software | 18 along with this program; if not, write to the Free Software |
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, | 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
20 MA 02110-1301, USA. */ | 20 MA 02110-1301, USA. */ |
21 | 21 |
| 22 #include "sysdep.h" |
22 #include "bfd.h" | 23 #include "bfd.h" |
23 #include "sysdep.h" | |
24 #include "libbfd.h" | 24 #include "libbfd.h" |
25 #include "elf-bfd.h" | 25 #include "elf-bfd.h" |
26 #include "elf/lm32.h" | 26 #include "elf/lm32.h" |
27 | 27 |
28 #define DEFAULT_STACK_SIZE 0x20000 | 28 #define DEFAULT_STACK_SIZE 0x20000 |
29 | 29 |
30 #define PLT_ENTRY_SIZE 20 | 30 #define PLT_ENTRY_SIZE 20 |
31 | 31 |
32 #define PLT0_ENTRY_WORD0 0 | 32 #define PLT0_ENTRY_WORD0 0 |
33 #define PLT0_ENTRY_WORD1 0 | 33 #define PLT0_ENTRY_WORD1 0 |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up | 210 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up |
211 shortcuts to them in our hash table. */ | 211 shortcuts to them in our hash table. */ |
212 | 212 |
213 static bfd_boolean | 213 static bfd_boolean |
214 create_got_section (bfd *dynobj, struct bfd_link_info *info) | 214 create_got_section (bfd *dynobj, struct bfd_link_info *info) |
215 { | 215 { |
216 struct elf_lm32_link_hash_table *htab; | 216 struct elf_lm32_link_hash_table *htab; |
217 asection *s; | 217 asection *s; |
218 | 218 |
219 /* This function may be called more than once. */ | 219 /* This function may be called more than once. */ |
220 s = bfd_get_section_by_name (dynobj, ".got"); | 220 s = bfd_get_linker_section (dynobj, ".got"); |
221 if (s != NULL && (s->flags & SEC_LINKER_CREATED) != 0) | 221 if (s != NULL) |
222 return TRUE; | 222 return TRUE; |
223 | 223 |
224 htab = lm32_elf_hash_table (info); | 224 htab = lm32_elf_hash_table (info); |
225 if (htab == NULL) | 225 if (htab == NULL) |
226 return FALSE; | 226 return FALSE; |
227 | 227 |
228 if (! _bfd_elf_create_got_section (dynobj, info)) | 228 if (! _bfd_elf_create_got_section (dynobj, info)) |
229 return FALSE; | 229 return FALSE; |
230 | 230 |
231 htab->sgot = bfd_get_section_by_name (dynobj, ".got"); | 231 htab->sgot = bfd_get_linker_section (dynobj, ".got"); |
232 htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt"); | 232 htab->sgotplt = bfd_get_linker_section (dynobj, ".got.plt"); |
233 htab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); | 233 htab->srelgot = bfd_get_linker_section (dynobj, ".rela.got"); |
234 if (! htab->sgot || ! htab->sgotplt || ! htab->srelgot) | 234 if (! htab->sgot || ! htab->sgotplt || ! htab->srelgot) |
235 abort (); | 235 abort (); |
236 | 236 |
237 return TRUE; | 237 return TRUE; |
238 } | 238 } |
239 | 239 |
240 /* Create .rofixup sections in DYNOBJ, and set up | 240 /* Create .rofixup sections in DYNOBJ, and set up |
241 shortcuts to them in our hash table. */ | 241 shortcuts to them in our hash table. */ |
242 | 242 |
243 static bfd_boolean | 243 static bfd_boolean |
244 create_rofixup_section (bfd *dynobj, struct bfd_link_info *info) | 244 create_rofixup_section (bfd *dynobj, struct bfd_link_info *info) |
245 { | 245 { |
246 struct elf_lm32_link_hash_table *htab; | 246 struct elf_lm32_link_hash_table *htab; |
247 htab = lm32_elf_hash_table (info); | 247 htab = lm32_elf_hash_table (info); |
248 | 248 |
249 if (htab == NULL) | 249 if (htab == NULL) |
250 return FALSE; | 250 return FALSE; |
251 | 251 |
252 /* Fixup section for R_LM32_32 relocs. */ | 252 /* Fixup section for R_LM32_32 relocs. */ |
253 lm32fdpic_fixup32_section (info) = bfd_make_section_with_flags (dynobj, | 253 lm32fdpic_fixup32_section (info) |
254 ".rofixup", | 254 = bfd_make_section_anyway_with_flags (dynobj, |
255 » » » » (SEC_ALLOC | 255 » » » » » ".rofixup", |
256 | SEC_LOAD | 256 » » » » » (SEC_ALLOC |
257 | SEC_HAS_CON
TENTS | 257 » » » » » | SEC_LOAD |
258 | SEC_IN_MEMO
RY | 258 » » » » » | SEC_HAS_CONTENTS |
259 » | SEC_LINKER_
CREATED | 259 » » » » » | SEC_IN_MEMORY |
260 | SEC_READONL
Y)); | 260 » » » » » | SEC_LINKER_CREATED |
| 261 » » » » » | SEC_READONLY)); |
261 if (lm32fdpic_fixup32_section (info) == NULL | 262 if (lm32fdpic_fixup32_section (info) == NULL |
262 || ! bfd_set_section_alignment (dynobj, lm32fdpic_fixup32_section (info),
2)) | 263 || ! bfd_set_section_alignment (dynobj, |
| 264 » » » » lm32fdpic_fixup32_section (info), 2)) |
263 return FALSE; | 265 return FALSE; |
264 | 266 |
265 return TRUE; | 267 return TRUE; |
266 } | 268 } |
267 | 269 |
268 static reloc_howto_type lm32_elf_howto_table [] = | 270 static reloc_howto_type lm32_elf_howto_table [] = |
269 { | 271 { |
270 /* This reloc does nothing. */ | 272 /* This reloc does nothing. */ |
271 HOWTO (R_LM32_NONE, /* type */ | 273 HOWTO (R_LM32_NONE, /* type */ |
272 0, /* rightshift */ | 274 0, /* rightshift */ |
(...skipping 613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
886 bfd_boolean unresolved_reloc; | 888 bfd_boolean unresolved_reloc; |
887 bfd_boolean warned; | 889 bfd_boolean warned; |
888 | 890 |
889 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, | 891 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, |
890 r_symndx, symtab_hdr, sym_hashes, | 892 r_symndx, symtab_hdr, sym_hashes, |
891 h, sec, relocation, | 893 h, sec, relocation, |
892 unresolved_reloc, warned); | 894 unresolved_reloc, warned); |
893 name = h->root.root.string; | 895 name = h->root.root.string; |
894 } | 896 } |
895 | 897 |
896 if (sec != NULL && elf_discarded_section (sec)) | 898 if (sec != NULL && discarded_section (sec)) |
897 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, | 899 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, |
898 » » » » » rel, relend, howto, contents); | 900 » » » » » rel, 1, relend, howto, 0, contents); |
899 | 901 |
900 if (info->relocatable) | 902 if (info->relocatable) |
901 { | 903 { |
902 /* This is a relocatable link. We don't have to change | 904 /* This is a relocatable link. We don't have to change |
903 anything, unless the reloc is against a section symbol, | 905 anything, unless the reloc is against a section symbol, |
904 in which case we have to adjust according to where the | 906 in which case we have to adjust according to where the |
905 section symbol winds up in the output section. */ | 907 section symbol winds up in the output section. */ |
906 if (sym == NULL || ELF_ST_TYPE (sym->st_info) != STT_SECTION) | 908 if (sym == NULL || ELF_ST_TYPE (sym->st_info) != STT_SECTION) |
907 continue; | 909 continue; |
908 | 910 |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1024 + off); | 1026 + off); |
1025 } | 1027 } |
1026 | 1028 |
1027 if (info->shared) | 1029 if (info->shared) |
1028 { | 1030 { |
1029 asection *srelgot; | 1031 asection *srelgot; |
1030 Elf_Internal_Rela outrel; | 1032 Elf_Internal_Rela outrel; |
1031 | 1033 |
1032 /* We need to generate a R_LM32_RELATIVE reloc | 1034 /* We need to generate a R_LM32_RELATIVE reloc |
1033 for the dynamic linker. */ | 1035 for the dynamic linker. */ |
1034 srelgot = bfd_get_section_by_name (dynobj, ".rela.got"
); | 1036 srelgot = bfd_get_linker_section (dynobj, |
| 1037 » » » » » » » ".rela.got"); |
1035 BFD_ASSERT (srelgot != NULL); | 1038 BFD_ASSERT (srelgot != NULL); |
1036 | 1039 |
1037 outrel.r_offset = (sgot->output_section->vma | 1040 outrel.r_offset = (sgot->output_section->vma |
1038 + sgot->output_offset | 1041 + sgot->output_offset |
1039 + off); | 1042 + off); |
1040 outrel.r_info = ELF32_R_INFO (0, R_LM32_RELATIVE); | 1043 outrel.r_info = ELF32_R_INFO (0, R_LM32_RELATIVE); |
1041 outrel.r_addend = relocation; | 1044 outrel.r_addend = relocation; |
1042 loc = srelgot->contents; | 1045 loc = srelgot->contents; |
1043 loc += srelgot->reloc_count * sizeof (Elf32_External_R
ela); | 1046 loc += srelgot->reloc_count * sizeof (Elf32_External_R
ela); |
1044 bfd_elf32_swap_reloca_out (output_bfd, &outrel,loc); | 1047 bfd_elf32_swap_reloca_out (output_bfd, &outrel,loc); |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1339 case R_LM32_32: | 1342 case R_LM32_32: |
1340 /* FDPIC requires a GOT if there is a .rofixup section | 1343 /* FDPIC requires a GOT if there is a .rofixup section |
1341 (Normal ELF doesn't). */ | 1344 (Normal ELF doesn't). */ |
1342 if (dynobj == NULL) | 1345 if (dynobj == NULL) |
1343 htab->root.dynobj = dynobj = abfd; | 1346 htab->root.dynobj = dynobj = abfd; |
1344 if (! create_got_section (dynobj, info)) | 1347 if (! create_got_section (dynobj, info)) |
1345 return FALSE; | 1348 return FALSE; |
1346 /* Create .rofixup section */ | 1349 /* Create .rofixup section */ |
1347 if (htab->sfixup32 == NULL) | 1350 if (htab->sfixup32 == NULL) |
1348 { | 1351 { |
1349 if (! create_rofixup_section (abfd, info)) | 1352 if (! create_rofixup_section (dynobj, info)) |
1350 return FALSE; | 1353 return FALSE; |
1351 } | 1354 } |
1352 break; | 1355 break; |
1353 case R_LM32_16_GOT: | 1356 case R_LM32_16_GOT: |
1354 case R_LM32_GOTOFF_HI16: | 1357 case R_LM32_GOTOFF_HI16: |
1355 case R_LM32_GOTOFF_LO16: | 1358 case R_LM32_GOTOFF_LO16: |
1356 /* Create .rofixup section. */ | 1359 /* Create .rofixup section. */ |
1357 if (htab->sfixup32 == NULL) | 1360 if (htab->sfixup32 == NULL) |
1358 { | 1361 { |
1359 if (! create_rofixup_section (abfd, info)) | 1362 » » if (dynobj == NULL) |
| 1363 » » htab->root.dynobj = dynobj = abfd; |
| 1364 if (! create_rofixup_section (dynobj, info)) |
1360 return FALSE; | 1365 return FALSE; |
1361 } | 1366 } |
1362 break; | 1367 break; |
1363 } | 1368 } |
1364 } | 1369 } |
1365 | 1370 |
1366 switch (r_type) | 1371 switch (r_type) |
1367 { | 1372 { |
1368 case R_LM32_16_GOT: | 1373 case R_LM32_16_GOT: |
1369 if (h != NULL) | 1374 if (h != NULL) |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1420 asection *sdyn; | 1425 asection *sdyn; |
1421 asection *sgot; | 1426 asection *sgot; |
1422 | 1427 |
1423 htab = lm32_elf_hash_table (info); | 1428 htab = lm32_elf_hash_table (info); |
1424 if (htab == NULL) | 1429 if (htab == NULL) |
1425 return FALSE; | 1430 return FALSE; |
1426 | 1431 |
1427 dynobj = htab->root.dynobj; | 1432 dynobj = htab->root.dynobj; |
1428 | 1433 |
1429 sgot = htab->sgotplt; | 1434 sgot = htab->sgotplt; |
1430 sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); | 1435 sdyn = bfd_get_linker_section (dynobj, ".dynamic"); |
1431 | 1436 |
1432 if (htab->root.dynamic_sections_created) | 1437 if (htab->root.dynamic_sections_created) |
1433 { | 1438 { |
1434 asection *splt; | 1439 asection *splt; |
1435 Elf32_External_Dyn *dyncon, *dynconend; | 1440 Elf32_External_Dyn *dyncon, *dynconend; |
1436 | 1441 |
1437 BFD_ASSERT (sgot != NULL && sdyn != NULL); | 1442 BFD_ASSERT (sgot != NULL && sdyn != NULL); |
1438 | 1443 |
1439 dyncon = (Elf32_External_Dyn *) sdyn->contents; | 1444 dyncon = (Elf32_External_Dyn *) sdyn->contents; |
1440 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size); | 1445 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size); |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1718 if (h->needs_copy) | 1723 if (h->needs_copy) |
1719 { | 1724 { |
1720 asection *s; | 1725 asection *s; |
1721 Elf_Internal_Rela rela; | 1726 Elf_Internal_Rela rela; |
1722 | 1727 |
1723 /* This symbols needs a copy reloc. Set it up. */ | 1728 /* This symbols needs a copy reloc. Set it up. */ |
1724 BFD_ASSERT (h->dynindx != -1 | 1729 BFD_ASSERT (h->dynindx != -1 |
1725 && (h->root.type == bfd_link_hash_defined | 1730 && (h->root.type == bfd_link_hash_defined |
1726 || h->root.type == bfd_link_hash_defweak)); | 1731 || h->root.type == bfd_link_hash_defweak)); |
1727 | 1732 |
1728 s = bfd_get_section_by_name (h->root.u.def.section->owner, | 1733 s = bfd_get_linker_section (htab->root.dynobj, ".rela.bss"); |
1729 ".rela.bss"); | |
1730 BFD_ASSERT (s != NULL); | 1734 BFD_ASSERT (s != NULL); |
1731 | 1735 |
1732 rela.r_offset = (h->root.u.def.value | 1736 rela.r_offset = (h->root.u.def.value |
1733 + h->root.u.def.section->output_section->vma | 1737 + h->root.u.def.section->output_section->vma |
1734 + h->root.u.def.section->output_offset); | 1738 + h->root.u.def.section->output_offset); |
1735 rela.r_info = ELF32_R_INFO (h->dynindx, R_LM32_COPY); | 1739 rela.r_info = ELF32_R_INFO (h->dynindx, R_LM32_COPY); |
1736 rela.r_addend = 0; | 1740 rela.r_addend = 0; |
1737 loc = s->contents; | 1741 loc = s->contents; |
1738 loc += s->reloc_count * sizeof (Elf32_External_Rela); | 1742 loc += s->reloc_count * sizeof (Elf32_External_Rela); |
1739 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); | 1743 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1856 | 1860 |
1857 /* If we didn't find any dynamic relocs in sections which needs the | 1861 /* If we didn't find any dynamic relocs in sections which needs the |
1858 copy reloc, then we'll be keeping the dynamic relocs and avoiding | 1862 copy reloc, then we'll be keeping the dynamic relocs and avoiding |
1859 the copy reloc. */ | 1863 the copy reloc. */ |
1860 if (p == NULL) | 1864 if (p == NULL) |
1861 { | 1865 { |
1862 h->non_got_ref = 0; | 1866 h->non_got_ref = 0; |
1863 return TRUE; | 1867 return TRUE; |
1864 } | 1868 } |
1865 | 1869 |
1866 if (h->size == 0) | |
1867 { | |
1868 (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"), | |
1869 h->root.root.string); | |
1870 return TRUE; | |
1871 } | |
1872 | |
1873 /* We must allocate the symbol in our .dynbss section, which will | 1870 /* We must allocate the symbol in our .dynbss section, which will |
1874 become part of the .bss section of the executable. There will be | 1871 become part of the .bss section of the executable. There will be |
1875 an entry for this symbol in the .dynsym section. The dynamic | 1872 an entry for this symbol in the .dynsym section. The dynamic |
1876 object will contain position independent code, so all references | 1873 object will contain position independent code, so all references |
1877 from the dynamic object to this symbol will go through the global | 1874 from the dynamic object to this symbol will go through the global |
1878 offset table. The dynamic linker will use the .dynsym entry to | 1875 offset table. The dynamic linker will use the .dynsym entry to |
1879 determine the address it must put in the global offset table, so | 1876 determine the address it must put in the global offset table, so |
1880 both the dynamic object and the regular object will refer to the | 1877 both the dynamic object and the regular object will refer to the |
1881 same memory location for the variable. */ | 1878 same memory location for the variable. */ |
1882 | 1879 |
1883 htab = lm32_elf_hash_table (info); | 1880 htab = lm32_elf_hash_table (info); |
1884 if (htab == NULL) | 1881 if (htab == NULL) |
1885 return FALSE; | 1882 return FALSE; |
1886 | 1883 |
1887 s = htab->sdynbss; | 1884 s = htab->sdynbss; |
1888 BFD_ASSERT (s != NULL); | 1885 BFD_ASSERT (s != NULL); |
1889 | 1886 |
1890 /* We must generate a R_LM32_COPY reloc to tell the dynamic linker | 1887 /* We must generate a R_LM32_COPY reloc to tell the dynamic linker |
1891 to copy the initial value out of the dynamic object and into the | 1888 to copy the initial value out of the dynamic object and into the |
1892 runtime process image. We need to remember the offset into the | 1889 runtime process image. We need to remember the offset into the |
1893 .rela.bss section we are going to use. */ | 1890 .rela.bss section we are going to use. */ |
1894 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0) | 1891 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) |
1895 { | 1892 { |
1896 asection *srel; | 1893 asection *srel; |
1897 | 1894 |
1898 srel = htab->srelbss; | 1895 srel = htab->srelbss; |
1899 BFD_ASSERT (srel != NULL); | 1896 BFD_ASSERT (srel != NULL); |
1900 srel->size += sizeof (Elf32_External_Rela); | 1897 srel->size += sizeof (Elf32_External_Rela); |
1901 h->needs_copy = 1; | 1898 h->needs_copy = 1; |
1902 } | 1899 } |
1903 | 1900 |
1904 return _bfd_elf_adjust_dynamic_copy (h, s); | 1901 return _bfd_elf_adjust_dynamic_copy (h, s); |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2139 return FALSE; | 2136 return FALSE; |
2140 | 2137 |
2141 dynobj = htab->root.dynobj; | 2138 dynobj = htab->root.dynobj; |
2142 BFD_ASSERT (dynobj != NULL); | 2139 BFD_ASSERT (dynobj != NULL); |
2143 | 2140 |
2144 if (htab->root.dynamic_sections_created) | 2141 if (htab->root.dynamic_sections_created) |
2145 { | 2142 { |
2146 /* Set the contents of the .interp section to the interpreter. */ | 2143 /* Set the contents of the .interp section to the interpreter. */ |
2147 if (info->executable) | 2144 if (info->executable) |
2148 { | 2145 { |
2149 » s = bfd_get_section_by_name (dynobj, ".interp"); | 2146 » s = bfd_get_linker_section (dynobj, ".interp"); |
2150 BFD_ASSERT (s != NULL); | 2147 BFD_ASSERT (s != NULL); |
2151 s->size = sizeof ELF_DYNAMIC_INTERPRETER; | 2148 s->size = sizeof ELF_DYNAMIC_INTERPRETER; |
2152 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; | 2149 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; |
2153 } | 2150 } |
2154 } | 2151 } |
2155 | 2152 |
2156 /* Set up .got offsets for local syms, and space for local dynamic | 2153 /* Set up .got offsets for local syms, and space for local dynamic |
2157 relocs. */ | 2154 relocs. */ |
2158 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next) | 2155 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next) |
2159 { | 2156 { |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2365 { | 2362 { |
2366 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; | 2363 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; |
2367 while (h->root.type == bfd_link_hash_indirect | 2364 while (h->root.type == bfd_link_hash_indirect |
2368 || h->root.type == bfd_link_hash_warning) | 2365 || h->root.type == bfd_link_hash_warning) |
2369 h = (struct elf_link_hash_entry *) h->root.u.i.l
ink; | 2366 h = (struct elf_link_hash_entry *) h->root.u.i.l
ink; |
2370 } | 2367 } |
2371 | 2368 |
2372 /* Don't generate entries for weak symbols. */ | 2369 /* Don't generate entries for weak symbols. */ |
2373 if (!h || (h && h->root.type != bfd_link_hash_undefwea
k)) | 2370 if (!h || (h && h->root.type != bfd_link_hash_undefwea
k)) |
2374 { | 2371 { |
2375 if (!elf_discarded_section (s) && !((bfd_get_secti
on_flags (ibfd, s) & SEC_ALLOC) == 0)) | 2372 if (!discarded_section (s) && !((bfd_get_section_f
lags (ibfd, s) & SEC_ALLOC) == 0)) |
2376 { | 2373 { |
2377 switch (ELF32_R_TYPE (internal_relocs->r_info)
) | 2374 switch (ELF32_R_TYPE (internal_relocs->r_info)
) |
2378 { | 2375 { |
2379 case R_LM32_32: | 2376 case R_LM32_32: |
2380 r32_count++; | 2377 r32_count++; |
2381 break; | 2378 break; |
2382 case R_LM32_16_GOT: | 2379 case R_LM32_16_GOT: |
2383 rgot_count++; | 2380 rgot_count++; |
2384 break; | 2381 break; |
2385 } | 2382 } |
2386 } | 2383 } |
2387 } | 2384 } |
2388 else | 2385 else |
2389 { | 2386 { |
2390 struct weak_symbol_list *current, *new_entry; | 2387 struct weak_symbol_list *current, *new_entry; |
2391 /* Is this symbol already in the list? */ | 2388 /* Is this symbol already in the list? */ |
2392 for (current = list_start; current; current = curr
ent->next) | 2389 for (current = list_start; current; current = curr
ent->next) |
2393 { | 2390 { |
2394 if (!strcmp (current->name, h->root.root.strin
g)) | 2391 if (!strcmp (current->name, h->root.root.strin
g)) |
2395 break; | 2392 break; |
2396 } | 2393 } |
2397 if (!current && !elf_discarded_section (s) && (bfd
_get_section_flags (ibfd, s) & SEC_ALLOC)) | 2394 if (!current && !discarded_section (s) && (bfd_get
_section_flags (ibfd, s) & SEC_ALLOC)) |
2398 { | 2395 { |
2399 /* Will this have an entry in the GOT. */ | 2396 /* Will this have an entry in the GOT. */ |
2400 if (ELF32_R_TYPE (internal_relocs->r_info) ==
R_LM32_16_GOT) | 2397 if (ELF32_R_TYPE (internal_relocs->r_info) ==
R_LM32_16_GOT) |
2401 { | 2398 { |
2402 /* Create a new entry. */ | 2399 /* Create a new entry. */ |
2403 new_entry = malloc (sizeof (struct weak_sy
mbol_list)); | 2400 new_entry = malloc (sizeof (struct weak_sy
mbol_list)); |
2404 if (!new_entry) | 2401 if (!new_entry) |
2405 return FALSE; | 2402 return FALSE; |
2406 new_entry->name = h->root.root.string; | 2403 new_entry->name = h->root.root.string; |
2407 new_entry->next = NULL; | 2404 new_entry->next = NULL; |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2483 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | 2480 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY |
2484 | SEC_LINKER_CREATED); | 2481 | SEC_LINKER_CREATED); |
2485 | 2482 |
2486 pltflags = flags; | 2483 pltflags = flags; |
2487 pltflags |= SEC_CODE; | 2484 pltflags |= SEC_CODE; |
2488 if (bed->plt_not_loaded) | 2485 if (bed->plt_not_loaded) |
2489 pltflags &= ~ (SEC_LOAD | SEC_HAS_CONTENTS); | 2486 pltflags &= ~ (SEC_LOAD | SEC_HAS_CONTENTS); |
2490 if (bed->plt_readonly) | 2487 if (bed->plt_readonly) |
2491 pltflags |= SEC_READONLY; | 2488 pltflags |= SEC_READONLY; |
2492 | 2489 |
2493 s = bfd_make_section_with_flags (abfd, ".plt", pltflags); | 2490 s = bfd_make_section_anyway_with_flags (abfd, ".plt", pltflags); |
2494 htab->splt = s; | 2491 htab->splt = s; |
2495 if (s == NULL | 2492 if (s == NULL |
2496 || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment)) | 2493 || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment)) |
2497 return FALSE; | 2494 return FALSE; |
2498 | 2495 |
2499 if (bed->want_plt_sym) | 2496 if (bed->want_plt_sym) |
2500 { | 2497 { |
2501 /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the | 2498 /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the |
2502 .plt section. */ | 2499 .plt section. */ |
2503 struct bfd_link_hash_entry *bh = NULL; | 2500 struct bfd_link_hash_entry *bh = NULL; |
2504 struct elf_link_hash_entry *h; | 2501 struct elf_link_hash_entry *h; |
2505 | 2502 |
2506 if (! (_bfd_generic_link_add_one_symbol | 2503 if (! (_bfd_generic_link_add_one_symbol |
2507 (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s, | 2504 (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s, |
2508 (bfd_vma) 0, NULL, FALSE, | 2505 (bfd_vma) 0, NULL, FALSE, |
2509 get_elf_backend_data (abfd)->collect, &bh))) | 2506 get_elf_backend_data (abfd)->collect, &bh))) |
2510 return FALSE; | 2507 return FALSE; |
2511 h = (struct elf_link_hash_entry *) bh; | 2508 h = (struct elf_link_hash_entry *) bh; |
2512 h->def_regular = 1; | 2509 h->def_regular = 1; |
2513 h->type = STT_OBJECT; | 2510 h->type = STT_OBJECT; |
2514 htab->root.hplt = h; | 2511 htab->root.hplt = h; |
2515 | 2512 |
2516 if (info->shared | 2513 if (info->shared |
2517 && ! bfd_elf_link_record_dynamic_symbol (info, h)) | 2514 && ! bfd_elf_link_record_dynamic_symbol (info, h)) |
2518 return FALSE; | 2515 return FALSE; |
2519 } | 2516 } |
2520 | 2517 |
2521 s = bfd_make_section_with_flags (abfd, | 2518 s = bfd_make_section_anyway_with_flags (abfd, |
2522 » » » » bed->default_use_rela_p ? ".rela.plt" : ".rel
.plt", | 2519 » » » » » bed->default_use_rela_p |
2523 » » » » flags | SEC_READONLY); | 2520 » » » » » ? ".rela.plt" : ".rel.plt", |
| 2521 » » » » » flags | SEC_READONLY); |
2524 htab->srelplt = s; | 2522 htab->srelplt = s; |
2525 if (s == NULL | 2523 if (s == NULL |
2526 || ! bfd_set_section_alignment (abfd, s, ptralign)) | 2524 || ! bfd_set_section_alignment (abfd, s, ptralign)) |
2527 return FALSE; | 2525 return FALSE; |
2528 | 2526 |
2529 if (htab->sgot == NULL | 2527 if (htab->sgot == NULL |
2530 && ! create_got_section (abfd, info)) | 2528 && ! create_got_section (abfd, info)) |
2531 return FALSE; | 2529 return FALSE; |
2532 | 2530 |
2533 { | |
2534 const char *secname; | |
2535 char *relname; | |
2536 flagword secflags; | |
2537 asection *sec; | |
2538 | |
2539 for (sec = abfd->sections; sec; sec = sec->next) | |
2540 { | |
2541 secflags = bfd_get_section_flags (abfd, sec); | |
2542 if ((secflags & (SEC_DATA | SEC_LINKER_CREATED)) | |
2543 || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS)) | |
2544 continue; | |
2545 secname = bfd_get_section_name (abfd, sec); | |
2546 relname = bfd_malloc ((bfd_size_type) strlen (secname) + 6); | |
2547 strcpy (relname, ".rela"); | |
2548 strcat (relname, secname); | |
2549 if (bfd_get_section_by_name (abfd, secname)) | |
2550 continue; | |
2551 s = bfd_make_section_with_flags (abfd, relname, | |
2552 flags | SEC_READONLY); | |
2553 if (s == NULL | |
2554 || ! bfd_set_section_alignment (abfd, s, ptralign)) | |
2555 return FALSE; | |
2556 } | |
2557 } | |
2558 | |
2559 if (bed->want_dynbss) | 2531 if (bed->want_dynbss) |
2560 { | 2532 { |
2561 /* The .dynbss section is a place to put symbols which are defined | 2533 /* The .dynbss section is a place to put symbols which are defined |
2562 by dynamic objects, are referenced by regular objects, and are | 2534 by dynamic objects, are referenced by regular objects, and are |
2563 not functions. We must allocate space for them in the process | 2535 not functions. We must allocate space for them in the process |
2564 image and use a R_*_COPY reloc to tell the dynamic linker to | 2536 image and use a R_*_COPY reloc to tell the dynamic linker to |
2565 initialize them at run time. The linker script puts the .dynbss | 2537 initialize them at run time. The linker script puts the .dynbss |
2566 section into the .bss section of the final image. */ | 2538 section into the .bss section of the final image. */ |
2567 s = bfd_make_section_with_flags (abfd, ".dynbss", | 2539 s = bfd_make_section_anyway_with_flags (abfd, ".dynbss", |
2568 » » » » SEC_ALLOC | SEC_LINKER_CREATED); | 2540 » » » » » SEC_ALLOC | SEC_LINKER_CREATED); |
2569 htab->sdynbss = s; | 2541 htab->sdynbss = s; |
2570 if (s == NULL) | 2542 if (s == NULL) |
2571 return FALSE; | 2543 return FALSE; |
2572 /* The .rel[a].bss section holds copy relocs. This section is not | 2544 /* The .rel[a].bss section holds copy relocs. This section is not |
2573 normally needed. We need to create it here, though, so that the | 2545 normally needed. We need to create it here, though, so that the |
2574 linker will map it to an output section. We can't just create it | 2546 linker will map it to an output section. We can't just create it |
2575 only if we need it, because we will not know whether we need it | 2547 only if we need it, because we will not know whether we need it |
2576 until we have seen all the input files, and the first time the | 2548 until we have seen all the input files, and the first time the |
2577 main linker code calls BFD after examining all the input files | 2549 main linker code calls BFD after examining all the input files |
2578 (size_dynamic_sections) the input sections have already been | 2550 (size_dynamic_sections) the input sections have already been |
2579 mapped to the output sections. If the section turns out not to | 2551 mapped to the output sections. If the section turns out not to |
2580 be needed, we can discard it later. We will never need this | 2552 be needed, we can discard it later. We will never need this |
2581 section when generating a shared object, since they do not use | 2553 section when generating a shared object, since they do not use |
2582 copy relocs. */ | 2554 copy relocs. */ |
2583 if (! info->shared) | 2555 if (! info->shared) |
2584 { | 2556 { |
2585 s = bfd_make_section_with_flags (abfd, | 2557 s = bfd_make_section_anyway_with_flags (abfd, |
2586 » » » » » (bed->default_use_rela_p | 2558 » » » » » » (bed->default_use_rela_p |
2587 » » » » » ? ".rela.bss" : ".rel.bss"), | 2559 » » » » » » ? ".rela.bss" : ".rel.bss"), |
2588 » » » » » flags | SEC_READONLY); | 2560 » » » » » » flags | SEC_READONLY); |
2589 htab->srelbss = s; | 2561 htab->srelbss = s; |
2590 if (s == NULL | 2562 if (s == NULL |
2591 || ! bfd_set_section_alignment (abfd, s, ptralign)) | 2563 || ! bfd_set_section_alignment (abfd, s, ptralign)) |
2592 return FALSE; | 2564 return FALSE; |
2593 } | 2565 } |
2594 } | 2566 } |
2595 | 2567 |
2596 return TRUE; | 2568 return TRUE; |
2597 } | 2569 } |
2598 | 2570 |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2887 #undef elf_backend_always_size_sections | 2859 #undef elf_backend_always_size_sections |
2888 #define elf_backend_always_size_sections lm32_elf_always_size_sections | 2860 #define elf_backend_always_size_sections lm32_elf_always_size_sections |
2889 #undef elf_backend_modify_segment_map | 2861 #undef elf_backend_modify_segment_map |
2890 #define elf_backend_modify_segment_map lm32_elf_modify_segment_map | 2862 #define elf_backend_modify_segment_map lm32_elf_modify_segment_map |
2891 #undef elf_backend_modify_program_headers | 2863 #undef elf_backend_modify_program_headers |
2892 #define elf_backend_modify_program_headers lm32_elf_modify_program_headers | 2864 #define elf_backend_modify_program_headers lm32_elf_modify_program_headers |
2893 #undef bfd_elf32_bfd_copy_private_bfd_data | 2865 #undef bfd_elf32_bfd_copy_private_bfd_data |
2894 #define bfd_elf32_bfd_copy_private_bfd_data lm32_elf_fdpic_copy_private_bfd_
data | 2866 #define bfd_elf32_bfd_copy_private_bfd_data lm32_elf_fdpic_copy_private_bfd_
data |
2895 | 2867 |
2896 #include "elf32-target.h" | 2868 #include "elf32-target.h" |
OLD | NEW |