1 /* Mach-O support for BFD. 2 Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 3 2009, 2010, 2011, 2012 4 Free Software Foundation, Inc. 5 6 This file is part of BFD, the Binary File Descriptor library. 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program; if not, write to the Free Software 20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 21 MA 02110-1301, USA. */ 22 23 #include "sysdep.h" 24 #include "mach-o.h" 25 #include "bfd.h" 26 #include "libbfd.h" 27 #include "libiberty.h" 28 #include "aout/stab_gnu.h" 29 #include "mach-o/reloc.h" 30 #include "mach-o/external.h" 31 #include <ctype.h> 32 #include <stdlib.h> 33 #include <string.h> 34 35 #define bfd_mach_o_object_p bfd_mach_o_gen_object_p 36 #define bfd_mach_o_core_p bfd_mach_o_gen_core_p 37 #define bfd_mach_o_mkobject bfd_mach_o_gen_mkobject 38 39 #define FILE_ALIGN(off, algn) \ 40 (((off) + ((file_ptr) 1 << (algn)) - 1) & ((file_ptr) -1 << (algn))) 41 42 unsigned int 43 bfd_mach_o_version (bfd *abfd) 44 { 45 bfd_mach_o_data_struct *mdata = NULL; 46 47 BFD_ASSERT (bfd_mach_o_valid (abfd)); 48 mdata = bfd_mach_o_get_data (abfd); 49 50 return mdata->header.version; 51 } 52 53 bfd_boolean 54 bfd_mach_o_valid (bfd *abfd) 55 { 56 if (abfd == NULL || abfd->xvec == NULL) 57 return FALSE; 58 59 if (abfd->xvec->flavour != bfd_target_mach_o_flavour) 60 return FALSE; 61 62 if (bfd_mach_o_get_data (abfd) == NULL) 63 return FALSE; 64 return TRUE; 65 } 66 67 static INLINE bfd_boolean 68 mach_o_wide_p (bfd_mach_o_header *header) 69 { 70 switch (header->version) 71 { 72 case 1: 73 return FALSE; 74 case 2: 75 return TRUE; 76 default: 77 BFD_FAIL (); 78 return FALSE; 79 } 80 } 81 82 static INLINE bfd_boolean 83 bfd_mach_o_wide_p (bfd *abfd) 84 { 85 return mach_o_wide_p (&bfd_mach_o_get_data (abfd)->header); 86 } 87 88 /* Tables to translate well known Mach-O segment/section names to bfd 89 names. Use of canonical names (such as .text or .debug_frame) is required 90 by gdb. */ 91 92 /* __TEXT Segment. */ 93 static const mach_o_section_name_xlat text_section_names_xlat[] = 94 { 95 { ".text", "__text", 96 SEC_CODE | SEC_LOAD, BFD_MACH_O_S_REGULAR, 97 BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS, 0}, 98 { ".const", "__const", 99 SEC_READONLY | SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 100 BFD_MACH_O_S_ATTR_NONE, 0}, 101 { ".static_const", "__static_const", 102 SEC_READONLY | SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 103 BFD_MACH_O_S_ATTR_NONE, 0}, 104 { ".cstring", "__cstring", 105 SEC_READONLY | SEC_DATA | SEC_LOAD | SEC_MERGE | SEC_STRINGS, 106 BFD_MACH_O_S_CSTRING_LITERALS, 107 BFD_MACH_O_S_ATTR_NONE, 0}, 108 { ".literal4", "__literal4", 109 SEC_READONLY | SEC_DATA | SEC_LOAD, BFD_MACH_O_S_4BYTE_LITERALS, 110 BFD_MACH_O_S_ATTR_NONE, 2}, 111 { ".literal8", "__literal8", 112 SEC_READONLY | SEC_DATA | SEC_LOAD, BFD_MACH_O_S_8BYTE_LITERALS, 113 BFD_MACH_O_S_ATTR_NONE, 3}, 114 { ".literal16", "__literal16", 115 SEC_READONLY | SEC_DATA | SEC_LOAD, BFD_MACH_O_S_16BYTE_LITERALS, 116 BFD_MACH_O_S_ATTR_NONE, 4}, 117 { ".constructor", "__constructor", 118 SEC_CODE | SEC_LOAD, BFD_MACH_O_S_REGULAR, 119 BFD_MACH_O_S_ATTR_NONE, 0}, 120 { ".destructor", "__destructor", 121 SEC_CODE | SEC_LOAD, BFD_MACH_O_S_REGULAR, 122 BFD_MACH_O_S_ATTR_NONE, 0}, 123 { ".eh_frame", "__eh_frame", 124 SEC_READONLY | SEC_DATA | SEC_LOAD, BFD_MACH_O_S_COALESCED, 125 BFD_MACH_O_S_ATTR_LIVE_SUPPORT 126 | BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS 127 | BFD_MACH_O_S_ATTR_NO_TOC, 2}, 128 { NULL, NULL, 0, 0, 0, 0} 129 }; 130 131 /* __DATA Segment. */ 132 static const mach_o_section_name_xlat data_section_names_xlat[] = 133 { 134 { ".data", "__data", 135 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 136 BFD_MACH_O_S_ATTR_NONE, 0}, 137 { ".bss", "__bss", 138 SEC_NO_FLAGS, BFD_MACH_O_S_ZEROFILL, 139 BFD_MACH_O_S_ATTR_NONE, 0}, 140 { ".const_data", "__const", 141 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 142 BFD_MACH_O_S_ATTR_NONE, 0}, 143 { ".static_data", "__static_data", 144 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 145 BFD_MACH_O_S_ATTR_NONE, 0}, 146 { ".mod_init_func", "__mod_init_func", 147 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS, 148 BFD_MACH_O_S_ATTR_NONE, 2}, 149 { ".mod_term_func", "__mod_term_func", 150 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS, 151 BFD_MACH_O_S_ATTR_NONE, 2}, 152 { ".dyld", "__dyld", 153 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 154 BFD_MACH_O_S_ATTR_NONE, 0}, 155 { ".cfstring", "__cfstring", 156 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 157 BFD_MACH_O_S_ATTR_NONE, 2}, 158 { NULL, NULL, 0, 0, 0, 0} 159 }; 160 161 /* __DWARF Segment. */ 162 static const mach_o_section_name_xlat dwarf_section_names_xlat[] = 163 { 164 { ".debug_frame", "__debug_frame", 165 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR, 166 BFD_MACH_O_S_ATTR_DEBUG, 0}, 167 { ".debug_info", "__debug_info", 168 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR, 169 BFD_MACH_O_S_ATTR_DEBUG, 0}, 170 { ".debug_abbrev", "__debug_abbrev", 171 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR, 172 BFD_MACH_O_S_ATTR_DEBUG, 0}, 173 { ".debug_aranges", "__debug_aranges", 174 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR, 175 BFD_MACH_O_S_ATTR_DEBUG, 0}, 176 { ".debug_macinfo", "__debug_macinfo", 177 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR, 178 BFD_MACH_O_S_ATTR_DEBUG, 0}, 179 { ".debug_line", "__debug_line", 180 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR, 181 BFD_MACH_O_S_ATTR_DEBUG, 0}, 182 { ".debug_loc", "__debug_loc", 183 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR, 184 BFD_MACH_O_S_ATTR_DEBUG, 0}, 185 { ".debug_pubnames", "__debug_pubnames", 186 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR, 187 BFD_MACH_O_S_ATTR_DEBUG, 0}, 188 { ".debug_pubtypes", "__debug_pubtypes", 189 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR, 190 BFD_MACH_O_S_ATTR_DEBUG, 0}, 191 { ".debug_str", "__debug_str", 192 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR, 193 BFD_MACH_O_S_ATTR_DEBUG, 0}, 194 { ".debug_ranges", "__debug_ranges", 195 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR, 196 BFD_MACH_O_S_ATTR_DEBUG, 0}, 197 { ".debug_macro", "__debug_macro", 198 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR, 199 BFD_MACH_O_S_ATTR_DEBUG, 0}, 200 { NULL, NULL, 0, 0, 0, 0} 201 }; 202 203 /* __OBJC Segment. */ 204 static const mach_o_section_name_xlat objc_section_names_xlat[] = 205 { 206 { ".objc_class", "__class", 207 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 208 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 209 { ".objc_meta_class", "__meta_class", 210 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 211 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 212 { ".objc_cat_cls_meth", "__cat_cls_meth", 213 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 214 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 215 { ".objc_cat_inst_meth", "__cat_inst_meth", 216 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 217 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 218 { ".objc_protocol", "__protocol", 219 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 220 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 221 { ".objc_string_object", "__string_object", 222 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 223 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 224 { ".objc_cls_meth", "__cls_meth", 225 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 226 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 227 { ".objc_inst_meth", "__inst_meth", 228 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 229 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 230 { ".objc_cls_refs", "__cls_refs", 231 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_LITERAL_POINTERS, 232 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 233 { ".objc_message_refs", "__message_refs", 234 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_LITERAL_POINTERS, 235 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 236 { ".objc_symbols", "__symbols", 237 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 238 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 239 { ".objc_category", "__category", 240 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 241 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 242 { ".objc_class_vars", "__class_vars", 243 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 244 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 245 { ".objc_instance_vars", "__instance_vars", 246 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 247 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 248 { ".objc_module_info", "__module_info", 249 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 250 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 251 { ".objc_selector_strs", "__selector_strs", 252 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_CSTRING_LITERALS, 253 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 254 { ".objc_image_info", "__image_info", 255 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 256 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 257 { ".objc_selector_fixup", "__sel_fixup", 258 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 259 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 260 /* Objc V1 */ 261 { ".objc1_class_ext", "__class_ext", 262 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 263 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 264 { ".objc1_property_list", "__property", 265 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 266 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 267 { ".objc1_protocol_ext", "__protocol_ext", 268 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR, 269 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0}, 270 { NULL, NULL, 0, 0, 0, 0} 271 }; 272 273 static const mach_o_segment_name_xlat segsec_names_xlat[] = 274 { 275 { "__TEXT", text_section_names_xlat }, 276 { "__DATA", data_section_names_xlat }, 277 { "__DWARF", dwarf_section_names_xlat }, 278 { "__OBJC", objc_section_names_xlat }, 279 { NULL, NULL } 280 }; 281 282 static const char dsym_subdir[] = ".dSYM/Contents/Resources/DWARF"; 283 284 /* For both cases bfd-name => mach-o name and vice versa, the specific target 285 is checked before the generic. This allows a target (e.g. ppc for cstring) 286 to override the generic definition with a more specific one. */ 287 288 /* Fetch the translation from a Mach-O section designation (segment, section) 289 as a bfd short name, if one exists. Otherwise return NULL. 290 291 Allow the segment and section names to be unterminated 16 byte arrays. */ 292 293 const mach_o_section_name_xlat * 294 bfd_mach_o_section_data_for_mach_sect (bfd *abfd, const char *segname, 295 const char *sectname) 296 { 297 const struct mach_o_segment_name_xlat *seg; 298 const mach_o_section_name_xlat *sec; 299 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd); 300 301 /* First try any target-specific translations defined... */ 302 if (bed->segsec_names_xlat) 303 for (seg = bed->segsec_names_xlat; seg->segname; seg++) 304 if (strncmp (seg->segname, segname, BFD_MACH_O_SEGNAME_SIZE) == 0) 305 for (sec = seg->sections; sec->mach_o_name; sec++) 306 if (strncmp (sec->mach_o_name, sectname, 307 BFD_MACH_O_SECTNAME_SIZE) == 0) 308 return sec; 309 310 /* ... and then the Mach-O generic ones. */ 311 for (seg = segsec_names_xlat; seg->segname; seg++) 312 if (strncmp (seg->segname, segname, BFD_MACH_O_SEGNAME_SIZE) == 0) 313 for (sec = seg->sections; sec->mach_o_name; sec++) 314 if (strncmp (sec->mach_o_name, sectname, 315 BFD_MACH_O_SECTNAME_SIZE) == 0) 316 return sec; 317 318 return NULL; 319 } 320 321 /* If the bfd_name for this section is a 'canonical' form for which we 322 know the Mach-O data, return the segment name and the data for the 323 Mach-O equivalent. Otherwise return NULL. */ 324 325 const mach_o_section_name_xlat * 326 bfd_mach_o_section_data_for_bfd_name (bfd *abfd, const char *bfd_name, 327 const char **segname) 328 { 329 const struct mach_o_segment_name_xlat *seg; 330 const mach_o_section_name_xlat *sec; 331 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd); 332 *segname = NULL; 333 334 if (bfd_name[0] != '.') 335 return NULL; 336 337 /* First try any target-specific translations defined... */ 338 if (bed->segsec_names_xlat) 339 for (seg = bed->segsec_names_xlat; seg->segname; seg++) 340 for (sec = seg->sections; sec->bfd_name; sec++) 341 if (strcmp (bfd_name, sec->bfd_name) == 0) 342 { 343 *segname = seg->segname; 344 return sec; 345 } 346 347 /* ... and then the Mach-O generic ones. */ 348 for (seg = segsec_names_xlat; seg->segname; seg++) 349 for (sec = seg->sections; sec->bfd_name; sec++) 350 if (strcmp (bfd_name, sec->bfd_name) == 0) 351 { 352 *segname = seg->segname; 353 return sec; 354 } 355 356 return NULL; 357 } 358 359 /* Convert Mach-O section name to BFD. 360 361 Try to use standard/canonical names, for which we have tables including 362 default flag settings - which are returned. Otherwise forge a new name 363 in the form "<segmentname>.<sectionname>" this will be prefixed with 364 LC_SEGMENT. if the segment name does not begin with an underscore. 365 366 SEGNAME and SECTNAME are 16 byte arrays (they do not need to be NUL- 367 terminated if the name length is exactly 16 bytes - but must be if the name 368 length is less than 16 characters). */ 369 370 void 371 bfd_mach_o_convert_section_name_to_bfd (bfd *abfd, const char *segname, 372 const char *secname, const char **name, 373 flagword *flags) 374 { 375 const mach_o_section_name_xlat *xlat; 376 char *res; 377 unsigned int len; 378 const char *pfx = ""; 379 380 *name = NULL; 381 *flags = SEC_NO_FLAGS; 382 383 /* First search for a canonical name... 384 xlat will be non-null if there is an entry for segname, secname. */ 385 xlat = bfd_mach_o_section_data_for_mach_sect (abfd, segname, secname); 386 if (xlat) 387 { 388 len = strlen (xlat->bfd_name); 389 res = bfd_alloc (abfd, len+1); 390 if (res == NULL) 391 return; 392 memcpy (res, xlat->bfd_name, len+1); 393 *name = res; 394 *flags = xlat->bfd_flags; 395 return; 396 } 397 398 /* ... else we make up a bfd name from the segment concatenated with the 399 section. */ 400 401 len = 16 + 1 + 16 + 1; 402 403 /* Put "LC_SEGMENT." prefix if the segment name is weird (ie doesn't start 404 with an underscore. */ 405 if (segname[0] != '_') 406 { 407 static const char seg_pfx[] = "LC_SEGMENT."; 408 409 pfx = seg_pfx; 410 len += sizeof (seg_pfx) - 1; 411 } 412 413 res = bfd_alloc (abfd, len); 414 if (res == NULL) 415 return; 416 snprintf (res, len, "%s%.16s.%.16s", pfx, segname, secname); 417 *name = res; 418 } 419 420 /* Convert a bfd section name to a Mach-O segment + section name. 421 422 If the name is a canonical one for which we have a Darwin match 423 return the translation table - which contains defaults for flags, 424 type, attribute and default alignment data. 425 426 Otherwise, expand the bfd_name (assumed to be in the form 427 "[LC_SEGMENT.]<segmentname>.<sectionname>") and return NULL. */ 428 429 static const mach_o_section_name_xlat * 430 bfd_mach_o_convert_section_name_to_mach_o (bfd *abfd ATTRIBUTE_UNUSED, 431 asection *sect, 432 bfd_mach_o_section *section) 433 { 434 const mach_o_section_name_xlat *xlat; 435 const char *name = bfd_get_section_name (abfd, sect); 436 const char *segname; 437 const char *dot; 438 unsigned int len; 439 unsigned int seglen; 440 unsigned int seclen; 441 442 memset (section->segname, 0, BFD_MACH_O_SEGNAME_SIZE + 1); 443 memset (section->sectname, 0, BFD_MACH_O_SECTNAME_SIZE + 1); 444 445 /* See if is a canonical name ... */ 446 xlat = bfd_mach_o_section_data_for_bfd_name (abfd, name, &segname); 447 if (xlat) 448 { 449 strcpy (section->segname, segname); 450 strcpy (section->sectname, xlat->mach_o_name); 451 return xlat; 452 } 453 454 /* .. else we convert our constructed one back to Mach-O. 455 Strip LC_SEGMENT. prefix, if present. */ 456 if (strncmp (name, "LC_SEGMENT.", 11) == 0) 457 name += 11; 458 459 /* Find a dot. */ 460 dot = strchr (name, '.'); 461 len = strlen (name); 462 463 /* Try to split name into segment and section names. */ 464 if (dot && dot != name) 465 { 466 seglen = dot - name; 467 seclen = len - (dot + 1 - name); 468 469 if (seglen < 16 && seclen < 16) 470 { 471 memcpy (section->segname, name, seglen); 472 section->segname[seglen] = 0; 473 memcpy (section->sectname, dot + 1, seclen); 474 section->sectname[seclen] = 0; 475 return NULL; 476 } 477 } 478 479 /* The segment and section names are both missing - don't make them 480 into dots. */ 481 if (dot && dot == name) 482 return NULL; 483 484 /* Just duplicate the name into both segment and section. */ 485 if (len > 16) 486 len = 16; 487 memcpy (section->segname, name, len); 488 section->segname[len] = 0; 489 memcpy (section->sectname, name, len); 490 section->sectname[len] = 0; 491 return NULL; 492 } 493 494 /* Return the size of an entry for section SEC. 495 Must be called only for symbol pointer section and symbol stubs 496 sections. */ 497 498 unsigned int 499 bfd_mach_o_section_get_entry_size (bfd *abfd, bfd_mach_o_section *sec) 500 { 501 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK) 502 { 503 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS: 504 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS: 505 return bfd_mach_o_wide_p (abfd) ? 8 : 4; 506 case BFD_MACH_O_S_SYMBOL_STUBS: 507 return sec->reserved2; 508 default: 509 BFD_FAIL (); 510 return 0; 511 } 512 } 513 514 /* Return the number of indirect symbols for a section. 515 Must be called only for symbol pointer section and symbol stubs 516 sections. */ 517 518 unsigned int 519 bfd_mach_o_section_get_nbr_indirect (bfd *abfd, bfd_mach_o_section *sec) 520 { 521 unsigned int elsz; 522 523 elsz = bfd_mach_o_section_get_entry_size (abfd, sec); 524 if (elsz == 0) 525 return 0; 526 else 527 return sec->size / elsz; 528 } 529 530 531 /* Copy any private info we understand from the input symbol 532 to the output symbol. */ 533 534 bfd_boolean 535 bfd_mach_o_bfd_copy_private_symbol_data (bfd *ibfd ATTRIBUTE_UNUSED, 536 asymbol *isymbol, 537 bfd *obfd ATTRIBUTE_UNUSED, 538 asymbol *osymbol) 539 { 540 bfd_mach_o_asymbol *os, *is; 541 os = (bfd_mach_o_asymbol *)osymbol; 542 is = (bfd_mach_o_asymbol *)isymbol; 543 os->n_type = is->n_type; 544 os->n_sect = is->n_sect; 545 os->n_desc = is->n_desc; 546 os->symbol.udata.i = is->symbol.udata.i; 547 return TRUE; 548 } 549 550 /* Copy any private info we understand from the input section 551 to the output section. */ 552 553 bfd_boolean 554 bfd_mach_o_bfd_copy_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED, 555 asection *isection, 556 bfd *obfd ATTRIBUTE_UNUSED, 557 asection *osection) 558 { 559 if (osection->used_by_bfd == NULL) 560 osection->used_by_bfd = isection->used_by_bfd; 561 else 562 if (isection->used_by_bfd != NULL) 563 memcpy (osection->used_by_bfd, isection->used_by_bfd, 564 sizeof (bfd_mach_o_section)); 565 566 if (osection->used_by_bfd != NULL) 567 ((bfd_mach_o_section *)osection->used_by_bfd)->bfdsection = osection; 568 569 return TRUE; 570 } 571 572 /* Copy any private info we understand from the input bfd 573 to the output bfd. */ 574 575 bfd_boolean 576 bfd_mach_o_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd) 577 { 578 if (bfd_get_flavour (ibfd) != bfd_target_mach_o_flavour 579 || bfd_get_flavour (obfd) != bfd_target_mach_o_flavour) 580 return TRUE; 581 582 BFD_ASSERT (bfd_mach_o_valid (ibfd)); 583 BFD_ASSERT (bfd_mach_o_valid (obfd)); 584 585 /* FIXME: copy commands. */ 586 587 return TRUE; 588 } 589 590 /* This allows us to set up to 32 bits of flags (unless we invent some 591 fiendish scheme to subdivide). For now, we'll just set the file flags 592 without error checking - just overwrite. */ 593 594 bfd_boolean 595 bfd_mach_o_bfd_set_private_flags (bfd *abfd, flagword flags) 596 { 597 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 598 599 if (!mdata) 600 return FALSE; 601 602 mdata->header.flags = flags; 603 return TRUE; 604 } 605 606 /* Count the total number of symbols. */ 607 608 static long 609 bfd_mach_o_count_symbols (bfd *abfd) 610 { 611 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 612 613 if (mdata->symtab == NULL) 614 return 0; 615 return mdata->symtab->nsyms; 616 } 617 618 long 619 bfd_mach_o_get_symtab_upper_bound (bfd *abfd) 620 { 621 long nsyms = bfd_mach_o_count_symbols (abfd); 622 623 return ((nsyms + 1) * sizeof (asymbol *)); 624 } 625 626 long 627 bfd_mach_o_canonicalize_symtab (bfd *abfd, asymbol **alocation) 628 { 629 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 630 long nsyms = bfd_mach_o_count_symbols (abfd); 631 bfd_mach_o_symtab_command *sym = mdata->symtab; 632 unsigned long j; 633 634 if (nsyms < 0) 635 return nsyms; 636 637 if (nsyms == 0) 638 { 639 /* Do not try to read symbols if there are none. */ 640 alocation[0] = NULL; 641 return 0; 642 } 643 644 if (!bfd_mach_o_read_symtab_symbols (abfd)) 645 { 646 (*_bfd_error_handler) 647 (_("bfd_mach_o_canonicalize_symtab: unable to load symbols")); 648 return 0; 649 } 650 651 BFD_ASSERT (sym->symbols != NULL); 652 653 for (j = 0; j < sym->nsyms; j++) 654 alocation[j] = &sym->symbols[j].symbol; 655 656 alocation[j] = NULL; 657 658 return nsyms; 659 } 660 661 /* Create synthetic symbols for indirect symbols. */ 662 663 long 664 bfd_mach_o_get_synthetic_symtab (bfd *abfd, 665 long symcount ATTRIBUTE_UNUSED, 666 asymbol **syms ATTRIBUTE_UNUSED, 667 long dynsymcount ATTRIBUTE_UNUSED, 668 asymbol **dynsyms ATTRIBUTE_UNUSED, 669 asymbol **ret) 670 { 671 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 672 bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab; 673 bfd_mach_o_symtab_command *symtab = mdata->symtab; 674 asymbol *s; 675 unsigned long count, i, j, n; 676 size_t size; 677 char *names; 678 char *nul_name; 679 680 *ret = NULL; 681 682 /* Stop now if no symbols or no indirect symbols. */ 683 if (dysymtab == NULL || symtab == NULL || symtab->symbols == NULL) 684 return 0; 685 686 if (dysymtab->nindirectsyms == 0) 687 return 0; 688 689 /* We need to allocate a bfd symbol for every indirect symbol and to 690 allocate the memory for its name. */ 691 count = dysymtab->nindirectsyms; 692 size = count * sizeof (asymbol) + 1; 693 694 for (j = 0; j < count; j++) 695 { 696 unsigned int isym = dysymtab->indirect_syms[j]; 697 698 /* Some indirect symbols are anonymous. */ 699 if (isym < symtab->nsyms && symtab->symbols[isym].symbol.name) 700 size += strlen (symtab->symbols[isym].symbol.name) + sizeof ("$stub"); 701 } 702 703 s = *ret = (asymbol *) bfd_malloc (size); 704 if (s == NULL) 705 return -1; 706 names = (char *) (s + count); 707 nul_name = names; 708 *names++ = 0; 709 710 n = 0; 711 for (i = 0; i < mdata->nsects; i++) 712 { 713 bfd_mach_o_section *sec = mdata->sections[i]; 714 unsigned int first, last; 715 bfd_vma addr; 716 bfd_vma entry_size; 717 718 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK) 719 { 720 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS: 721 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS: 722 case BFD_MACH_O_S_SYMBOL_STUBS: 723 /* Only these sections have indirect symbols. */ 724 first = sec->reserved1; 725 last = first + bfd_mach_o_section_get_nbr_indirect (abfd, sec); 726 addr = sec->addr; 727 entry_size = bfd_mach_o_section_get_entry_size (abfd, sec); 728 for (j = first; j < last; j++) 729 { 730 unsigned int isym = dysymtab->indirect_syms[j]; 731 732 s->flags = BSF_GLOBAL | BSF_SYNTHETIC; 733 s->section = sec->bfdsection; 734 s->value = addr - sec->addr; 735 s->udata.p = NULL; 736 737 if (isym < symtab->nsyms 738 && symtab->symbols[isym].symbol.name) 739 { 740 const char *sym = symtab->symbols[isym].symbol.name; 741 size_t len; 742 743 s->name = names; 744 len = strlen (sym); 745 memcpy (names, sym, len); 746 names += len; 747 memcpy (names, "$stub", sizeof ("$stub")); 748 names += sizeof ("$stub"); 749 } 750 else 751 s->name = nul_name; 752 753 addr += entry_size; 754 s++; 755 n++; 756 } 757 break; 758 default: 759 break; 760 } 761 } 762 763 return n; 764 } 765 766 void 767 bfd_mach_o_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED, 768 asymbol *symbol, 769 symbol_info *ret) 770 { 771 bfd_symbol_info (symbol, ret); 772 } 773 774 void 775 bfd_mach_o_print_symbol (bfd *abfd, 776 void * afile, 777 asymbol *symbol, 778 bfd_print_symbol_type how) 779 { 780 FILE *file = (FILE *) afile; 781 const char *name; 782 bfd_mach_o_asymbol *asym = (bfd_mach_o_asymbol *)symbol; 783 784 switch (how) 785 { 786 case bfd_print_symbol_name: 787 fprintf (file, "%s", symbol->name); 788 break; 789 default: 790 bfd_print_symbol_vandf (abfd, (void *) file, symbol); 791 if (asym->n_type & BFD_MACH_O_N_STAB) 792 name = bfd_get_stab_name (asym->n_type); 793 else 794 switch (asym->n_type & BFD_MACH_O_N_TYPE) 795 { 796 case BFD_MACH_O_N_UNDF: 797 if (symbol->value == 0) 798 name = "UND"; 799 else 800 name = "COM"; 801 break; 802 case BFD_MACH_O_N_ABS: 803 name = "ABS"; 804 break; 805 case BFD_MACH_O_N_INDR: 806 name = "INDR"; 807 break; 808 case BFD_MACH_O_N_PBUD: 809 name = "PBUD"; 810 break; 811 case BFD_MACH_O_N_SECT: 812 name = "SECT"; 813 break; 814 default: 815 name = "???"; 816 break; 817 } 818 if (name == NULL) 819 name = ""; 820 fprintf (file, " %02x %-6s %02x %04x", 821 asym->n_type, name, asym->n_sect, asym->n_desc); 822 if ((asym->n_type & BFD_MACH_O_N_STAB) == 0 823 && (asym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_SECT) 824 fprintf (file, " [%s]", symbol->section->name); 825 fprintf (file, " %s", symbol->name); 826 } 827 } 828 829 static void 830 bfd_mach_o_convert_architecture (bfd_mach_o_cpu_type mtype, 831 bfd_mach_o_cpu_subtype msubtype, 832 enum bfd_architecture *type, 833 unsigned long *subtype) 834 { 835 *subtype = bfd_arch_unknown; 836 837 switch (mtype) 838 { 839 case BFD_MACH_O_CPU_TYPE_VAX: 840 *type = bfd_arch_vax; 841 break; 842 case BFD_MACH_O_CPU_TYPE_MC680x0: 843 *type = bfd_arch_m68k; 844 break; 845 case BFD_MACH_O_CPU_TYPE_I386: 846 *type = bfd_arch_i386; 847 *subtype = bfd_mach_i386_i386; 848 break; 849 case BFD_MACH_O_CPU_TYPE_X86_64: 850 *type = bfd_arch_i386; 851 *subtype = bfd_mach_x86_64; 852 break; 853 case BFD_MACH_O_CPU_TYPE_MIPS: 854 *type = bfd_arch_mips; 855 break; 856 case BFD_MACH_O_CPU_TYPE_MC98000: 857 *type = bfd_arch_m98k; 858 break; 859 case BFD_MACH_O_CPU_TYPE_HPPA: 860 *type = bfd_arch_hppa; 861 break; 862 case BFD_MACH_O_CPU_TYPE_ARM: 863 *type = bfd_arch_arm; 864 switch (msubtype) 865 { 866 case BFD_MACH_O_CPU_SUBTYPE_ARM_V4T: 867 *subtype = bfd_mach_arm_4T; 868 break; 869 case BFD_MACH_O_CPU_SUBTYPE_ARM_V6: 870 *subtype = bfd_mach_arm_4T; /* Best fit ? */ 871 break; 872 case BFD_MACH_O_CPU_SUBTYPE_ARM_V5TEJ: 873 *subtype = bfd_mach_arm_5TE; 874 break; 875 case BFD_MACH_O_CPU_SUBTYPE_ARM_XSCALE: 876 *subtype = bfd_mach_arm_XScale; 877 break; 878 case BFD_MACH_O_CPU_SUBTYPE_ARM_V7: 879 *subtype = bfd_mach_arm_5TE; /* Best fit ? */ 880 break; 881 case BFD_MACH_O_CPU_SUBTYPE_ARM_ALL: 882 default: 883 break; 884 } 885 break; 886 case BFD_MACH_O_CPU_TYPE_MC88000: 887 *type = bfd_arch_m88k; 888 break; 889 case BFD_MACH_O_CPU_TYPE_SPARC: 890 *type = bfd_arch_sparc; 891 *subtype = bfd_mach_sparc; 892 break; 893 case BFD_MACH_O_CPU_TYPE_I860: 894 *type = bfd_arch_i860; 895 break; 896 case BFD_MACH_O_CPU_TYPE_ALPHA: 897 *type = bfd_arch_alpha; 898 break; 899 case BFD_MACH_O_CPU_TYPE_POWERPC: 900 *type = bfd_arch_powerpc; 901 *subtype = bfd_mach_ppc; 902 break; 903 case BFD_MACH_O_CPU_TYPE_POWERPC_64: 904 *type = bfd_arch_powerpc; 905 *subtype = bfd_mach_ppc64; 906 break; 907 default: 908 *type = bfd_arch_unknown; 909 break; 910 } 911 } 912 913 static bfd_boolean 914 bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header) 915 { 916 struct mach_o_header_external raw; 917 unsigned int size; 918 919 size = mach_o_wide_p (header) ? 920 BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE; 921 922 bfd_h_put_32 (abfd, header->magic, raw.magic); 923 bfd_h_put_32 (abfd, header->cputype, raw.cputype); 924 bfd_h_put_32 (abfd, header->cpusubtype, raw.cpusubtype); 925 bfd_h_put_32 (abfd, header->filetype, raw.filetype); 926 bfd_h_put_32 (abfd, header->ncmds, raw.ncmds); 927 bfd_h_put_32 (abfd, header->sizeofcmds, raw.sizeofcmds); 928 bfd_h_put_32 (abfd, header->flags, raw.flags); 929 930 if (mach_o_wide_p (header)) 931 bfd_h_put_32 (abfd, header->reserved, raw.reserved); 932 933 if (bfd_seek (abfd, 0, SEEK_SET) != 0 934 || bfd_bwrite (&raw, size, abfd) != size) 935 return FALSE; 936 937 return TRUE; 938 } 939 940 static int 941 bfd_mach_o_write_thread (bfd *abfd, bfd_mach_o_load_command *command) 942 { 943 bfd_mach_o_thread_command *cmd = &command->command.thread; 944 unsigned int i; 945 struct mach_o_thread_command_external raw; 946 unsigned int offset; 947 948 BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD) 949 || (command->type == BFD_MACH_O_LC_UNIXTHREAD)); 950 951 offset = 8; 952 for (i = 0; i < cmd->nflavours; i++) 953 { 954 BFD_ASSERT ((cmd->flavours[i].size % 4) == 0); 955 BFD_ASSERT (cmd->flavours[i].offset == 956 (command->offset + offset + BFD_MACH_O_LC_SIZE)); 957 958 bfd_h_put_32 (abfd, cmd->flavours[i].flavour, raw.flavour); 959 bfd_h_put_32 (abfd, (cmd->flavours[i].size / 4), raw.count); 960 961 if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0 962 || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw)) 963 return -1; 964 965 offset += cmd->flavours[i].size + sizeof (raw); 966 } 967 968 return 0; 969 } 970 971 long 972 bfd_mach_o_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, 973 asection *asect) 974 { 975 return (asect->reloc_count + 1) * sizeof (arelent *); 976 } 977 978 /* In addition to the need to byte-swap the symbol number, the bit positions 979 of the fields in the relocation information vary per target endian-ness. */ 980 981 static void 982 bfd_mach_o_swap_in_non_scattered_reloc (bfd *abfd, bfd_mach_o_reloc_info *rel, 983 unsigned char *fields) 984 { 985 unsigned char info = fields[3]; 986 987 if (bfd_big_endian (abfd)) 988 { 989 rel->r_value = (fields[0] << 16) | (fields[1] << 8) | fields[2]; 990 rel->r_type = (info >> BFD_MACH_O_BE_TYPE_SHIFT) & BFD_MACH_O_TYPE_MASK; 991 rel->r_pcrel = (info & BFD_MACH_O_BE_PCREL) ? 1 : 0; 992 rel->r_length = (info >> BFD_MACH_O_BE_LENGTH_SHIFT) 993 & BFD_MACH_O_LENGTH_MASK; 994 rel->r_extern = (info & BFD_MACH_O_BE_EXTERN) ? 1 : 0; 995 } 996 else 997 { 998 rel->r_value = (fields[2] << 16) | (fields[1] << 8) | fields[0]; 999 rel->r_type = (info >> BFD_MACH_O_LE_TYPE_SHIFT) & BFD_MACH_O_TYPE_MASK; 1000 rel->r_pcrel = (info & BFD_MACH_O_LE_PCREL) ? 1 : 0; 1001 rel->r_length = (info >> BFD_MACH_O_LE_LENGTH_SHIFT) 1002 & BFD_MACH_O_LENGTH_MASK; 1003 rel->r_extern = (info & BFD_MACH_O_LE_EXTERN) ? 1 : 0; 1004 } 1005 } 1006 1007 static int 1008 bfd_mach_o_canonicalize_one_reloc (bfd *abfd, 1009 struct mach_o_reloc_info_external *raw, 1010 arelent *res, asymbol **syms) 1011 { 1012 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 1013 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd); 1014 bfd_mach_o_reloc_info reloc; 1015 bfd_vma addr; 1016 asymbol **sym; 1017 1018 addr = bfd_get_32 (abfd, raw->r_address); 1019 res->sym_ptr_ptr = NULL; 1020 res->addend = 0; 1021 1022 if (addr & BFD_MACH_O_SR_SCATTERED) 1023 { 1024 unsigned int j; 1025 bfd_vma symnum = bfd_get_32 (abfd, raw->r_symbolnum); 1026 1027 /* Scattered relocation, can't be extern. */ 1028 reloc.r_scattered = 1; 1029 reloc.r_extern = 0; 1030 1031 /* Extract section and offset from r_value (symnum). */ 1032 reloc.r_value = symnum; 1033 /* FIXME: This breaks when a symbol in a reloc exactly follows the 1034 end of the data for the section (e.g. in a calculation of section 1035 data length). At present, the symbol will end up associated with 1036 the following section or, if it falls within alignment padding, as 1037 null - which will assert later. */ 1038 for (j = 0; j < mdata->nsects; j++) 1039 { 1040 bfd_mach_o_section *sect = mdata->sections[j]; 1041 if (symnum >= sect->addr && symnum < sect->addr + sect->size) 1042 { 1043 res->sym_ptr_ptr = sect->bfdsection->symbol_ptr_ptr; 1044 res->addend = symnum - sect->addr; 1045 break; 1046 } 1047 } 1048 1049 /* Extract the info and address fields from r_address. */ 1050 reloc.r_type = BFD_MACH_O_GET_SR_TYPE (addr); 1051 reloc.r_length = BFD_MACH_O_GET_SR_LENGTH (addr); 1052 reloc.r_pcrel = addr & BFD_MACH_O_SR_PCREL; 1053 reloc.r_address = BFD_MACH_O_GET_SR_TYPE (addr); 1054 res->address = BFD_MACH_O_GET_SR_ADDRESS (addr); 1055 } 1056 else 1057 { 1058 unsigned int num; 1059 1060 /* Non-scattered relocation. */ 1061 reloc.r_scattered = 0; 1062 1063 /* The value and info fields have to be extracted dependent on target 1064 endian-ness. */ 1065 bfd_mach_o_swap_in_non_scattered_reloc (abfd, &reloc, raw->r_symbolnum); 1066 num = reloc.r_value; 1067 1068 if (reloc.r_extern) 1069 { 1070 /* An external symbol number. */ 1071 sym = syms + num; 1072 } 1073 else if (num == 0x00ffffff) 1074 { 1075 /* The 'symnum' in a non-scattered PAIR is 0x00ffffff. But as this 1076 is generic code, we don't know wether this is really a PAIR. 1077 This value is almost certainly not a valid section number, hence 1078 this specific case to avoid an assertion failure. 1079 Target specific swap_reloc_in routine should adjust that. */ 1080 sym = bfd_abs_section_ptr->symbol_ptr_ptr; 1081 } 1082 else 1083 { 1084 /* A section number. */ 1085 BFD_ASSERT (num != 0); 1086 BFD_ASSERT (num <= mdata->nsects); 1087 1088 sym = mdata->sections[num - 1]->bfdsection->symbol_ptr_ptr; 1089 /* For a symbol defined in section S, the addend (stored in the 1090 binary) contains the address of the section. To comply with 1091 bfd convention, subtract the section address. 1092 Use the address from the header, so that the user can modify 1093 the vma of the section. */ 1094 res->addend = -mdata->sections[num - 1]->addr; 1095 } 1096 /* Note: Pairs for PPC LO/HI/HA are not scattered, but contain the offset 1097 in the lower 16bits of the address value. So we have to find the 1098 'symbol' from the preceding reloc. We do this even though the 1099 section symbol is probably not needed here, because NULL symbol 1100 values cause an assert in generic BFD code. This must be done in 1101 the PPC swap_reloc_in routine. */ 1102 res->sym_ptr_ptr = sym; 1103 1104 /* The 'address' is just r_address. 1105 ??? maybe this should be masked with 0xffffff for safety. */ 1106 res->address = addr; 1107 reloc.r_address = addr; 1108 } 1109 1110 /* We have set up a reloc with all the information present, so the swapper 1111 can modify address, value and addend fields, if necessary, to convey 1112 information in the generic BFD reloc that is mach-o specific. */ 1113 1114 if (!(*bed->_bfd_mach_o_swap_reloc_in)(res, &reloc)) 1115 return -1; 1116 return 0; 1117 } 1118 1119 static int 1120 bfd_mach_o_canonicalize_relocs (bfd *abfd, unsigned long filepos, 1121 unsigned long count, 1122 arelent *res, asymbol **syms) 1123 { 1124 unsigned long i; 1125 struct mach_o_reloc_info_external *native_relocs; 1126 bfd_size_type native_size; 1127 1128 /* Allocate and read relocs. */ 1129 native_size = count * BFD_MACH_O_RELENT_SIZE; 1130 native_relocs = 1131 (struct mach_o_reloc_info_external *) bfd_malloc (native_size); 1132 if (native_relocs == NULL) 1133 return -1; 1134 1135 if (bfd_seek (abfd, filepos, SEEK_SET) != 0 1136 || bfd_bread (native_relocs, native_size, abfd) != native_size) 1137 goto err; 1138 1139 for (i = 0; i < count; i++) 1140 { 1141 if (bfd_mach_o_canonicalize_one_reloc (abfd, &native_relocs[i], 1142 &res[i], syms) < 0) 1143 goto err; 1144 } 1145 free (native_relocs); 1146 return i; 1147 err: 1148 free (native_relocs); 1149 return -1; 1150 } 1151 1152 long 1153 bfd_mach_o_canonicalize_reloc (bfd *abfd, asection *asect, 1154 arelent **rels, asymbol **syms) 1155 { 1156 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd); 1157 unsigned long i; 1158 arelent *res; 1159 1160 if (asect->reloc_count == 0) 1161 return 0; 1162 1163 /* No need to go further if we don't know how to read relocs. */ 1164 if (bed->_bfd_mach_o_swap_reloc_in == NULL) 1165 return 0; 1166 1167 if (asect->relocation == NULL) 1168 { 1169 res = bfd_malloc (asect->reloc_count * sizeof (arelent)); 1170 if (res == NULL) 1171 return -1; 1172 1173 if (bfd_mach_o_canonicalize_relocs (abfd, asect->rel_filepos, 1174 asect->reloc_count, res, syms) < 0) 1175 { 1176 free (res); 1177 return -1; 1178 } 1179 asect->relocation = res; 1180 } 1181 1182 res = asect->relocation; 1183 for (i = 0; i < asect->reloc_count; i++) 1184 rels[i] = &res[i]; 1185 rels[i] = NULL; 1186 1187 return i; 1188 } 1189 1190 long 1191 bfd_mach_o_get_dynamic_reloc_upper_bound (bfd *abfd) 1192 { 1193 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 1194 1195 if (mdata->dysymtab == NULL) 1196 return 1; 1197 return (mdata->dysymtab->nextrel + mdata->dysymtab->nlocrel + 1) 1198 * sizeof (arelent *); 1199 } 1200 1201 long 1202 bfd_mach_o_canonicalize_dynamic_reloc (bfd *abfd, arelent **rels, 1203 struct bfd_symbol **syms) 1204 { 1205 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 1206 bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab; 1207 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd); 1208 unsigned long i; 1209 arelent *res; 1210 1211 if (dysymtab == NULL) 1212 return 0; 1213 if (dysymtab->nextrel == 0 && dysymtab->nlocrel == 0) 1214 return 0; 1215 1216 /* No need to go further if we don't know how to read relocs. */ 1217 if (bed->_bfd_mach_o_swap_reloc_in == NULL) 1218 return 0; 1219 1220 if (mdata->dyn_reloc_cache == NULL) 1221 { 1222 res = bfd_malloc ((dysymtab->nextrel + dysymtab->nlocrel) 1223 * sizeof (arelent)); 1224 if (res == NULL) 1225 return -1; 1226 1227 if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->extreloff, 1228 dysymtab->nextrel, res, syms) < 0) 1229 { 1230 free (res); 1231 return -1; 1232 } 1233 1234 if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->locreloff, 1235 dysymtab->nlocrel, 1236 res + dysymtab->nextrel, syms) < 0) 1237 { 1238 free (res); 1239 return -1; 1240 } 1241 1242 mdata->dyn_reloc_cache = res; 1243 } 1244 1245 res = mdata->dyn_reloc_cache; 1246 for (i = 0; i < dysymtab->nextrel + dysymtab->nlocrel; i++) 1247 rels[i] = &res[i]; 1248 rels[i] = NULL; 1249 return i; 1250 } 1251 1252 /* In addition to the need to byte-swap the symbol number, the bit positions 1253 of the fields in the relocation information vary per target endian-ness. */ 1254 1255 static void 1256 bfd_mach_o_swap_out_non_scattered_reloc (bfd *abfd, unsigned char *fields, 1257 bfd_mach_o_reloc_info *rel) 1258 { 1259 unsigned char info = 0; 1260 1261 BFD_ASSERT (rel->r_type <= 15); 1262 BFD_ASSERT (rel->r_length <= 3); 1263 1264 if (bfd_big_endian (abfd)) 1265 { 1266 fields[0] = (rel->r_value >> 16) & 0xff; 1267 fields[1] = (rel->r_value >> 8) & 0xff; 1268 fields[2] = rel->r_value & 0xff; 1269 info |= rel->r_type << BFD_MACH_O_BE_TYPE_SHIFT; 1270 info |= rel->r_pcrel ? BFD_MACH_O_BE_PCREL : 0; 1271 info |= rel->r_length << BFD_MACH_O_BE_LENGTH_SHIFT; 1272 info |= rel->r_extern ? BFD_MACH_O_BE_EXTERN : 0; 1273 } 1274 else 1275 { 1276 fields[2] = (rel->r_value >> 16) & 0xff; 1277 fields[1] = (rel->r_value >> 8) & 0xff; 1278 fields[0] = rel->r_value & 0xff; 1279 info |= rel->r_type << BFD_MACH_O_LE_TYPE_SHIFT; 1280 info |= rel->r_pcrel ? BFD_MACH_O_LE_PCREL : 0; 1281 info |= rel->r_length << BFD_MACH_O_LE_LENGTH_SHIFT; 1282 info |= rel->r_extern ? BFD_MACH_O_LE_EXTERN : 0; 1283 } 1284 fields[3] = info; 1285 } 1286 1287 static bfd_boolean 1288 bfd_mach_o_write_relocs (bfd *abfd, bfd_mach_o_section *section) 1289 { 1290 unsigned int i; 1291 arelent **entries; 1292 asection *sec; 1293 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd); 1294 1295 sec = section->bfdsection; 1296 if (sec->reloc_count == 0) 1297 return TRUE; 1298 1299 if (bed->_bfd_mach_o_swap_reloc_out == NULL) 1300 return TRUE; 1301 1302 if (bfd_seek (abfd, section->reloff, SEEK_SET) != 0) 1303 return FALSE; 1304 1305 /* Convert and write. */ 1306 entries = section->bfdsection->orelocation; 1307 for (i = 0; i < section->nreloc; i++) 1308 { 1309 arelent *rel = entries[i]; 1310 struct mach_o_reloc_info_external raw; 1311 bfd_mach_o_reloc_info info, *pinfo = &info; 1312 1313 /* Convert relocation to an intermediate representation. */ 1314 if (!(*bed->_bfd_mach_o_swap_reloc_out) (rel, pinfo)) 1315 return FALSE; 1316 1317 /* Lower the relocation info. */ 1318 if (pinfo->r_scattered) 1319 { 1320 unsigned long v; 1321 1322 v = BFD_MACH_O_SR_SCATTERED 1323 | (pinfo->r_pcrel ? BFD_MACH_O_SR_PCREL : 0) 1324 | BFD_MACH_O_SET_SR_LENGTH(pinfo->r_length) 1325 | BFD_MACH_O_SET_SR_TYPE(pinfo->r_type) 1326 | BFD_MACH_O_SET_SR_ADDRESS(pinfo->r_address); 1327 /* Note: scattered relocs have field in reverse order... */ 1328 bfd_put_32 (abfd, v, raw.r_address); 1329 bfd_put_32 (abfd, pinfo->r_value, raw.r_symbolnum); 1330 } 1331 else 1332 { 1333 bfd_put_32 (abfd, pinfo->r_address, raw.r_address); 1334 bfd_mach_o_swap_out_non_scattered_reloc (abfd, raw.r_symbolnum, 1335 pinfo); 1336 } 1337 1338 if (bfd_bwrite (&raw, BFD_MACH_O_RELENT_SIZE, abfd) 1339 != BFD_MACH_O_RELENT_SIZE) 1340 return FALSE; 1341 } 1342 return TRUE; 1343 } 1344 1345 static int 1346 bfd_mach_o_write_section_32 (bfd *abfd, bfd_mach_o_section *section) 1347 { 1348 struct mach_o_section_32_external raw; 1349 1350 memcpy (raw.sectname, section->sectname, 16); 1351 memcpy (raw.segname, section->segname, 16); 1352 bfd_h_put_32 (abfd, section->addr, raw.addr); 1353 bfd_h_put_32 (abfd, section->size, raw.size); 1354 bfd_h_put_32 (abfd, section->offset, raw.offset); 1355 bfd_h_put_32 (abfd, section->align, raw.align); 1356 bfd_h_put_32 (abfd, section->reloff, raw.reloff); 1357 bfd_h_put_32 (abfd, section->nreloc, raw.nreloc); 1358 bfd_h_put_32 (abfd, section->flags, raw.flags); 1359 bfd_h_put_32 (abfd, section->reserved1, raw.reserved1); 1360 bfd_h_put_32 (abfd, section->reserved2, raw.reserved2); 1361 1362 if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_SIZE, abfd) 1363 != BFD_MACH_O_SECTION_SIZE) 1364 return -1; 1365 1366 return 0; 1367 } 1368 1369 static int 1370 bfd_mach_o_write_section_64 (bfd *abfd, bfd_mach_o_section *section) 1371 { 1372 struct mach_o_section_64_external raw; 1373 1374 memcpy (raw.sectname, section->sectname, 16); 1375 memcpy (raw.segname, section->segname, 16); 1376 bfd_h_put_64 (abfd, section->addr, raw.addr); 1377 bfd_h_put_64 (abfd, section->size, raw.size); 1378 bfd_h_put_32 (abfd, section->offset, raw.offset); 1379 bfd_h_put_32 (abfd, section->align, raw.align); 1380 bfd_h_put_32 (abfd, section->reloff, raw.reloff); 1381 bfd_h_put_32 (abfd, section->nreloc, raw.nreloc); 1382 bfd_h_put_32 (abfd, section->flags, raw.flags); 1383 bfd_h_put_32 (abfd, section->reserved1, raw.reserved1); 1384 bfd_h_put_32 (abfd, section->reserved2, raw.reserved2); 1385 bfd_h_put_32 (abfd, section->reserved3, raw.reserved3); 1386 1387 if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd) 1388 != BFD_MACH_O_SECTION_64_SIZE) 1389 return -1; 1390 1391 return 0; 1392 } 1393 1394 static int 1395 bfd_mach_o_write_segment_32 (bfd *abfd, bfd_mach_o_load_command *command) 1396 { 1397 struct mach_o_segment_command_32_external raw; 1398 bfd_mach_o_segment_command *seg = &command->command.segment; 1399 bfd_mach_o_section *sec; 1400 1401 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT); 1402 1403 for (sec = seg->sect_head; sec != NULL; sec = sec->next) 1404 if (!bfd_mach_o_write_relocs (abfd, sec)) 1405 return -1; 1406 1407 memcpy (raw.segname, seg->segname, 16); 1408 bfd_h_put_32 (abfd, seg->vmaddr, raw.vmaddr); 1409 bfd_h_put_32 (abfd, seg->vmsize, raw.vmsize); 1410 bfd_h_put_32 (abfd, seg->fileoff, raw.fileoff); 1411 bfd_h_put_32 (abfd, seg->filesize, raw.filesize); 1412 bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot); 1413 bfd_h_put_32 (abfd, seg->initprot, raw.initprot); 1414 bfd_h_put_32 (abfd, seg->nsects, raw.nsects); 1415 bfd_h_put_32 (abfd, seg->flags, raw.flags); 1416 1417 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 1418 || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw)) 1419 return -1; 1420 1421 for (sec = seg->sect_head; sec != NULL; sec = sec->next) 1422 if (bfd_mach_o_write_section_32 (abfd, sec)) 1423 return -1; 1424 1425 return 0; 1426 } 1427 1428 static int 1429 bfd_mach_o_write_segment_64 (bfd *abfd, bfd_mach_o_load_command *command) 1430 { 1431 struct mach_o_segment_command_64_external raw; 1432 bfd_mach_o_segment_command *seg = &command->command.segment; 1433 bfd_mach_o_section *sec; 1434 1435 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64); 1436 1437 for (sec = seg->sect_head; sec != NULL; sec = sec->next) 1438 if (!bfd_mach_o_write_relocs (abfd, sec)) 1439 return -1; 1440 1441 memcpy (raw.segname, seg->segname, 16); 1442 bfd_h_put_64 (abfd, seg->vmaddr, raw.vmaddr); 1443 bfd_h_put_64 (abfd, seg->vmsize, raw.vmsize); 1444 bfd_h_put_64 (abfd, seg->fileoff, raw.fileoff); 1445 bfd_h_put_64 (abfd, seg->filesize, raw.filesize); 1446 bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot); 1447 bfd_h_put_32 (abfd, seg->initprot, raw.initprot); 1448 bfd_h_put_32 (abfd, seg->nsects, raw.nsects); 1449 bfd_h_put_32 (abfd, seg->flags, raw.flags); 1450 1451 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 1452 || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw)) 1453 return -1; 1454 1455 for (sec = seg->sect_head; sec != NULL; sec = sec->next) 1456 if (bfd_mach_o_write_section_64 (abfd, sec)) 1457 return -1; 1458 1459 return 0; 1460 } 1461 1462 static bfd_boolean 1463 bfd_mach_o_write_symtab (bfd *abfd, bfd_mach_o_load_command *command) 1464 { 1465 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 1466 bfd_mach_o_symtab_command *sym = &command->command.symtab; 1467 unsigned long i; 1468 unsigned int wide = bfd_mach_o_wide_p (abfd); 1469 unsigned int symlen = wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE; 1470 struct bfd_strtab_hash *strtab; 1471 asymbol **symbols = bfd_get_outsymbols (abfd); 1472 1473 BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB); 1474 1475 /* Write the symbols first. */ 1476 mdata->filelen = FILE_ALIGN(mdata->filelen, wide ? 3 : 2); 1477 sym->symoff = mdata->filelen; 1478 if (bfd_seek (abfd, sym->symoff, SEEK_SET) != 0) 1479 return FALSE; 1480 1481 sym->nsyms = bfd_get_symcount (abfd); 1482 mdata->filelen += sym->nsyms * symlen; 1483 1484 strtab = _bfd_stringtab_init (); 1485 if (strtab == NULL) 1486 return FALSE; 1487 1488 if (sym->nsyms > 0) 1489 /* Although we don't strictly need to do this, for compatibility with 1490 Darwin system tools, actually output an empty string for the index 1491 0 entry. */ 1492 _bfd_stringtab_add (strtab, "", TRUE, FALSE); 1493 1494 for (i = 0; i < sym->nsyms; i++) 1495 { 1496 bfd_size_type str_index; 1497 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i]; 1498 1499 if (s->symbol.name == 0 || s->symbol.name[0] == '\0') 1500 /* An index of 0 always means the empty string. */ 1501 str_index = 0; 1502 else 1503 { 1504 str_index = _bfd_stringtab_add (strtab, s->symbol.name, TRUE, FALSE); 1505 1506 if (str_index == (bfd_size_type) -1) 1507 goto err; 1508 } 1509 1510 if (wide) 1511 { 1512 struct mach_o_nlist_64_external raw; 1513 1514 bfd_h_put_32 (abfd, str_index, raw.n_strx); 1515 bfd_h_put_8 (abfd, s->n_type, raw.n_type); 1516 bfd_h_put_8 (abfd, s->n_sect, raw.n_sect); 1517 bfd_h_put_16 (abfd, s->n_desc, raw.n_desc); 1518 bfd_h_put_64 (abfd, s->symbol.section->vma + s->symbol.value, 1519 raw.n_value); 1520 1521 if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw)) 1522 goto err; 1523 } 1524 else 1525 { 1526 struct mach_o_nlist_external raw; 1527 1528 bfd_h_put_32 (abfd, str_index, raw.n_strx); 1529 bfd_h_put_8 (abfd, s->n_type, raw.n_type); 1530 bfd_h_put_8 (abfd, s->n_sect, raw.n_sect); 1531 bfd_h_put_16 (abfd, s->n_desc, raw.n_desc); 1532 bfd_h_put_32 (abfd, s->symbol.section->vma + s->symbol.value, 1533 raw.n_value); 1534 1535 if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw)) 1536 goto err; 1537 } 1538 } 1539 sym->strsize = _bfd_stringtab_size (strtab); 1540 sym->stroff = mdata->filelen; 1541 mdata->filelen += sym->strsize; 1542 1543 if (_bfd_stringtab_emit (abfd, strtab) != TRUE) 1544 goto err; 1545 _bfd_stringtab_free (strtab); 1546 1547 /* The command. */ 1548 { 1549 struct mach_o_symtab_command_external raw; 1550 1551 bfd_h_put_32 (abfd, sym->symoff, raw.symoff); 1552 bfd_h_put_32 (abfd, sym->nsyms, raw.nsyms); 1553 bfd_h_put_32 (abfd, sym->stroff, raw.stroff); 1554 bfd_h_put_32 (abfd, sym->strsize, raw.strsize); 1555 1556 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 1557 || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw)) 1558 return FALSE; 1559 } 1560 1561 return TRUE; 1562 1563 err: 1564 _bfd_stringtab_free (strtab); 1565 return FALSE; 1566 } 1567 1568 /* Write a dysymtab command. 1569 TODO: Possibly coalesce writes of smaller objects. */ 1570 1571 static bfd_boolean 1572 bfd_mach_o_write_dysymtab (bfd *abfd, bfd_mach_o_load_command *command) 1573 { 1574 bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab; 1575 1576 BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB); 1577 1578 if (cmd->nmodtab != 0) 1579 { 1580 unsigned int i; 1581 1582 if (bfd_seek (abfd, cmd->modtaboff, SEEK_SET) != 0) 1583 return FALSE; 1584 1585 for (i = 0; i < cmd->nmodtab; i++) 1586 { 1587 bfd_mach_o_dylib_module *module = &cmd->dylib_module[i]; 1588 unsigned int iinit; 1589 unsigned int ninit; 1590 1591 iinit = module->iinit & 0xffff; 1592 iinit |= ((module->iterm & 0xffff) << 16); 1593 1594 ninit = module->ninit & 0xffff; 1595 ninit |= ((module->nterm & 0xffff) << 16); 1596 1597 if (bfd_mach_o_wide_p (abfd)) 1598 { 1599 struct mach_o_dylib_module_64_external w; 1600 1601 bfd_h_put_32 (abfd, module->module_name_idx, &w.module_name); 1602 bfd_h_put_32 (abfd, module->iextdefsym, &w.iextdefsym); 1603 bfd_h_put_32 (abfd, module->nextdefsym, &w.nextdefsym); 1604 bfd_h_put_32 (abfd, module->irefsym, &w.irefsym); 1605 bfd_h_put_32 (abfd, module->nrefsym, &w.nrefsym); 1606 bfd_h_put_32 (abfd, module->ilocalsym, &w.ilocalsym); 1607 bfd_h_put_32 (abfd, module->nlocalsym, &w.nlocalsym); 1608 bfd_h_put_32 (abfd, module->iextrel, &w.iextrel); 1609 bfd_h_put_32 (abfd, module->nextrel, &w.nextrel); 1610 bfd_h_put_32 (abfd, iinit, &w.iinit_iterm); 1611 bfd_h_put_32 (abfd, ninit, &w.ninit_nterm); 1612 bfd_h_put_64 (abfd, module->objc_module_info_addr, 1613 &w.objc_module_info_addr); 1614 bfd_h_put_32 (abfd, module->objc_module_info_size, 1615 &w.objc_module_info_size); 1616 1617 if (bfd_bwrite ((void *) &w, sizeof (w), abfd) != sizeof (w)) 1618 return FALSE; 1619 } 1620 else 1621 { 1622 struct mach_o_dylib_module_external n; 1623 1624 bfd_h_put_32 (abfd, module->module_name_idx, &n.module_name); 1625 bfd_h_put_32 (abfd, module->iextdefsym, &n.iextdefsym); 1626 bfd_h_put_32 (abfd, module->nextdefsym, &n.nextdefsym); 1627 bfd_h_put_32 (abfd, module->irefsym, &n.irefsym); 1628 bfd_h_put_32 (abfd, module->nrefsym, &n.nrefsym); 1629 bfd_h_put_32 (abfd, module->ilocalsym, &n.ilocalsym); 1630 bfd_h_put_32 (abfd, module->nlocalsym, &n.nlocalsym); 1631 bfd_h_put_32 (abfd, module->iextrel, &n.iextrel); 1632 bfd_h_put_32 (abfd, module->nextrel, &n.nextrel); 1633 bfd_h_put_32 (abfd, iinit, &n.iinit_iterm); 1634 bfd_h_put_32 (abfd, ninit, &n.ninit_nterm); 1635 bfd_h_put_32 (abfd, module->objc_module_info_addr, 1636 &n.objc_module_info_addr); 1637 bfd_h_put_32 (abfd, module->objc_module_info_size, 1638 &n.objc_module_info_size); 1639 1640 if (bfd_bwrite ((void *) &n, sizeof (n), abfd) != sizeof (n)) 1641 return FALSE; 1642 } 1643 } 1644 } 1645 1646 if (cmd->ntoc != 0) 1647 { 1648 unsigned int i; 1649 1650 if (bfd_seek (abfd, cmd->tocoff, SEEK_SET) != 0) 1651 return FALSE; 1652 1653 for (i = 0; i < cmd->ntoc; i++) 1654 { 1655 struct mach_o_dylib_table_of_contents_external raw; 1656 bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i]; 1657 1658 bfd_h_put_32 (abfd, toc->symbol_index, &raw.symbol_index); 1659 bfd_h_put_32 (abfd, toc->module_index, &raw.module_index); 1660 1661 if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw)) 1662 return FALSE; 1663 } 1664 } 1665 1666 if (cmd->nindirectsyms > 0) 1667 { 1668 unsigned int i; 1669 1670 if (bfd_seek (abfd, cmd->indirectsymoff, SEEK_SET) != 0) 1671 return FALSE; 1672 1673 for (i = 0; i < cmd->nindirectsyms; ++i) 1674 { 1675 unsigned char raw[4]; 1676 1677 bfd_h_put_32 (abfd, cmd->indirect_syms[i], &raw); 1678 if (bfd_bwrite (raw, sizeof (raw), abfd) != sizeof (raw)) 1679 return FALSE; 1680 } 1681 } 1682 1683 if (cmd->nextrefsyms != 0) 1684 { 1685 unsigned int i; 1686 1687 if (bfd_seek (abfd, cmd->extrefsymoff, SEEK_SET) != 0) 1688 return FALSE; 1689 1690 for (i = 0; i < cmd->nextrefsyms; i++) 1691 { 1692 unsigned long v; 1693 unsigned char raw[4]; 1694 bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i]; 1695 1696 /* Fields isym and flags are written as bit-fields, thus we need 1697 a specific processing for endianness. */ 1698 1699 if (bfd_big_endian (abfd)) 1700 { 1701 v = ((ref->isym & 0xffffff) << 8); 1702 v |= ref->flags & 0xff; 1703 } 1704 else 1705 { 1706 v = ref->isym & 0xffffff; 1707 v |= ((ref->flags & 0xff) << 24); 1708 } 1709 1710 bfd_h_put_32 (abfd, v, raw); 1711 if (bfd_bwrite (raw, sizeof (raw), abfd) != sizeof (raw)) 1712 return FALSE; 1713 } 1714 } 1715 1716 /* The command. */ 1717 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0) 1718 return FALSE; 1719 else 1720 { 1721 struct mach_o_dysymtab_command_external raw; 1722 1723 bfd_h_put_32 (abfd, cmd->ilocalsym, &raw.ilocalsym); 1724 bfd_h_put_32 (abfd, cmd->nlocalsym, &raw.nlocalsym); 1725 bfd_h_put_32 (abfd, cmd->iextdefsym, &raw.iextdefsym); 1726 bfd_h_put_32 (abfd, cmd->nextdefsym, &raw.nextdefsym); 1727 bfd_h_put_32 (abfd, cmd->iundefsym, &raw.iundefsym); 1728 bfd_h_put_32 (abfd, cmd->nundefsym, &raw.nundefsym); 1729 bfd_h_put_32 (abfd, cmd->tocoff, &raw.tocoff); 1730 bfd_h_put_32 (abfd, cmd->ntoc, &raw.ntoc); 1731 bfd_h_put_32 (abfd, cmd->modtaboff, &raw.modtaboff); 1732 bfd_h_put_32 (abfd, cmd->nmodtab, &raw.nmodtab); 1733 bfd_h_put_32 (abfd, cmd->extrefsymoff, &raw.extrefsymoff); 1734 bfd_h_put_32 (abfd, cmd->nextrefsyms, &raw.nextrefsyms); 1735 bfd_h_put_32 (abfd, cmd->indirectsymoff, &raw.indirectsymoff); 1736 bfd_h_put_32 (abfd, cmd->nindirectsyms, &raw.nindirectsyms); 1737 bfd_h_put_32 (abfd, cmd->extreloff, &raw.extreloff); 1738 bfd_h_put_32 (abfd, cmd->nextrel, &raw.nextrel); 1739 bfd_h_put_32 (abfd, cmd->locreloff, &raw.locreloff); 1740 bfd_h_put_32 (abfd, cmd->nlocrel, &raw.nlocrel); 1741 1742 if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw)) 1743 return FALSE; 1744 } 1745 1746 return TRUE; 1747 } 1748 1749 static unsigned 1750 bfd_mach_o_primary_symbol_sort_key (bfd_mach_o_asymbol *s) 1751 { 1752 unsigned mtyp = s->n_type & BFD_MACH_O_N_TYPE; 1753 1754 /* Just leave debug symbols where they are (pretend they are local, and 1755 then they will just be sorted on position). */ 1756 if (s->n_type & BFD_MACH_O_N_STAB) 1757 return 0; 1758 1759 /* Local (we should never see an undefined local AFAICT). */ 1760 if (! (s->n_type & (BFD_MACH_O_N_EXT | BFD_MACH_O_N_PEXT))) 1761 return 0; 1762 1763 /* Common symbols look like undefined externs. */ 1764 if (mtyp == BFD_MACH_O_N_UNDF) 1765 return 2; 1766 1767 /* A defined non-local, non-debug symbol. */ 1768 return 1; 1769 } 1770 1771 static int 1772 bfd_mach_o_cf_symbols (const void *a, const void *b) 1773 { 1774 bfd_mach_o_asymbol *sa = *(bfd_mach_o_asymbol **) a; 1775 bfd_mach_o_asymbol *sb = *(bfd_mach_o_asymbol **) b; 1776 unsigned int soa, sob; 1777 1778 soa = bfd_mach_o_primary_symbol_sort_key (sa); 1779 sob = bfd_mach_o_primary_symbol_sort_key (sb); 1780 if (soa < sob) 1781 return -1; 1782 1783 if (soa > sob) 1784 return 1; 1785 1786 /* If it's local or stab, just preserve the input order. */ 1787 if (soa == 0) 1788 { 1789 if (sa->symbol.udata.i < sb->symbol.udata.i) 1790 return -1; 1791 if (sa->symbol.udata.i > sb->symbol.udata.i) 1792 return 1; 1793 1794 /* This is probably an error. */ 1795 return 0; 1796 } 1797 1798 /* The second sort key is name. */ 1799 return strcmp (sa->symbol.name, sb->symbol.name); 1800 } 1801 1802 /* Process the symbols. 1803 1804 This should be OK for single-module files - but it is not likely to work 1805 for multi-module shared libraries. 1806 1807 (a) If the application has not filled in the relevant mach-o fields, make 1808 an estimate. 1809 1810 (b) Order them, like this: 1811 ( i) local. 1812 (unsorted) 1813 ( ii) external defined 1814 (by name) 1815 (iii) external undefined/common 1816 (by name) 1817 ( iv) common 1818 (by name) 1819 */ 1820 1821 static bfd_boolean 1822 bfd_mach_o_mangle_symbols (bfd *abfd) 1823 { 1824 unsigned long i; 1825 asymbol **symbols = bfd_get_outsymbols (abfd); 1826 1827 if (symbols == NULL || bfd_get_symcount (abfd) == 0) 1828 return TRUE; 1829 1830 for (i = 0; i < bfd_get_symcount (abfd); i++) 1831 { 1832 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i]; 1833 1834 /* We use this value, which is out-of-range as a symbol index, to signal 1835 that the mach-o-specific data are not filled in and need to be created 1836 from the bfd values. It is much preferable for the application to do 1837 this, since more meaningful diagnostics can be made that way. */ 1838 1839 if (s->symbol.udata.i == SYM_MACHO_FIELDS_UNSET) 1840 { 1841 /* No symbol information has been set - therefore determine 1842 it from the bfd symbol flags/info. */ 1843 if (s->symbol.section == bfd_abs_section_ptr) 1844 s->n_type = BFD_MACH_O_N_ABS; 1845 else if (s->symbol.section == bfd_und_section_ptr) 1846 { 1847 s->n_type = BFD_MACH_O_N_UNDF; 1848 if (s->symbol.flags & BSF_WEAK) 1849 s->n_desc |= BFD_MACH_O_N_WEAK_REF; 1850 /* mach-o automatically makes undefined symbols extern. */ 1851 s->n_type |= BFD_MACH_O_N_EXT; 1852 s->symbol.flags |= BSF_GLOBAL; 1853 } 1854 else if (s->symbol.section == bfd_com_section_ptr) 1855 { 1856 s->n_type = BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT; 1857 s->symbol.flags |= BSF_GLOBAL; 1858 } 1859 else 1860 s->n_type = BFD_MACH_O_N_SECT; 1861 1862 if (s->symbol.flags & BSF_GLOBAL) 1863 s->n_type |= BFD_MACH_O_N_EXT; 1864 } 1865 1866 /* Put the section index in, where required. */ 1867 if ((s->symbol.section != bfd_abs_section_ptr 1868 && s->symbol.section != bfd_und_section_ptr 1869 && s->symbol.section != bfd_com_section_ptr) 1870 || ((s->n_type & BFD_MACH_O_N_STAB) != 0 1871 && s->symbol.name == NULL)) 1872 s->n_sect = s->symbol.section->target_index; 1873 1874 /* Number to preserve order for local and debug syms. */ 1875 s->symbol.udata.i = i; 1876 } 1877 1878 /* Sort the symbols. */ 1879 qsort ((void *) symbols, (size_t) bfd_get_symcount (abfd), 1880 sizeof (asymbol *), bfd_mach_o_cf_symbols); 1881 1882 for (i = 0; i < bfd_get_symcount (abfd); ++i) 1883 { 1884 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i]; 1885 s->symbol.udata.i = i; /* renumber. */ 1886 } 1887 1888 return TRUE; 1889 } 1890 1891 /* We build a flat table of sections, which can be re-ordered if necessary. 1892 Fill in the section number and other mach-o-specific data. */ 1893 1894 static bfd_boolean 1895 bfd_mach_o_mangle_sections (bfd *abfd, bfd_mach_o_data_struct *mdata) 1896 { 1897 asection *sec; 1898 unsigned target_index; 1899 unsigned nsect; 1900 1901 nsect = bfd_count_sections (abfd); 1902 1903 /* Don't do it if it's already set - assume the application knows what it's 1904 doing. */ 1905 if (mdata->nsects == nsect 1906 && (mdata->nsects == 0 || mdata->sections != NULL)) 1907 return TRUE; 1908 1909 mdata->nsects = nsect; 1910 mdata->sections = bfd_alloc (abfd, 1911 mdata->nsects * sizeof (bfd_mach_o_section *)); 1912 if (mdata->sections == NULL) 1913 return FALSE; 1914 1915 /* We need to check that this can be done... */ 1916 if (nsect > 255) 1917 (*_bfd_error_handler) (_("mach-o: there are too many sections (%d)" 1918 " maximum is 255,\n"), nsect); 1919 1920 /* Create Mach-O sections. 1921 Section type, attribute and align should have been set when the 1922 section was created - either read in or specified. */ 1923 target_index = 0; 1924 for (sec = abfd->sections; sec; sec = sec->next) 1925 { 1926 unsigned bfd_align = bfd_get_section_alignment (abfd, sec); 1927 bfd_mach_o_section *msect = bfd_mach_o_get_mach_o_section (sec); 1928 1929 mdata->sections[target_index] = msect; 1930 1931 msect->addr = bfd_get_section_vma (abfd, sec); 1932 msect->size = bfd_get_section_size (sec); 1933 1934 /* Use the largest alignment set, in case it was bumped after the 1935 section was created. */ 1936 msect->align = msect->align > bfd_align ? msect->align : bfd_align; 1937 1938 msect->offset = 0; 1939 sec->target_index = ++target_index; 1940 } 1941 1942 return TRUE; 1943 } 1944 1945 bfd_boolean 1946 bfd_mach_o_write_contents (bfd *abfd) 1947 { 1948 unsigned int i; 1949 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 1950 1951 /* Make the commands, if not already present. */ 1952 if (mdata->header.ncmds == 0) 1953 if (!bfd_mach_o_build_commands (abfd)) 1954 return FALSE; 1955 1956 if (!bfd_mach_o_write_header (abfd, &mdata->header)) 1957 return FALSE; 1958 1959 for (i = 0; i < mdata->header.ncmds; i++) 1960 { 1961 struct mach_o_load_command_external raw; 1962 bfd_mach_o_load_command *cur = &mdata->commands[i]; 1963 unsigned long typeflag; 1964 1965 typeflag = cur->type | (cur->type_required ? BFD_MACH_O_LC_REQ_DYLD : 0); 1966 1967 bfd_h_put_32 (abfd, typeflag, raw.cmd); 1968 bfd_h_put_32 (abfd, cur->len, raw.cmdsize); 1969 1970 if (bfd_seek (abfd, cur->offset, SEEK_SET) != 0 1971 || bfd_bwrite (&raw, BFD_MACH_O_LC_SIZE, abfd) != 8) 1972 return FALSE; 1973 1974 switch (cur->type) 1975 { 1976 case BFD_MACH_O_LC_SEGMENT: 1977 if (bfd_mach_o_write_segment_32 (abfd, cur) != 0) 1978 return FALSE; 1979 break; 1980 case BFD_MACH_O_LC_SEGMENT_64: 1981 if (bfd_mach_o_write_segment_64 (abfd, cur) != 0) 1982 return FALSE; 1983 break; 1984 case BFD_MACH_O_LC_SYMTAB: 1985 if (!bfd_mach_o_write_symtab (abfd, cur)) 1986 return FALSE; 1987 break; 1988 case BFD_MACH_O_LC_DYSYMTAB: 1989 if (!bfd_mach_o_write_dysymtab (abfd, cur)) 1990 return FALSE; 1991 break; 1992 case BFD_MACH_O_LC_SYMSEG: 1993 break; 1994 case BFD_MACH_O_LC_THREAD: 1995 case BFD_MACH_O_LC_UNIXTHREAD: 1996 if (bfd_mach_o_write_thread (abfd, cur) != 0) 1997 return FALSE; 1998 break; 1999 case BFD_MACH_O_LC_LOADFVMLIB: 2000 case BFD_MACH_O_LC_IDFVMLIB: 2001 case BFD_MACH_O_LC_IDENT: 2002 case BFD_MACH_O_LC_FVMFILE: 2003 case BFD_MACH_O_LC_PREPAGE: 2004 case BFD_MACH_O_LC_LOAD_DYLIB: 2005 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB: 2006 case BFD_MACH_O_LC_ID_DYLIB: 2007 case BFD_MACH_O_LC_REEXPORT_DYLIB: 2008 case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB: 2009 case BFD_MACH_O_LC_LOAD_DYLINKER: 2010 case BFD_MACH_O_LC_ID_DYLINKER: 2011 case BFD_MACH_O_LC_PREBOUND_DYLIB: 2012 case BFD_MACH_O_LC_ROUTINES: 2013 case BFD_MACH_O_LC_SUB_FRAMEWORK: 2014 break; 2015 default: 2016 (*_bfd_error_handler) (_("unable to write unknown load command 0x%lx"), 2017 (unsigned long) cur->type); 2018 return FALSE; 2019 } 2020 } 2021 2022 return TRUE; 2023 } 2024 2025 static void 2026 bfd_mach_o_append_section_to_segment (bfd_mach_o_segment_command *seg, 2027 asection *sec) 2028 { 2029 bfd_mach_o_section *s = (bfd_mach_o_section *)sec->used_by_bfd; 2030 if (seg->sect_head == NULL) 2031 seg->sect_head = s; 2032 else 2033 seg->sect_tail->next = s; 2034 seg->sect_tail = s; 2035 } 2036 2037 /* Create section Mach-O flags from BFD flags. */ 2038 2039 static void 2040 bfd_mach_o_set_section_flags_from_bfd (bfd *abfd ATTRIBUTE_UNUSED, asection *sec) 2041 { 2042 flagword bfd_flags; 2043 bfd_mach_o_section *s = bfd_mach_o_get_mach_o_section (sec); 2044 2045 /* Create default flags. */ 2046 bfd_flags = bfd_get_section_flags (abfd, sec); 2047 if ((bfd_flags & SEC_CODE) == SEC_CODE) 2048 s->flags = BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS 2049 | BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS 2050 | BFD_MACH_O_S_REGULAR; 2051 else if ((bfd_flags & (SEC_ALLOC | SEC_LOAD)) == SEC_ALLOC) 2052 s->flags = BFD_MACH_O_S_ZEROFILL; 2053 else if (bfd_flags & SEC_DEBUGGING) 2054 s->flags = BFD_MACH_O_S_REGULAR | BFD_MACH_O_S_ATTR_DEBUG; 2055 else 2056 s->flags = BFD_MACH_O_S_REGULAR; 2057 } 2058 2059 /* Count the number of sections in the list for the segment named. 2060 2061 The special case of NULL or "" for the segment name is valid for 2062 an MH_OBJECT file and means 'all sections available'. 2063 2064 Requires that the sections table in mdata be filled in. 2065 2066 Returns the number of sections (0 is valid). 2067 Any number > 255 signals an invalid section count, although we will, 2068 perhaps, allow the file to be written (in line with Darwin tools up 2069 to XCode 4). 2070 2071 A section count of (unsigned long) -1 signals a definite error. */ 2072 2073 static unsigned long 2074 bfd_mach_o_count_sections_for_seg (const char *segment, 2075 bfd_mach_o_data_struct *mdata) 2076 { 2077 unsigned i,j; 2078 if (mdata == NULL || mdata->sections == NULL) 2079 return (unsigned long) -1; 2080 2081 /* The MH_OBJECT case, all sections are considered; Although nsects is 2082 is an unsigned long, the maximum valid section count is 255 and this 2083 will have been checked already by mangle_sections. */ 2084 if (segment == NULL || segment[0] == '\0') 2085 return mdata->nsects; 2086 2087 /* Count the number of sections we see in this segment. */ 2088 j = 0; 2089 for (i = 0; i < mdata->nsects; ++i) 2090 { 2091 bfd_mach_o_section *s = mdata->sections[i]; 2092 if (strncmp (segment, s->segname, BFD_MACH_O_SEGNAME_SIZE) == 0) 2093 j++; 2094 } 2095 return j; 2096 } 2097 2098 static bfd_boolean 2099 bfd_mach_o_build_seg_command (const char *segment, 2100 bfd_mach_o_data_struct *mdata, 2101 bfd_mach_o_segment_command *seg) 2102 { 2103 unsigned i; 2104 int is_mho = (segment == NULL || segment[0] == '\0'); 2105 2106 /* Fill segment command. */ 2107 if (is_mho) 2108 memset (seg->segname, 0, sizeof (seg->segname)); 2109 else 2110 strncpy (seg->segname, segment, sizeof (seg->segname)); 2111 2112 /* TODO: fix this up for non-MH_OBJECT cases. */ 2113 seg->vmaddr = 0; 2114 seg->vmsize = 0; 2115 2116 seg->fileoff = mdata->filelen; 2117 seg->filesize = 0; 2118 seg->maxprot = BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_WRITE 2119 | BFD_MACH_O_PROT_EXECUTE; 2120 seg->initprot = seg->maxprot; 2121 seg->flags = 0; 2122 seg->sect_head = NULL; 2123 seg->sect_tail = NULL; 2124 2125 /* Append sections to the segment. 2126 2127 This is a little tedious, we have to honor the need to account zerofill 2128 sections after all the rest. This forces us to do the calculation of 2129 total vmsize in three passes so that any alignment increments are 2130 properly accounted. */ 2131 2132 for (i = 0; i < mdata->nsects; ++i) 2133 { 2134 bfd_mach_o_section *s = mdata->sections[i]; 2135 asection *sec = s->bfdsection; 2136 2137 /* If we're not making an MH_OBJECT, check whether this section is from 2138 our segment, and skip if not. Otherwise, just add all sections. */ 2139 if (! is_mho 2140 && strncmp (segment, s->segname, BFD_MACH_O_SEGNAME_SIZE) != 0) 2141 continue; 2142 2143 /* Although we account for zerofill section sizes in vm order, they are 2144 placed in the file in source sequence. */ 2145 bfd_mach_o_append_section_to_segment (seg, sec); 2146 s->offset = 0; 2147 2148 /* Zerofill sections have zero file size & offset, 2149 and are not written. */ 2150 if ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK) == BFD_MACH_O_S_ZEROFILL 2151 || (s->flags & BFD_MACH_O_SECTION_TYPE_MASK) 2152 == BFD_MACH_O_S_GB_ZEROFILL) 2153 continue; 2154 2155 if (s->size > 0) 2156 { 2157 seg->vmsize = FILE_ALIGN (seg->vmsize, s->align); 2158 seg->vmsize += s->size; 2159 2160 seg->filesize = FILE_ALIGN (seg->filesize, s->align); 2161 seg->filesize += s->size; 2162 2163 mdata->filelen = FILE_ALIGN (mdata->filelen, s->align); 2164 s->offset = mdata->filelen; 2165 } 2166 2167 sec->filepos = s->offset; 2168 mdata->filelen += s->size; 2169 } 2170 2171 /* Now pass through again, for zerofill, only now we just update the vmsize. */ 2172 for (i = 0; i < mdata->nsects; ++i) 2173 { 2174 bfd_mach_o_section *s = mdata->sections[i]; 2175 2176 if ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK) != BFD_MACH_O_S_ZEROFILL) 2177 continue; 2178 2179 if (! is_mho 2180 && strncmp (segment, s->segname, BFD_MACH_O_SEGNAME_SIZE) != 0) 2181 continue; 2182 2183 if (s->size > 0) 2184 { 2185 seg->vmsize = FILE_ALIGN (seg->vmsize, s->align); 2186 seg->vmsize += s->size; 2187 } 2188 } 2189 2190 /* Now pass through again, for zerofill_GB. */ 2191 for (i = 0; i < mdata->nsects; ++i) 2192 { 2193 bfd_mach_o_section *s = mdata->sections[i]; 2194 2195 if ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK) != BFD_MACH_O_S_GB_ZEROFILL) 2196 continue; 2197 2198 if (! is_mho 2199 && strncmp (segment, s->segname, BFD_MACH_O_SEGNAME_SIZE) != 0) 2200 continue; 2201 2202 if (s->size > 0) 2203 { 2204 seg->vmsize = FILE_ALIGN (seg->vmsize, s->align); 2205 seg->vmsize += s->size; 2206 } 2207 } 2208 2209 /* Allocate space for the relocations. */ 2210 mdata->filelen = FILE_ALIGN(mdata->filelen, 2); 2211 2212 for (i = 0; i < mdata->nsects; ++i) 2213 { 2214 bfd_mach_o_section *ms = mdata->sections[i]; 2215 asection *sec = ms->bfdsection; 2216 2217 if ((ms->nreloc = sec->reloc_count) == 0) 2218 { 2219 ms->reloff = 0; 2220 continue; 2221 } 2222 sec->rel_filepos = mdata->filelen; 2223 ms->reloff = sec->rel_filepos; 2224 mdata->filelen += sec->reloc_count * BFD_MACH_O_RELENT_SIZE; 2225 } 2226 2227 return TRUE; 2228 } 2229 2230 /* Count the number of indirect symbols in the image. 2231 Requires that the sections are in their final order. */ 2232 2233 static unsigned int 2234 bfd_mach_o_count_indirect_symbols (bfd *abfd, bfd_mach_o_data_struct *mdata) 2235 { 2236 unsigned int i; 2237 unsigned int nisyms = 0; 2238 2239 for (i = 0; i < mdata->nsects; ++i) 2240 { 2241 bfd_mach_o_section *sec = mdata->sections[i]; 2242 2243 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK) 2244 { 2245 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS: 2246 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS: 2247 case BFD_MACH_O_S_SYMBOL_STUBS: 2248 nisyms += bfd_mach_o_section_get_nbr_indirect (abfd, sec); 2249 break; 2250 default: 2251 break; 2252 } 2253 } 2254 return nisyms; 2255 } 2256 2257 static bfd_boolean 2258 bfd_mach_o_build_dysymtab_command (bfd *abfd, 2259 bfd_mach_o_data_struct *mdata, 2260 bfd_mach_o_load_command *cmd) 2261 { 2262 bfd_mach_o_dysymtab_command *dsym = &cmd->command.dysymtab; 2263 2264 /* TODO: 2265 We are not going to try and fill these in yet and, moreover, we are 2266 going to bail if they are already set. */ 2267 if (dsym->nmodtab != 0 2268 || dsym->ntoc != 0 2269 || dsym->nextrefsyms != 0) 2270 { 2271 (*_bfd_error_handler) (_("sorry: modtab, toc and extrefsyms are not yet" 2272 " implemented for dysymtab commands.")); 2273 return FALSE; 2274 } 2275 2276 dsym->ilocalsym = 0; 2277 2278 if (bfd_get_symcount (abfd) > 0) 2279 { 2280 asymbol **symbols = bfd_get_outsymbols (abfd); 2281 unsigned long i; 2282 2283 /* Count the number of each kind of symbol. */ 2284 for (i = 0; i < bfd_get_symcount (abfd); ++i) 2285 { 2286 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i]; 2287 if (s->n_type & (BFD_MACH_O_N_EXT | BFD_MACH_O_N_PEXT)) 2288 break; 2289 } 2290 dsym->nlocalsym = i; 2291 dsym->iextdefsym = i; 2292 for (; i < bfd_get_symcount (abfd); ++i) 2293 { 2294 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i]; 2295 if ((s->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_UNDF) 2296 break; 2297 } 2298 dsym->nextdefsym = i - dsym->nlocalsym; 2299 dsym->iundefsym = dsym->nextdefsym + dsym->iextdefsym; 2300 dsym->nundefsym = bfd_get_symcount (abfd) 2301 - dsym->nlocalsym 2302 - dsym->nextdefsym; 2303 } 2304 else 2305 { 2306 dsym->nlocalsym = 0; 2307 dsym->iextdefsym = 0; 2308 dsym->nextdefsym = 0; 2309 dsym->iundefsym = 0; 2310 dsym->nundefsym = 0; 2311 } 2312 2313 dsym->nindirectsyms = bfd_mach_o_count_indirect_symbols (abfd, mdata); 2314 if (dsym->nindirectsyms > 0) 2315 { 2316 unsigned i; 2317 unsigned n; 2318 2319 mdata->filelen = FILE_ALIGN (mdata->filelen, 2); 2320 dsym->indirectsymoff = mdata->filelen; 2321 mdata->filelen += dsym->nindirectsyms * 4; 2322 2323 dsym->indirect_syms = bfd_zalloc (abfd, dsym->nindirectsyms * 4); 2324 if (dsym->indirect_syms == NULL) 2325 return FALSE; 2326 2327 n = 0; 2328 for (i = 0; i < mdata->nsects; ++i) 2329 { 2330 bfd_mach_o_section *sec = mdata->sections[i]; 2331 2332 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK) 2333 { 2334 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS: 2335 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS: 2336 case BFD_MACH_O_S_SYMBOL_STUBS: 2337 { 2338 unsigned j, num; 2339 bfd_mach_o_asymbol **isyms = sec->indirect_syms; 2340 2341 num = bfd_mach_o_section_get_nbr_indirect (abfd, sec); 2342 if (isyms == NULL || num == 0) 2343 break; 2344 /* Record the starting index in the reserved1 field. */ 2345 sec->reserved1 = n; 2346 for (j = 0; j < num; j++, n++) 2347 { 2348 if (isyms[j] == NULL) 2349 dsym->indirect_syms[n] = BFD_MACH_O_INDIRECT_SYM_LOCAL; 2350 else if (isyms[j]->symbol.section == bfd_abs_section_ptr 2351 && ! (isyms[j]->n_type & BFD_MACH_O_N_EXT)) 2352 dsym->indirect_syms[n] = BFD_MACH_O_INDIRECT_SYM_LOCAL 2353 | BFD_MACH_O_INDIRECT_SYM_ABS; 2354 else 2355 dsym->indirect_syms[n] = isyms[j]->symbol.udata.i; 2356 } 2357 } 2358 break; 2359 default: 2360 break; 2361 } 2362 } 2363 } 2364 2365 return TRUE; 2366 } 2367 2368 /* Build Mach-O load commands (currently assuming an MH_OBJECT file). 2369 TODO: Other file formats, rebuilding symtab/dysymtab commands for strip 2370 and copy functionality. */ 2371 2372 bfd_boolean 2373 bfd_mach_o_build_commands (bfd *abfd) 2374 { 2375 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 2376 unsigned wide = mach_o_wide_p (&mdata->header); 2377 int segcmd_idx = -1; 2378 int symtab_idx = -1; 2379 int dysymtab_idx = -1; 2380 unsigned long base_offset = 0; 2381 2382 /* Return now if commands are already present. */ 2383 if (mdata->header.ncmds) 2384 return FALSE; 2385 2386 /* Fill in the file type, if not already set. */ 2387 2388 if (mdata->header.filetype == 0) 2389 { 2390 if (abfd->flags & EXEC_P) 2391 mdata->header.filetype = BFD_MACH_O_MH_EXECUTE; 2392 else if (abfd->flags & DYNAMIC) 2393 mdata->header.filetype = BFD_MACH_O_MH_DYLIB; 2394 else 2395 mdata->header.filetype = BFD_MACH_O_MH_OBJECT; 2396 } 2397 2398 /* If hasn't already been done, flatten sections list, and sort 2399 if/when required. Must be done before the symbol table is adjusted, 2400 since that depends on properly numbered sections. */ 2401 if (mdata->nsects == 0 || mdata->sections == NULL) 2402 if (! bfd_mach_o_mangle_sections (abfd, mdata)) 2403 return FALSE; 2404 2405 /* Order the symbol table, fill-in/check mach-o specific fields and 2406 partition out any indirect symbols. */ 2407 if (!bfd_mach_o_mangle_symbols (abfd)) 2408 return FALSE; 2409 2410 /* Very simple command set (only really applicable to MH_OBJECTs): 2411 All the commands are optional - present only when there is suitable data. 2412 (i.e. it is valid to have an empty file) 2413 2414 a command (segment) to contain all the sections, 2415 command for the symbol table, 2416 a command for the dysymtab. 2417 2418 ??? maybe we should assert that this is an MH_OBJECT? */ 2419 2420 if (mdata->nsects > 0) 2421 { 2422 segcmd_idx = 0; 2423 mdata->header.ncmds = 1; 2424 } 2425 2426 if (bfd_get_symcount (abfd) > 0) 2427 { 2428 mdata->header.ncmds++; 2429 symtab_idx = segcmd_idx + 1; /* 0 if the seg command is absent. */ 2430 } 2431 2432 /* FIXME: 2433 This is a rather crude test for whether we should build a dysymtab. */ 2434 if (bfd_mach_o_should_emit_dysymtab () 2435 && bfd_get_symcount (abfd)) 2436 { 2437 mdata->header.ncmds++; 2438 /* If there should be a case where a dysymtab could be emitted without 2439 a symtab (seems improbable), this would need amending. */ 2440 dysymtab_idx = symtab_idx + 1; 2441 } 2442 2443 if (wide) 2444 base_offset = BFD_MACH_O_HEADER_64_SIZE; 2445 else 2446 base_offset = BFD_MACH_O_HEADER_SIZE; 2447 2448 /* Well, we must have a header, at least. */ 2449 mdata->filelen = base_offset; 2450 2451 /* A bit unusual, but no content is valid; 2452 as -n empty.s -o empty.o */ 2453 if (mdata->header.ncmds == 0) 2454 return TRUE; 2455 2456 mdata->commands = bfd_zalloc (abfd, mdata->header.ncmds 2457 * sizeof (bfd_mach_o_load_command)); 2458 if (mdata->commands == NULL) 2459 return FALSE; 2460 2461 if (segcmd_idx >= 0) 2462 { 2463 bfd_mach_o_load_command *cmd = &mdata->commands[segcmd_idx]; 2464 bfd_mach_o_segment_command *seg = &cmd->command.segment; 2465 2466 /* Count the segctions in the special blank segment used for MH_OBJECT. */ 2467 seg->nsects = bfd_mach_o_count_sections_for_seg (NULL, mdata); 2468 if (seg->nsects == (unsigned long) -1) 2469 return FALSE; 2470 2471 /* Init segment command. */ 2472 cmd->offset = base_offset; 2473 if (wide) 2474 { 2475 cmd->type = BFD_MACH_O_LC_SEGMENT_64; 2476 cmd->len = BFD_MACH_O_LC_SEGMENT_64_SIZE 2477 + BFD_MACH_O_SECTION_64_SIZE * seg->nsects; 2478 } 2479 else 2480 { 2481 cmd->type = BFD_MACH_O_LC_SEGMENT; 2482 cmd->len = BFD_MACH_O_LC_SEGMENT_SIZE 2483 + BFD_MACH_O_SECTION_SIZE * seg->nsects; 2484 } 2485 2486 cmd->type_required = FALSE; 2487 mdata->header.sizeofcmds = cmd->len; 2488 mdata->filelen += cmd->len; 2489 } 2490 2491 if (symtab_idx >= 0) 2492 { 2493 /* Init symtab command. */ 2494 bfd_mach_o_load_command *cmd = &mdata->commands[symtab_idx]; 2495 2496 cmd->type = BFD_MACH_O_LC_SYMTAB; 2497 cmd->offset = base_offset; 2498 if (segcmd_idx >= 0) 2499 cmd->offset += mdata->commands[segcmd_idx].len; 2500 2501 cmd->len = sizeof (struct mach_o_symtab_command_external) 2502 + BFD_MACH_O_LC_SIZE; 2503 cmd->type_required = FALSE; 2504 mdata->header.sizeofcmds += cmd->len; 2505 mdata->filelen += cmd->len; 2506 } 2507 2508 /* If required, setup symtab command, see comment above about the quality 2509 of this test. */ 2510 if (dysymtab_idx >= 0) 2511 { 2512 bfd_mach_o_load_command *cmd = &mdata->commands[dysymtab_idx]; 2513 2514 cmd->type = BFD_MACH_O_LC_DYSYMTAB; 2515 if (symtab_idx >= 0) 2516 cmd->offset = mdata->commands[symtab_idx].offset 2517 + mdata->commands[symtab_idx].len; 2518 else if (segcmd_idx >= 0) 2519 cmd->offset = mdata->commands[segcmd_idx].offset 2520 + mdata->commands[segcmd_idx].len; 2521 else 2522 cmd->offset = base_offset; 2523 2524 cmd->type_required = FALSE; 2525 cmd->len = sizeof (struct mach_o_dysymtab_command_external) 2526 + BFD_MACH_O_LC_SIZE; 2527 2528 mdata->header.sizeofcmds += cmd->len; 2529 mdata->filelen += cmd->len; 2530 } 2531 2532 /* So, now we have sized the commands and the filelen set to that. 2533 Now we can build the segment command and set the section file offsets. */ 2534 if (segcmd_idx >= 0 2535 && ! bfd_mach_o_build_seg_command 2536 (NULL, mdata, &mdata->commands[segcmd_idx].command.segment)) 2537 return FALSE; 2538 2539 /* If we're doing a dysymtab, cmd points to its load command. */ 2540 if (dysymtab_idx >= 0 2541 && ! bfd_mach_o_build_dysymtab_command (abfd, mdata, 2542 &mdata->commands[dysymtab_idx])) 2543 return FALSE; 2544 2545 /* The symtab command is filled in when the symtab is written. */ 2546 return TRUE; 2547 } 2548 2549 /* Set the contents of a section. */ 2550 2551 bfd_boolean 2552 bfd_mach_o_set_section_contents (bfd *abfd, 2553 asection *section, 2554 const void * location, 2555 file_ptr offset, 2556 bfd_size_type count) 2557 { 2558 file_ptr pos; 2559 2560 /* Trying to write the first section contents will trigger the creation of 2561 the load commands if they are not already present. */ 2562 if (! abfd->output_has_begun && ! bfd_mach_o_build_commands (abfd)) 2563 return FALSE; 2564 2565 if (count == 0) 2566 return TRUE; 2567 2568 pos = section->filepos + offset; 2569 if (bfd_seek (abfd, pos, SEEK_SET) != 0 2570 || bfd_bwrite (location, count, abfd) != count) 2571 return FALSE; 2572 2573 return TRUE; 2574 } 2575 2576 int 2577 bfd_mach_o_sizeof_headers (bfd *a ATTRIBUTE_UNUSED, 2578 struct bfd_link_info *info ATTRIBUTE_UNUSED) 2579 { 2580 return 0; 2581 } 2582 2583 /* Make an empty symbol. This is required only because 2584 bfd_make_section_anyway wants to create a symbol for the section. */ 2585 2586 asymbol * 2587 bfd_mach_o_make_empty_symbol (bfd *abfd) 2588 { 2589 asymbol *new_symbol; 2590 2591 new_symbol = bfd_zalloc (abfd, sizeof (bfd_mach_o_asymbol)); 2592 if (new_symbol == NULL) 2593 return new_symbol; 2594 new_symbol->the_bfd = abfd; 2595 new_symbol->udata.i = SYM_MACHO_FIELDS_UNSET; 2596 return new_symbol; 2597 } 2598 2599 static bfd_boolean 2600 bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header) 2601 { 2602 struct mach_o_header_external raw; 2603 unsigned int size; 2604 bfd_vma (*get32) (const void *) = NULL; 2605 2606 /* Just read the magic number. */ 2607 if (bfd_seek (abfd, 0, SEEK_SET) != 0 2608 || bfd_bread (raw.magic, sizeof (raw.magic), abfd) != 4) 2609 return FALSE; 2610 2611 if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC) 2612 { 2613 header->byteorder = BFD_ENDIAN_BIG; 2614 header->magic = BFD_MACH_O_MH_MAGIC; 2615 header->version = 1; 2616 get32 = bfd_getb32; 2617 } 2618 else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC) 2619 { 2620 header->byteorder = BFD_ENDIAN_LITTLE; 2621 header->magic = BFD_MACH_O_MH_MAGIC; 2622 header->version = 1; 2623 get32 = bfd_getl32; 2624 } 2625 else if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64) 2626 { 2627 header->byteorder = BFD_ENDIAN_BIG; 2628 header->magic = BFD_MACH_O_MH_MAGIC_64; 2629 header->version = 2; 2630 get32 = bfd_getb32; 2631 } 2632 else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64) 2633 { 2634 header->byteorder = BFD_ENDIAN_LITTLE; 2635 header->magic = BFD_MACH_O_MH_MAGIC_64; 2636 header->version = 2; 2637 get32 = bfd_getl32; 2638 } 2639 else 2640 { 2641 header->byteorder = BFD_ENDIAN_UNKNOWN; 2642 return FALSE; 2643 } 2644 2645 /* Once the size of the header is known, read the full header. */ 2646 size = mach_o_wide_p (header) ? 2647 BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE; 2648 2649 if (bfd_seek (abfd, 0, SEEK_SET) != 0 2650 || bfd_bread (&raw, size, abfd) != size) 2651 return FALSE; 2652 2653 header->cputype = (*get32) (raw.cputype); 2654 header->cpusubtype = (*get32) (raw.cpusubtype); 2655 header->filetype = (*get32) (raw.filetype); 2656 header->ncmds = (*get32) (raw.ncmds); 2657 header->sizeofcmds = (*get32) (raw.sizeofcmds); 2658 header->flags = (*get32) (raw.flags); 2659 2660 if (mach_o_wide_p (header)) 2661 header->reserved = (*get32) (raw.reserved); 2662 else 2663 header->reserved = 0; 2664 2665 return TRUE; 2666 } 2667 2668 bfd_boolean 2669 bfd_mach_o_new_section_hook (bfd *abfd, asection *sec) 2670 { 2671 bfd_mach_o_section *s; 2672 unsigned bfdalign = bfd_get_section_alignment (abfd, sec); 2673 2674 s = bfd_mach_o_get_mach_o_section (sec); 2675 if (s == NULL) 2676 { 2677 flagword bfd_flags; 2678 static const mach_o_section_name_xlat * xlat; 2679 2680 s = (bfd_mach_o_section *) bfd_zalloc (abfd, sizeof (*s)); 2681 if (s == NULL) 2682 return FALSE; 2683 sec->used_by_bfd = s; 2684 s->bfdsection = sec; 2685 2686 /* Create the Darwin seg/sect name pair from the bfd name. 2687 If this is a canonical name for which a specific paiting exists 2688 there will also be defined flags, type, attribute and alignment 2689 values. */ 2690 xlat = bfd_mach_o_convert_section_name_to_mach_o (abfd, sec, s); 2691 if (xlat != NULL) 2692 { 2693 s->flags = xlat->macho_sectype | xlat->macho_secattr; 2694 s->align = xlat->sectalign > bfdalign ? xlat->sectalign 2695 : bfdalign; 2696 bfd_set_section_alignment (abfd, sec, s->align); 2697 bfd_flags = bfd_get_section_flags (abfd, sec); 2698 if (bfd_flags == SEC_NO_FLAGS) 2699 bfd_set_section_flags (abfd, sec, xlat->bfd_flags); 2700 } 2701 else 2702 /* Create default flags. */ 2703 bfd_mach_o_set_section_flags_from_bfd (abfd, sec); 2704 } 2705 2706 return _bfd_generic_new_section_hook (abfd, sec); 2707 } 2708 2709 static void 2710 bfd_mach_o_init_section_from_mach_o (bfd *abfd, asection *sec, 2711 unsigned long prot) 2712 { 2713 flagword flags; 2714 bfd_mach_o_section *section; 2715 2716 flags = bfd_get_section_flags (abfd, sec); 2717 section = bfd_mach_o_get_mach_o_section (sec); 2718 2719 /* TODO: see if we should use the xlat system for doing this by 2720 preference and fall back to this for unknown sections. */ 2721 2722 if (flags == SEC_NO_FLAGS) 2723 { 2724 /* Try to guess flags. */ 2725 if (section->flags & BFD_MACH_O_S_ATTR_DEBUG) 2726 flags = SEC_DEBUGGING; 2727 else 2728 { 2729 flags = SEC_ALLOC; 2730 if ((section->flags & BFD_MACH_O_SECTION_TYPE_MASK) 2731 != BFD_MACH_O_S_ZEROFILL) 2732 { 2733 flags |= SEC_LOAD; 2734 if (prot & BFD_MACH_O_PROT_EXECUTE) 2735 flags |= SEC_CODE; 2736 if (prot & BFD_MACH_O_PROT_WRITE) 2737 flags |= SEC_DATA; 2738 else if (prot & BFD_MACH_O_PROT_READ) 2739 flags |= SEC_READONLY; 2740 } 2741 } 2742 } 2743 else 2744 { 2745 if ((flags & SEC_DEBUGGING) == 0) 2746 flags |= SEC_ALLOC; 2747 } 2748 2749 if (section->offset != 0) 2750 flags |= SEC_HAS_CONTENTS; 2751 if (section->nreloc != 0) 2752 flags |= SEC_RELOC; 2753 2754 bfd_set_section_flags (abfd, sec, flags); 2755 2756 sec->vma = section->addr; 2757 sec->lma = section->addr; 2758 sec->size = section->size; 2759 sec->filepos = section->offset; 2760 sec->alignment_power = section->align; 2761 sec->segment_mark = 0; 2762 sec->reloc_count = section->nreloc; 2763 sec->rel_filepos = section->reloff; 2764 } 2765 2766 static asection * 2767 bfd_mach_o_make_bfd_section (bfd *abfd, 2768 const unsigned char *segname, 2769 const unsigned char *sectname) 2770 { 2771 const char *sname; 2772 flagword flags; 2773 2774 bfd_mach_o_convert_section_name_to_bfd 2775 (abfd, (const char *)segname, (const char *)sectname, &sname, &flags); 2776 if (sname == NULL) 2777 return NULL; 2778 2779 return bfd_make_section_anyway_with_flags (abfd, sname, flags); 2780 } 2781 2782 static asection * 2783 bfd_mach_o_read_section_32 (bfd *abfd, 2784 unsigned int offset, 2785 unsigned long prot) 2786 { 2787 struct mach_o_section_32_external raw; 2788 asection *sec; 2789 bfd_mach_o_section *section; 2790 2791 if (bfd_seek (abfd, offset, SEEK_SET) != 0 2792 || (bfd_bread (&raw, BFD_MACH_O_SECTION_SIZE, abfd) 2793 != BFD_MACH_O_SECTION_SIZE)) 2794 return NULL; 2795 2796 sec = bfd_mach_o_make_bfd_section (abfd, raw.segname, raw.sectname); 2797 if (sec == NULL) 2798 return NULL; 2799 2800 section = bfd_mach_o_get_mach_o_section (sec); 2801 memcpy (section->segname, raw.segname, sizeof (raw.segname)); 2802 section->segname[BFD_MACH_O_SEGNAME_SIZE] = 0; 2803 memcpy (section->sectname, raw.sectname, sizeof (raw.sectname)); 2804 section->sectname[BFD_MACH_O_SECTNAME_SIZE] = 0; 2805 section->addr = bfd_h_get_32 (abfd, raw.addr); 2806 section->size = bfd_h_get_32 (abfd, raw.size); 2807 section->offset = bfd_h_get_32 (abfd, raw.offset); 2808 section->align = bfd_h_get_32 (abfd, raw.align); 2809 section->reloff = bfd_h_get_32 (abfd, raw.reloff); 2810 section->nreloc = bfd_h_get_32 (abfd, raw.nreloc); 2811 section->flags = bfd_h_get_32 (abfd, raw.flags); 2812 section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1); 2813 section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2); 2814 section->reserved3 = 0; 2815 2816 bfd_mach_o_init_section_from_mach_o (abfd, sec, prot); 2817 2818 return sec; 2819 } 2820 2821 static asection * 2822 bfd_mach_o_read_section_64 (bfd *abfd, 2823 unsigned int offset, 2824 unsigned long prot) 2825 { 2826 struct mach_o_section_64_external raw; 2827 asection *sec; 2828 bfd_mach_o_section *section; 2829 2830 if (bfd_seek (abfd, offset, SEEK_SET) != 0 2831 || (bfd_bread (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd) 2832 != BFD_MACH_O_SECTION_64_SIZE)) 2833 return NULL; 2834 2835 sec = bfd_mach_o_make_bfd_section (abfd, raw.segname, raw.sectname); 2836 if (sec == NULL) 2837 return NULL; 2838 2839 section = bfd_mach_o_get_mach_o_section (sec); 2840 memcpy (section->segname, raw.segname, sizeof (raw.segname)); 2841 section->segname[BFD_MACH_O_SEGNAME_SIZE] = 0; 2842 memcpy (section->sectname, raw.sectname, sizeof (raw.sectname)); 2843 section->sectname[BFD_MACH_O_SECTNAME_SIZE] = 0; 2844 section->addr = bfd_h_get_64 (abfd, raw.addr); 2845 section->size = bfd_h_get_64 (abfd, raw.size); 2846 section->offset = bfd_h_get_32 (abfd, raw.offset); 2847 section->align = bfd_h_get_32 (abfd, raw.align); 2848 section->reloff = bfd_h_get_32 (abfd, raw.reloff); 2849 section->nreloc = bfd_h_get_32 (abfd, raw.nreloc); 2850 section->flags = bfd_h_get_32 (abfd, raw.flags); 2851 section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1); 2852 section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2); 2853 section->reserved3 = bfd_h_get_32 (abfd, raw.reserved3); 2854 2855 bfd_mach_o_init_section_from_mach_o (abfd, sec, prot); 2856 2857 return sec; 2858 } 2859 2860 static asection * 2861 bfd_mach_o_read_section (bfd *abfd, 2862 unsigned int offset, 2863 unsigned long prot, 2864 unsigned int wide) 2865 { 2866 if (wide) 2867 return bfd_mach_o_read_section_64 (abfd, offset, prot); 2868 else 2869 return bfd_mach_o_read_section_32 (abfd, offset, prot); 2870 } 2871 2872 static bfd_boolean 2873 bfd_mach_o_read_symtab_symbol (bfd *abfd, 2874 bfd_mach_o_symtab_command *sym, 2875 bfd_mach_o_asymbol *s, 2876 unsigned long i) 2877 { 2878 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 2879 unsigned int wide = mach_o_wide_p (&mdata->header); 2880 unsigned int symwidth = 2881 wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE; 2882 unsigned int symoff = sym->symoff + (i * symwidth); 2883 struct mach_o_nlist_64_external raw; 2884 unsigned char type = -1; 2885 unsigned char section = -1; 2886 short desc = -1; 2887 symvalue value = -1; 2888 unsigned long stroff = -1; 2889 unsigned int symtype = -1; 2890 2891 BFD_ASSERT (sym->strtab != NULL); 2892 2893 if (bfd_seek (abfd, symoff, SEEK_SET) != 0 2894 || bfd_bread (&raw, symwidth, abfd) != symwidth) 2895 { 2896 (*_bfd_error_handler) 2897 (_("bfd_mach_o_read_symtab_symbol: unable to read %d bytes at %lu"), 2898 symwidth, (unsigned long) symoff); 2899 return FALSE; 2900 } 2901 2902 stroff = bfd_h_get_32 (abfd, raw.n_strx); 2903 type = bfd_h_get_8 (abfd, raw.n_type); 2904 symtype = type & BFD_MACH_O_N_TYPE; 2905 section = bfd_h_get_8 (abfd, raw.n_sect); 2906 desc = bfd_h_get_16 (abfd, raw.n_desc); 2907 if (wide) 2908 value = bfd_h_get_64 (abfd, raw.n_value); 2909 else 2910 value = bfd_h_get_32 (abfd, raw.n_value); 2911 2912 if (stroff >= sym->strsize) 2913 { 2914 (*_bfd_error_handler) 2915 (_("bfd_mach_o_read_symtab_symbol: name out of range (%lu >= %lu)"), 2916 (unsigned long) stroff, 2917 (unsigned long) sym->strsize); 2918 return FALSE; 2919 } 2920 2921 s->symbol.the_bfd = abfd; 2922 s->symbol.name = sym->strtab + stroff; 2923 s->symbol.value = value; 2924 s->symbol.flags = 0x0; 2925 s->symbol.udata.i = i; 2926 s->n_type = type; 2927 s->n_sect = section; 2928 s->n_desc = desc; 2929 2930 if (type & BFD_MACH_O_N_STAB) 2931 { 2932 s->symbol.flags |= BSF_DEBUGGING; 2933 s->symbol.section = bfd_und_section_ptr; 2934 switch (type) 2935 { 2936 case N_FUN: 2937 case N_STSYM: 2938 case N_LCSYM: 2939 case N_BNSYM: 2940 case N_SLINE: 2941 case N_ENSYM: 2942 case N_ECOMM: 2943 case N_ECOML: 2944 case N_GSYM: 2945 if ((section > 0) && (section <= mdata->nsects)) 2946 { 2947 s->symbol.section = mdata->sections[section - 1]->bfdsection; 2948 s->symbol.value = 2949 s->symbol.value - mdata->sections[section - 1]->addr; 2950 } 2951 break; 2952 } 2953 } 2954 else 2955 { 2956 if (type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT)) 2957 s->symbol.flags |= BSF_GLOBAL; 2958 else 2959 s->symbol.flags |= BSF_LOCAL; 2960 2961 switch (symtype) 2962 { 2963 case BFD_MACH_O_N_UNDF: 2964 if (type == (BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT) 2965 && s->symbol.value != 0) 2966 { 2967 /* A common symbol. */ 2968 s->symbol.section = bfd_com_section_ptr; 2969 s->symbol.flags = BSF_NO_FLAGS; 2970 } 2971 else 2972 { 2973 s->symbol.section = bfd_und_section_ptr; 2974 if (s->n_desc & BFD_MACH_O_N_WEAK_REF) 2975 s->symbol.flags |= BSF_WEAK; 2976 } 2977 break; 2978 case BFD_MACH_O_N_PBUD: 2979 s->symbol.section = bfd_und_section_ptr; 2980 break; 2981 case BFD_MACH_O_N_ABS: 2982 s->symbol.section = bfd_abs_section_ptr; 2983 break; 2984 case BFD_MACH_O_N_SECT: 2985 if ((section > 0) && (section <= mdata->nsects)) 2986 { 2987 s->symbol.section = mdata->sections[section - 1]->bfdsection; 2988 s->symbol.value = 2989 s->symbol.value - mdata->sections[section - 1]->addr; 2990 } 2991 else 2992 { 2993 /* Mach-O uses 0 to mean "no section"; not an error. */ 2994 if (section != 0) 2995 { 2996 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: " 2997 "symbol \"%s\" specified invalid section %d (max %lu): setting to undefined"), 2998 s->symbol.name, section, mdata->nsects); 2999 } 3000 s->symbol.section = bfd_und_section_ptr; 3001 } 3002 break; 3003 case BFD_MACH_O_N_INDR: 3004 /* FIXME: we don't follow the BFD convention as this indirect symbol 3005 won't be followed by the referenced one. This looks harmless 3006 unless we start using the linker. */ 3007 s->symbol.flags |= BSF_INDIRECT; 3008 s->symbol.section = bfd_ind_section_ptr; 3009 s->symbol.value = 0; 3010 break; 3011 default: 3012 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: " 3013 "symbol \"%s\" specified invalid type field 0x%x: setting to undefined"), 3014 s->symbol.name, symtype); 3015 s->symbol.section = bfd_und_section_ptr; 3016 break; 3017 } 3018 } 3019 3020 return TRUE; 3021 } 3022 3023 bfd_boolean 3024 bfd_mach_o_read_symtab_strtab (bfd *abfd) 3025 { 3026 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 3027 bfd_mach_o_symtab_command *sym = mdata->symtab; 3028 3029 /* Fail if there is no symtab. */ 3030 if (sym == NULL) 3031 return FALSE; 3032 3033 /* Success if already loaded. */ 3034 if (sym->strtab) 3035 return TRUE; 3036 3037 if (abfd->flags & BFD_IN_MEMORY) 3038 { 3039 struct bfd_in_memory *b; 3040 3041 b = (struct bfd_in_memory *) abfd->iostream; 3042 3043 if ((sym->stroff + sym->strsize) > b->size) 3044 { 3045 bfd_set_error (bfd_error_file_truncated); 3046 return FALSE; 3047 } 3048 sym->strtab = (char *) b->buffer + sym->stroff; 3049 } 3050 else 3051 { 3052 sym->strtab = bfd_alloc (abfd, sym->strsize); 3053 if (sym->strtab == NULL) 3054 return FALSE; 3055 3056 if (bfd_seek (abfd, sym->stroff, SEEK_SET) != 0 3057 || bfd_bread (sym->strtab, sym->strsize, abfd) != sym->strsize) 3058 { 3059 bfd_set_error (bfd_error_file_truncated); 3060 return FALSE; 3061 } 3062 } 3063 3064 return TRUE; 3065 } 3066 3067 bfd_boolean 3068 bfd_mach_o_read_symtab_symbols (bfd *abfd) 3069 { 3070 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 3071 bfd_mach_o_symtab_command *sym = mdata->symtab; 3072 unsigned long i; 3073 3074 if (sym == NULL || sym->symbols) 3075 { 3076 /* Return now if there are no symbols or if already loaded. */ 3077 return TRUE; 3078 } 3079 3080 sym->symbols = bfd_alloc (abfd, sym->nsyms * sizeof (bfd_mach_o_asymbol)); 3081 3082 if (sym->symbols == NULL) 3083 { 3084 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbols: unable to allocate memory for symbols")); 3085 return FALSE; 3086 } 3087 3088 if (!bfd_mach_o_read_symtab_strtab (abfd)) 3089 return FALSE; 3090 3091 for (i = 0; i < sym->nsyms; i++) 3092 { 3093 if (!bfd_mach_o_read_symtab_symbol (abfd, sym, &sym->symbols[i], i)) 3094 return FALSE; 3095 } 3096 3097 return TRUE; 3098 } 3099 3100 static const char * 3101 bfd_mach_o_i386_flavour_string (unsigned int flavour) 3102 { 3103 switch ((int) flavour) 3104 { 3105 case BFD_MACH_O_x86_THREAD_STATE32: return "x86_THREAD_STATE32"; 3106 case BFD_MACH_O_x86_FLOAT_STATE32: return "x86_FLOAT_STATE32"; 3107 case BFD_MACH_O_x86_EXCEPTION_STATE32: return "x86_EXCEPTION_STATE32"; 3108 case BFD_MACH_O_x86_THREAD_STATE64: return "x86_THREAD_STATE64"; 3109 case BFD_MACH_O_x86_FLOAT_STATE64: return "x86_FLOAT_STATE64"; 3110 case BFD_MACH_O_x86_EXCEPTION_STATE64: return "x86_EXCEPTION_STATE64"; 3111 case BFD_MACH_O_x86_THREAD_STATE: return "x86_THREAD_STATE"; 3112 case BFD_MACH_O_x86_FLOAT_STATE: return "x86_FLOAT_STATE"; 3113 case BFD_MACH_O_x86_EXCEPTION_STATE: return "x86_EXCEPTION_STATE"; 3114 case BFD_MACH_O_x86_DEBUG_STATE32: return "x86_DEBUG_STATE32"; 3115 case BFD_MACH_O_x86_DEBUG_STATE64: return "x86_DEBUG_STATE64"; 3116 case BFD_MACH_O_x86_DEBUG_STATE: return "x86_DEBUG_STATE"; 3117 case BFD_MACH_O_x86_THREAD_STATE_NONE: return "x86_THREAD_STATE_NONE"; 3118 default: return "UNKNOWN"; 3119 } 3120 } 3121 3122 static const char * 3123 bfd_mach_o_ppc_flavour_string (unsigned int flavour) 3124 { 3125 switch ((int) flavour) 3126 { 3127 case BFD_MACH_O_PPC_THREAD_STATE: return "PPC_THREAD_STATE"; 3128 case BFD_MACH_O_PPC_FLOAT_STATE: return "PPC_FLOAT_STATE"; 3129 case BFD_MACH_O_PPC_EXCEPTION_STATE: return "PPC_EXCEPTION_STATE"; 3130 case BFD_MACH_O_PPC_VECTOR_STATE: return "PPC_VECTOR_STATE"; 3131 case BFD_MACH_O_PPC_THREAD_STATE64: return "PPC_THREAD_STATE64"; 3132 case BFD_MACH_O_PPC_EXCEPTION_STATE64: return "PPC_EXCEPTION_STATE64"; 3133 default: return "UNKNOWN"; 3134 } 3135 } 3136 3137 static int 3138 bfd_mach_o_read_dylinker (bfd *abfd, bfd_mach_o_load_command *command) 3139 { 3140 bfd_mach_o_dylinker_command *cmd = &command->command.dylinker; 3141 struct mach_o_str_command_external raw; 3142 unsigned int nameoff; 3143 3144 BFD_ASSERT ((command->type == BFD_MACH_O_LC_ID_DYLINKER) 3145 || (command->type == BFD_MACH_O_LC_LOAD_DYLINKER)); 3146 3147 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 3148 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) 3149 return -1; 3150 3151 nameoff = bfd_h_get_32 (abfd, raw.str); 3152 3153 cmd->name_offset = command->offset + nameoff; 3154 cmd->name_len = command->len - nameoff; 3155 cmd->name_str = bfd_alloc (abfd, cmd->name_len); 3156 if (cmd->name_str == NULL) 3157 return -1; 3158 if (bfd_seek (abfd, cmd->name_offset, SEEK_SET) != 0 3159 || bfd_bread (cmd->name_str, cmd->name_len, abfd) != cmd->name_len) 3160 return -1; 3161 return 0; 3162 } 3163 3164 static int 3165 bfd_mach_o_read_dylib (bfd *abfd, bfd_mach_o_load_command *command) 3166 { 3167 bfd_mach_o_dylib_command *cmd = &command->command.dylib; 3168 struct mach_o_dylib_command_external raw; 3169 unsigned int nameoff; 3170 3171 switch (command->type) 3172 { 3173 case BFD_MACH_O_LC_LOAD_DYLIB: 3174 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB: 3175 case BFD_MACH_O_LC_ID_DYLIB: 3176 case BFD_MACH_O_LC_REEXPORT_DYLIB: 3177 case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB: 3178 break; 3179 default: 3180 BFD_FAIL (); 3181 return -1; 3182 } 3183 3184 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 3185 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) 3186 return -1; 3187 3188 nameoff = bfd_h_get_32 (abfd, raw.name); 3189 cmd->timestamp = bfd_h_get_32 (abfd, raw.timestamp); 3190 cmd->current_version = bfd_h_get_32 (abfd, raw.current_version); 3191 cmd->compatibility_version = bfd_h_get_32 (abfd, raw.compatibility_version); 3192 3193 cmd->name_offset = command->offset + nameoff; 3194 cmd->name_len = command->len - nameoff; 3195 cmd->name_str = bfd_alloc (abfd, cmd->name_len); 3196 if (cmd->name_str == NULL) 3197 return -1; 3198 if (bfd_seek (abfd, cmd->name_offset, SEEK_SET) != 0 3199 || bfd_bread (cmd->name_str, cmd->name_len, abfd) != cmd->name_len) 3200 return -1; 3201 return 0; 3202 } 3203 3204 static int 3205 bfd_mach_o_read_prebound_dylib (bfd *abfd ATTRIBUTE_UNUSED, 3206 bfd_mach_o_load_command *command ATTRIBUTE_UNUSED) 3207 { 3208 /* bfd_mach_o_prebound_dylib_command *cmd = &command->command.prebound_dylib; */ 3209 3210 BFD_ASSERT (command->type == BFD_MACH_O_LC_PREBOUND_DYLIB); 3211 return 0; 3212 } 3213 3214 static int 3215 bfd_mach_o_read_fvmlib (bfd *abfd, bfd_mach_o_load_command *command) 3216 { 3217 bfd_mach_o_fvmlib_command *fvm = &command->command.fvmlib; 3218 struct mach_o_fvmlib_command_external raw; 3219 unsigned int nameoff; 3220 3221 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 3222 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) 3223 return -1; 3224 3225 nameoff = bfd_h_get_32 (abfd, raw.name); 3226 fvm->minor_version = bfd_h_get_32 (abfd, raw.minor_version); 3227 fvm->header_addr = bfd_h_get_32 (abfd, raw.header_addr); 3228 3229 fvm->name_offset = command->offset + nameoff; 3230 fvm->name_len = command->len - nameoff; 3231 fvm->name_str = bfd_alloc (abfd, fvm->name_len); 3232 if (fvm->name_str == NULL) 3233 return -1; 3234 if (bfd_seek (abfd, fvm->name_offset, SEEK_SET) != 0 3235 || bfd_bread (fvm->name_str, fvm->name_len, abfd) != fvm->name_len) 3236 return -1; 3237 return 0; 3238 } 3239 3240 static int 3241 bfd_mach_o_read_thread (bfd *abfd, bfd_mach_o_load_command *command) 3242 { 3243 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 3244 bfd_mach_o_thread_command *cmd = &command->command.thread; 3245 unsigned int offset; 3246 unsigned int nflavours; 3247 unsigned int i; 3248 3249 BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD) 3250 || (command->type == BFD_MACH_O_LC_UNIXTHREAD)); 3251 3252 /* Count the number of threads. */ 3253 offset = 8; 3254 nflavours = 0; 3255 while (offset != command->len) 3256 { 3257 struct mach_o_thread_command_external raw; 3258 3259 if (offset >= command->len) 3260 return -1; 3261 3262 if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0 3263 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) 3264 return -1; 3265 3266 offset += sizeof (raw) + bfd_h_get_32 (abfd, raw.count) * 4; 3267 nflavours++; 3268 } 3269 3270 /* Allocate threads. */ 3271 cmd->flavours = bfd_alloc 3272 (abfd, nflavours * sizeof (bfd_mach_o_thread_flavour)); 3273 if (cmd->flavours == NULL) 3274 return -1; 3275 cmd->nflavours = nflavours; 3276 3277 offset = 8; 3278 nflavours = 0; 3279 while (offset != command->len) 3280 { 3281 struct mach_o_thread_command_external raw; 3282 3283 if (offset >= command->len) 3284 return -1; 3285 3286 if (nflavours >= cmd->nflavours) 3287 return -1; 3288 3289 if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0 3290 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) 3291 return -1; 3292 3293 cmd->flavours[nflavours].flavour = bfd_h_get_32 (abfd, raw.flavour); 3294 cmd->flavours[nflavours].offset = command->offset + offset + sizeof (raw); 3295 cmd->flavours[nflavours].size = bfd_h_get_32 (abfd, raw.count) * 4; 3296 offset += cmd->flavours[nflavours].size + sizeof (raw); 3297 nflavours++; 3298 } 3299 3300 for (i = 0; i < nflavours; i++) 3301 { 3302 asection *bfdsec; 3303 unsigned int snamelen; 3304 char *sname; 3305 const char *flavourstr; 3306 const char *prefix = "LC_THREAD"; 3307 unsigned int j = 0; 3308 3309 switch (mdata->header.cputype) 3310 { 3311 case BFD_MACH_O_CPU_TYPE_POWERPC: 3312 case BFD_MACH_O_CPU_TYPE_POWERPC_64: 3313 flavourstr = bfd_mach_o_ppc_flavour_string (cmd->flavours[i].flavour); 3314 break; 3315 case BFD_MACH_O_CPU_TYPE_I386: 3316 case BFD_MACH_O_CPU_TYPE_X86_64: 3317 flavourstr = bfd_mach_o_i386_flavour_string (cmd->flavours[i].flavour); 3318 break; 3319 default: 3320 flavourstr = "UNKNOWN_ARCHITECTURE"; 3321 break; 3322 } 3323 3324 snamelen = strlen (prefix) + 1 + 20 + 1 + strlen (flavourstr) + 1; 3325 sname = bfd_alloc (abfd, snamelen); 3326 if (sname == NULL) 3327 return -1; 3328 3329 for (;;) 3330 { 3331 sprintf (sname, "%s.%s.%u", prefix, flavourstr, j); 3332 if (bfd_get_section_by_name (abfd, sname) == NULL) 3333 break; 3334 j++; 3335 } 3336 3337 bfdsec = bfd_make_section_with_flags (abfd, sname, SEC_HAS_CONTENTS); 3338 3339 bfdsec->vma = 0; 3340 bfdsec->lma = 0; 3341 bfdsec->size = cmd->flavours[i].size; 3342 bfdsec->filepos = cmd->flavours[i].offset; 3343 bfdsec->alignment_power = 0x0; 3344 3345 cmd->section = bfdsec; 3346 } 3347 3348 return 0; 3349 } 3350 3351 static int 3352 bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command) 3353 { 3354 bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab; 3355 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 3356 3357 BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB); 3358 3359 { 3360 struct mach_o_dysymtab_command_external raw; 3361 3362 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 3363 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) 3364 return -1; 3365 3366 cmd->ilocalsym = bfd_h_get_32 (abfd, raw.ilocalsym); 3367 cmd->nlocalsym = bfd_h_get_32 (abfd, raw.nlocalsym); 3368 cmd->iextdefsym = bfd_h_get_32 (abfd, raw.iextdefsym); 3369 cmd->nextdefsym = bfd_h_get_32 (abfd, raw.nextdefsym); 3370 cmd->iundefsym = bfd_h_get_32 (abfd, raw.iundefsym); 3371 cmd->nundefsym = bfd_h_get_32 (abfd, raw.nundefsym); 3372 cmd->tocoff = bfd_h_get_32 (abfd, raw.tocoff); 3373 cmd->ntoc = bfd_h_get_32 (abfd, raw.ntoc); 3374 cmd->modtaboff = bfd_h_get_32 (abfd, raw.modtaboff); 3375 cmd->nmodtab = bfd_h_get_32 (abfd, raw.nmodtab); 3376 cmd->extrefsymoff = bfd_h_get_32 (abfd, raw.extrefsymoff); 3377 cmd->nextrefsyms = bfd_h_get_32 (abfd, raw.nextrefsyms); 3378 cmd->indirectsymoff = bfd_h_get_32 (abfd, raw.indirectsymoff); 3379 cmd->nindirectsyms = bfd_h_get_32 (abfd, raw.nindirectsyms); 3380 cmd->extreloff = bfd_h_get_32 (abfd, raw.extreloff); 3381 cmd->nextrel = bfd_h_get_32 (abfd, raw.nextrel); 3382 cmd->locreloff = bfd_h_get_32 (abfd, raw.locreloff); 3383 cmd->nlocrel = bfd_h_get_32 (abfd, raw.nlocrel); 3384 } 3385 3386 if (cmd->nmodtab != 0) 3387 { 3388 unsigned int i; 3389 int wide = bfd_mach_o_wide_p (abfd); 3390 unsigned int module_len = wide ? 56 : 52; 3391 3392 cmd->dylib_module = 3393 bfd_alloc (abfd, cmd->nmodtab * sizeof (bfd_mach_o_dylib_module)); 3394 if (cmd->dylib_module == NULL) 3395 return -1; 3396 3397 if (bfd_seek (abfd, cmd->modtaboff, SEEK_SET) != 0) 3398 return -1; 3399 3400 for (i = 0; i < cmd->nmodtab; i++) 3401 { 3402 bfd_mach_o_dylib_module *module = &cmd->dylib_module[i]; 3403 unsigned long v; 3404 unsigned char buf[56]; 3405 3406 if (bfd_bread ((void *) buf, module_len, abfd) != module_len) 3407 return -1; 3408 3409 module->module_name_idx = bfd_h_get_32 (abfd, buf + 0); 3410 module->iextdefsym = bfd_h_get_32 (abfd, buf + 4); 3411 module->nextdefsym = bfd_h_get_32 (abfd, buf + 8); 3412 module->irefsym = bfd_h_get_32 (abfd, buf + 12); 3413 module->nrefsym = bfd_h_get_32 (abfd, buf + 16); 3414 module->ilocalsym = bfd_h_get_32 (abfd, buf + 20); 3415 module->nlocalsym = bfd_h_get_32 (abfd, buf + 24); 3416 module->iextrel = bfd_h_get_32 (abfd, buf + 28); 3417 module->nextrel = bfd_h_get_32 (abfd, buf + 32); 3418 v = bfd_h_get_32 (abfd, buf +36); 3419 module->iinit = v & 0xffff; 3420 module->iterm = (v >> 16) & 0xffff; 3421 v = bfd_h_get_32 (abfd, buf + 40); 3422 module->ninit = v & 0xffff; 3423 module->nterm = (v >> 16) & 0xffff; 3424 if (wide) 3425 { 3426 module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 44); 3427 module->objc_module_info_addr = bfd_h_get_64 (abfd, buf + 48); 3428 } 3429 else 3430 { 3431 module->objc_module_info_addr = bfd_h_get_32 (abfd, buf + 44); 3432 module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 48); 3433 } 3434 } 3435 } 3436 3437 if (cmd->ntoc != 0) 3438 { 3439 unsigned int i; 3440 3441 cmd->dylib_toc = bfd_alloc 3442 (abfd, cmd->ntoc * sizeof (bfd_mach_o_dylib_table_of_content)); 3443 if (cmd->dylib_toc == NULL) 3444 return -1; 3445 3446 if (bfd_seek (abfd, cmd->tocoff, SEEK_SET) != 0) 3447 return -1; 3448 3449 for (i = 0; i < cmd->ntoc; i++) 3450 { 3451 struct mach_o_dylib_table_of_contents_external raw; 3452 bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i]; 3453 3454 if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) 3455 return -1; 3456 3457 toc->symbol_index = bfd_h_get_32 (abfd, raw.symbol_index); 3458 toc->module_index = bfd_h_get_32 (abfd, raw.module_index); 3459 } 3460 } 3461 3462 if (cmd->nindirectsyms != 0) 3463 { 3464 unsigned int i; 3465 3466 cmd->indirect_syms = bfd_alloc 3467 (abfd, cmd->nindirectsyms * sizeof (unsigned int)); 3468 if (cmd->indirect_syms == NULL) 3469 return -1; 3470 3471 if (bfd_seek (abfd, cmd->indirectsymoff, SEEK_SET) != 0) 3472 return -1; 3473 3474 for (i = 0; i < cmd->nindirectsyms; i++) 3475 { 3476 unsigned char raw[4]; 3477 unsigned int *is = &cmd->indirect_syms[i]; 3478 3479 if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw)) 3480 return -1; 3481 3482 *is = bfd_h_get_32 (abfd, raw); 3483 } 3484 } 3485 3486 if (cmd->nextrefsyms != 0) 3487 { 3488 unsigned long v; 3489 unsigned int i; 3490 3491 cmd->ext_refs = bfd_alloc 3492 (abfd, cmd->nextrefsyms * sizeof (bfd_mach_o_dylib_reference)); 3493 if (cmd->ext_refs == NULL) 3494 return -1; 3495 3496 if (bfd_seek (abfd, cmd->extrefsymoff, SEEK_SET) != 0) 3497 return -1; 3498 3499 for (i = 0; i < cmd->nextrefsyms; i++) 3500 { 3501 unsigned char raw[4]; 3502 bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i]; 3503 3504 if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw)) 3505 return -1; 3506 3507 /* Fields isym and flags are written as bit-fields, thus we need 3508 a specific processing for endianness. */ 3509 v = bfd_h_get_32 (abfd, raw); 3510 if (bfd_big_endian (abfd)) 3511 { 3512 ref->isym = (v >> 8) & 0xffffff; 3513 ref->flags = v & 0xff; 3514 } 3515 else 3516 { 3517 ref->isym = v & 0xffffff; 3518 ref->flags = (v >> 24) & 0xff; 3519 } 3520 } 3521 } 3522 3523 if (mdata->dysymtab) 3524 return -1; 3525 mdata->dysymtab = cmd; 3526 3527 return 0; 3528 } 3529 3530 static int 3531 bfd_mach_o_read_symtab (bfd *abfd, bfd_mach_o_load_command *command) 3532 { 3533 bfd_mach_o_symtab_command *symtab = &command->command.symtab; 3534 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 3535 struct mach_o_symtab_command_external raw; 3536 3537 BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB); 3538 3539 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 3540 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) 3541 return -1; 3542 3543 symtab->symoff = bfd_h_get_32 (abfd, raw.symoff); 3544 symtab->nsyms = bfd_h_get_32 (abfd, raw.nsyms); 3545 symtab->stroff = bfd_h_get_32 (abfd, raw.stroff); 3546 symtab->strsize = bfd_h_get_32 (abfd, raw.strsize); 3547 symtab->symbols = NULL; 3548 symtab->strtab = NULL; 3549 3550 if (symtab->nsyms != 0) 3551 abfd->flags |= HAS_SYMS; 3552 3553 if (mdata->symtab) 3554 return -1; 3555 mdata->symtab = symtab; 3556 return 0; 3557 } 3558 3559 static int 3560 bfd_mach_o_read_uuid (bfd *abfd, bfd_mach_o_load_command *command) 3561 { 3562 bfd_mach_o_uuid_command *cmd = &command->command.uuid; 3563 3564 BFD_ASSERT (command->type == BFD_MACH_O_LC_UUID); 3565 3566 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 3567 || bfd_bread (cmd->uuid, 16, abfd) != 16) 3568 return -1; 3569 3570 return 0; 3571 } 3572 3573 static int 3574 bfd_mach_o_read_linkedit (bfd *abfd, bfd_mach_o_load_command *command) 3575 { 3576 bfd_mach_o_linkedit_command *cmd = &command->command.linkedit; 3577 struct mach_o_linkedit_data_command_external raw; 3578 3579 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 3580 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) 3581 return -1; 3582 3583 cmd->dataoff = bfd_get_32 (abfd, raw.dataoff); 3584 cmd->datasize = bfd_get_32 (abfd, raw.datasize); 3585 return 0; 3586 } 3587 3588 static int 3589 bfd_mach_o_read_str (bfd *abfd, bfd_mach_o_load_command *command) 3590 { 3591 bfd_mach_o_str_command *cmd = &command->command.str; 3592 struct mach_o_str_command_external raw; 3593 unsigned long off; 3594 3595 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 3596 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) 3597 return -1; 3598 3599 off = bfd_get_32 (abfd, raw.str); 3600 cmd->stroff = command->offset + off; 3601 cmd->str_len = command->len - off; 3602 cmd->str = bfd_alloc (abfd, cmd->str_len); 3603 if (cmd->str == NULL) 3604 return -1; 3605 if (bfd_seek (abfd, cmd->stroff, SEEK_SET) != 0 3606 || bfd_bread ((void *) cmd->str, cmd->str_len, abfd) != cmd->str_len) 3607 return -1; 3608 return 0; 3609 } 3610 3611 static int 3612 bfd_mach_o_read_dyld_info (bfd *abfd, bfd_mach_o_load_command *command) 3613 { 3614 bfd_mach_o_dyld_info_command *cmd = &command->command.dyld_info; 3615 struct mach_o_dyld_info_command_external raw; 3616 3617 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 3618 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) 3619 return -1; 3620 3621 cmd->rebase_off = bfd_get_32 (abfd, raw.rebase_off); 3622 cmd->rebase_size = bfd_get_32 (abfd, raw.rebase_size); 3623 cmd->bind_off = bfd_get_32 (abfd, raw.bind_off); 3624 cmd->bind_size = bfd_get_32 (abfd, raw.bind_size); 3625 cmd->weak_bind_off = bfd_get_32 (abfd, raw.weak_bind_off); 3626 cmd->weak_bind_size = bfd_get_32 (abfd, raw.weak_bind_size); 3627 cmd->lazy_bind_off = bfd_get_32 (abfd, raw.lazy_bind_off); 3628 cmd->lazy_bind_size = bfd_get_32 (abfd, raw.lazy_bind_size); 3629 cmd->export_off = bfd_get_32 (abfd, raw.export_off); 3630 cmd->export_size = bfd_get_32 (abfd, raw.export_size); 3631 return 0; 3632 } 3633 3634 static bfd_boolean 3635 bfd_mach_o_read_version_min (bfd *abfd, bfd_mach_o_load_command *command) 3636 { 3637 bfd_mach_o_version_min_command *cmd = &command->command.version_min; 3638 struct mach_o_version_min_command_external raw; 3639 unsigned int ver; 3640 3641 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 3642 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) 3643 return FALSE; 3644 3645 ver = bfd_get_32 (abfd, raw.version); 3646 cmd->rel = ver >> 16; 3647 cmd->maj = ver >> 8; 3648 cmd->min = ver; 3649 cmd->reserved = bfd_get_32 (abfd, raw.reserved); 3650 return TRUE; 3651 } 3652 3653 static bfd_boolean 3654 bfd_mach_o_read_encryption_info (bfd *abfd, bfd_mach_o_load_command *command) 3655 { 3656 bfd_mach_o_encryption_info_command *cmd = &command->command.encryption_info; 3657 struct mach_o_encryption_info_command_external raw; 3658 3659 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 3660 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) 3661 return FALSE; 3662 3663 cmd->cryptoff = bfd_get_32 (abfd, raw.cryptoff); 3664 cmd->cryptsize = bfd_get_32 (abfd, raw.cryptsize); 3665 cmd->cryptid = bfd_get_32 (abfd, raw.cryptid); 3666 return TRUE; 3667 } 3668 3669 static bfd_boolean 3670 bfd_mach_o_read_main (bfd *abfd, bfd_mach_o_load_command *command) 3671 { 3672 bfd_mach_o_main_command *cmd = &command->command.main; 3673 struct mach_o_entry_point_command_external raw; 3674 3675 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 3676 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) 3677 return FALSE; 3678 3679 cmd->entryoff = bfd_get_64 (abfd, raw.entryoff); 3680 cmd->stacksize = bfd_get_64 (abfd, raw.stacksize); 3681 return TRUE; 3682 } 3683 3684 static bfd_boolean 3685 bfd_mach_o_read_source_version (bfd *abfd, bfd_mach_o_load_command *command) 3686 { 3687 bfd_mach_o_source_version_command *cmd = &command->command.source_version; 3688 struct mach_o_source_version_command_external raw; 3689 bfd_uint64_t ver; 3690 3691 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 3692 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) 3693 return FALSE; 3694 3695 ver = bfd_get_64 (abfd, raw.version); 3696 /* Note: we use a serie of shift to avoid shift > 32 (for which gcc 3697 generates warnings) in case of the host doesn't support 64 bit 3698 integers. */ 3699 cmd->e = ver & 0x3ff; 3700 ver >>= 10; 3701 cmd->d = ver & 0x3ff; 3702 ver >>= 10; 3703 cmd->c = ver & 0x3ff; 3704 ver >>= 10; 3705 cmd->b = ver & 0x3ff; 3706 ver >>= 10; 3707 cmd->a = ver & 0xffffff; 3708 return TRUE; 3709 } 3710 3711 static int 3712 bfd_mach_o_read_segment (bfd *abfd, 3713 bfd_mach_o_load_command *command, 3714 unsigned int wide) 3715 { 3716 bfd_mach_o_segment_command *seg = &command->command.segment; 3717 unsigned long i; 3718 3719 if (wide) 3720 { 3721 struct mach_o_segment_command_64_external raw; 3722 3723 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64); 3724 3725 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 3726 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) 3727 return -1; 3728 3729 memcpy (seg->segname, raw.segname, 16); 3730 seg->segname[16] = '\0'; 3731 3732 seg->vmaddr = bfd_h_get_64 (abfd, raw.vmaddr); 3733 seg->vmsize = bfd_h_get_64 (abfd, raw.vmsize); 3734 seg->fileoff = bfd_h_get_64 (abfd, raw.fileoff); 3735 seg->filesize = bfd_h_get_64 (abfd, raw.filesize); 3736 seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot); 3737 seg->initprot = bfd_h_get_32 (abfd, raw.initprot); 3738 seg->nsects = bfd_h_get_32 (abfd, raw.nsects); 3739 seg->flags = bfd_h_get_32 (abfd, raw.flags); 3740 } 3741 else 3742 { 3743 struct mach_o_segment_command_32_external raw; 3744 3745 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT); 3746 3747 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 3748 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) 3749 return -1; 3750 3751 memcpy (seg->segname, raw.segname, 16); 3752 seg->segname[16] = '\0'; 3753 3754 seg->vmaddr = bfd_h_get_32 (abfd, raw.vmaddr); 3755 seg->vmsize = bfd_h_get_32 (abfd, raw.vmsize); 3756 seg->fileoff = bfd_h_get_32 (abfd, raw.fileoff); 3757 seg->filesize = bfd_h_get_32 (abfd, raw.filesize); 3758 seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot); 3759 seg->initprot = bfd_h_get_32 (abfd, raw.initprot); 3760 seg->nsects = bfd_h_get_32 (abfd, raw.nsects); 3761 seg->flags = bfd_h_get_32 (abfd, raw.flags); 3762 } 3763 seg->sect_head = NULL; 3764 seg->sect_tail = NULL; 3765 3766 for (i = 0; i < seg->nsects; i++) 3767 { 3768 bfd_vma segoff; 3769 asection *sec; 3770 3771 if (wide) 3772 segoff = command->offset + BFD_MACH_O_LC_SEGMENT_64_SIZE 3773 + (i * BFD_MACH_O_SECTION_64_SIZE); 3774 else 3775 segoff = command->offset + BFD_MACH_O_LC_SEGMENT_SIZE 3776 + (i * BFD_MACH_O_SECTION_SIZE); 3777 3778 sec = bfd_mach_o_read_section (abfd, segoff, seg->initprot, wide); 3779 if (sec == NULL) 3780 return -1; 3781 3782 bfd_mach_o_append_section_to_segment (seg, sec); 3783 } 3784 3785 return 0; 3786 } 3787 3788 static int 3789 bfd_mach_o_read_segment_32 (bfd *abfd, bfd_mach_o_load_command *command) 3790 { 3791 return bfd_mach_o_read_segment (abfd, command, 0); 3792 } 3793 3794 static int 3795 bfd_mach_o_read_segment_64 (bfd *abfd, bfd_mach_o_load_command *command) 3796 { 3797 return bfd_mach_o_read_segment (abfd, command, 1); 3798 } 3799 3800 static int 3801 bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command) 3802 { 3803 struct mach_o_load_command_external raw; 3804 unsigned int cmd; 3805 3806 /* Read command type and length. */ 3807 if (bfd_seek (abfd, command->offset, SEEK_SET) != 0 3808 || bfd_bread (&raw, BFD_MACH_O_LC_SIZE, abfd) != BFD_MACH_O_LC_SIZE) 3809 return -1; 3810 3811 cmd = bfd_h_get_32 (abfd, raw.cmd); 3812 command->type = cmd & ~BFD_MACH_O_LC_REQ_DYLD; 3813 command->type_required = cmd & BFD_MACH_O_LC_REQ_DYLD ? TRUE : FALSE; 3814 command->len = bfd_h_get_32 (abfd, raw.cmdsize); 3815 3816 switch (command->type) 3817 { 3818 case BFD_MACH_O_LC_SEGMENT: 3819 if (bfd_mach_o_read_segment_32 (abfd, command) != 0) 3820 return -1; 3821 break; 3822 case BFD_MACH_O_LC_SEGMENT_64: 3823 if (bfd_mach_o_read_segment_64 (abfd, command) != 0) 3824 return -1; 3825 break; 3826 case BFD_MACH_O_LC_SYMTAB: 3827 if (bfd_mach_o_read_symtab (abfd, command) != 0) 3828 return -1; 3829 break; 3830 case BFD_MACH_O_LC_SYMSEG: 3831 break; 3832 case BFD_MACH_O_LC_THREAD: 3833 case BFD_MACH_O_LC_UNIXTHREAD: 3834 if (bfd_mach_o_read_thread (abfd, command) != 0) 3835 return -1; 3836 break; 3837 case BFD_MACH_O_LC_LOAD_DYLINKER: 3838 case BFD_MACH_O_LC_ID_DYLINKER: 3839 if (bfd_mach_o_read_dylinker (abfd, command) != 0) 3840 return -1; 3841 break; 3842 case BFD_MACH_O_LC_LOAD_DYLIB: 3843 case BFD_MACH_O_LC_ID_DYLIB: 3844 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB: 3845 case BFD_MACH_O_LC_REEXPORT_DYLIB: 3846 case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB: 3847 if (bfd_mach_o_read_dylib (abfd, command) != 0) 3848 return -1; 3849 break; 3850 case BFD_MACH_O_LC_PREBOUND_DYLIB: 3851 if (bfd_mach_o_read_prebound_dylib (abfd, command) != 0) 3852 return -1; 3853 break; 3854 case BFD_MACH_O_LC_LOADFVMLIB: 3855 case BFD_MACH_O_LC_IDFVMLIB: 3856 if (bfd_mach_o_read_fvmlib (abfd, command) != 0) 3857 return -1; 3858 break; 3859 case BFD_MACH_O_LC_IDENT: 3860 case BFD_MACH_O_LC_FVMFILE: 3861 case BFD_MACH_O_LC_PREPAGE: 3862 case BFD_MACH_O_LC_ROUTINES: 3863 case BFD_MACH_O_LC_ROUTINES_64: 3864 break; 3865 case BFD_MACH_O_LC_SUB_FRAMEWORK: 3866 case BFD_MACH_O_LC_SUB_UMBRELLA: 3867 case BFD_MACH_O_LC_SUB_LIBRARY: 3868 case BFD_MACH_O_LC_SUB_CLIENT: 3869 case BFD_MACH_O_LC_RPATH: 3870 if (bfd_mach_o_read_str (abfd, command) != 0) 3871 return -1; 3872 break; 3873 case BFD_MACH_O_LC_DYSYMTAB: 3874 if (bfd_mach_o_read_dysymtab (abfd, command) != 0) 3875 return -1; 3876 break; 3877 case BFD_MACH_O_LC_TWOLEVEL_HINTS: 3878 case BFD_MACH_O_LC_PREBIND_CKSUM: 3879 break; 3880 case BFD_MACH_O_LC_UUID: 3881 if (bfd_mach_o_read_uuid (abfd, command) != 0) 3882 return -1; 3883 break; 3884 case BFD_MACH_O_LC_CODE_SIGNATURE: 3885 case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO: 3886 case BFD_MACH_O_LC_FUNCTION_STARTS: 3887 case BFD_MACH_O_LC_DATA_IN_CODE: 3888 case BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS: 3889 if (bfd_mach_o_read_linkedit (abfd, command) != 0) 3890 return -1; 3891 break; 3892 case BFD_MACH_O_LC_ENCRYPTION_INFO: 3893 if (!bfd_mach_o_read_encryption_info (abfd, command)) 3894 return -1; 3895 break; 3896 case BFD_MACH_O_LC_DYLD_INFO: 3897 if (bfd_mach_o_read_dyld_info (abfd, command) != 0) 3898 return -1; 3899 break; 3900 case BFD_MACH_O_LC_VERSION_MIN_MACOSX: 3901 case BFD_MACH_O_LC_VERSION_MIN_IPHONEOS: 3902 if (!bfd_mach_o_read_version_min (abfd, command)) 3903 return -1; 3904 break; 3905 case BFD_MACH_O_LC_MAIN: 3906 if (!bfd_mach_o_read_main (abfd, command)) 3907 return -1; 3908 break; 3909 case BFD_MACH_O_LC_SOURCE_VERSION: 3910 if (!bfd_mach_o_read_source_version (abfd, command)) 3911 return -1; 3912 break; 3913 default: 3914 (*_bfd_error_handler)(_("%B: unknown load command 0x%lx"), 3915 abfd, (unsigned long) command->type); 3916 break; 3917 } 3918 3919 return 0; 3920 } 3921 3922 static void 3923 bfd_mach_o_flatten_sections (bfd *abfd) 3924 { 3925 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 3926 long csect = 0; 3927 unsigned long i; 3928 3929 /* Count total number of sections. */ 3930 mdata->nsects = 0; 3931 3932 for (i = 0; i < mdata->header.ncmds; i++) 3933 { 3934 if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT 3935 || mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT_64) 3936 { 3937 bfd_mach_o_segment_command *seg; 3938 3939 seg = &mdata->commands[i].command.segment; 3940 mdata->nsects += seg->nsects; 3941 } 3942 } 3943 3944 /* Allocate sections array. */ 3945 mdata->sections = bfd_alloc (abfd, 3946 mdata->nsects * sizeof (bfd_mach_o_section *)); 3947 3948 /* Fill the array. */ 3949 csect = 0; 3950 3951 for (i = 0; i < mdata->header.ncmds; i++) 3952 { 3953 if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT 3954 || mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT_64) 3955 { 3956 bfd_mach_o_segment_command *seg; 3957 bfd_mach_o_section *sec; 3958 3959 seg = &mdata->commands[i].command.segment; 3960 BFD_ASSERT (csect + seg->nsects <= mdata->nsects); 3961 3962 for (sec = seg->sect_head; sec != NULL; sec = sec->next) 3963 mdata->sections[csect++] = sec; 3964 } 3965 } 3966 } 3967 3968 static bfd_boolean 3969 bfd_mach_o_scan_start_address (bfd *abfd) 3970 { 3971 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 3972 bfd_mach_o_thread_command *cmd = NULL; 3973 unsigned long i; 3974 3975 for (i = 0; i < mdata->header.ncmds; i++) 3976 if ((mdata->commands[i].type == BFD_MACH_O_LC_THREAD) || 3977 (mdata->commands[i].type == BFD_MACH_O_LC_UNIXTHREAD)) 3978 { 3979 cmd = &mdata->commands[i].command.thread; 3980 break; 3981 } 3982 else if (mdata->commands[i].type == BFD_MACH_O_LC_MAIN 3983 && mdata->nsects > 1) 3984 { 3985 bfd_mach_o_main_command *main_cmd = &mdata->commands[i].command.main; 3986 bfd_mach_o_section *text_sect = mdata->sections[0]; 3987 if (text_sect) 3988 { 3989 abfd->start_address = main_cmd->entryoff 3990 + (text_sect->addr - text_sect->offset); 3991 return TRUE; 3992 } 3993 } 3994 3995 /* An object file has no start address, so do not fail if not found. */ 3996 if (cmd == NULL) 3997 return TRUE; 3998 3999 /* FIXME: create a subtarget hook ? */ 4000 for (i = 0; i < cmd->nflavours; i++) 4001 { 4002 if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_I386) 4003 && (cmd->flavours[i].flavour 4004 == (unsigned long) BFD_MACH_O_x86_THREAD_STATE32)) 4005 { 4006 unsigned char buf[4]; 4007 4008 if (bfd_seek (abfd, cmd->flavours[i].offset + 40, SEEK_SET) != 0 4009 || bfd_bread (buf, 4, abfd) != 4) 4010 return FALSE; 4011 4012 abfd->start_address = bfd_h_get_32 (abfd, buf); 4013 } 4014 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC) 4015 && (cmd->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE)) 4016 { 4017 unsigned char buf[4]; 4018 4019 if (bfd_seek (abfd, cmd->flavours[i].offset + 0, SEEK_SET) != 0 4020 || bfd_bread (buf, 4, abfd) != 4) 4021 return FALSE; 4022 4023 abfd->start_address = bfd_h_get_32 (abfd, buf); 4024 } 4025 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC_64) 4026 && (cmd->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE64)) 4027 { 4028 unsigned char buf[8]; 4029 4030 if (bfd_seek (abfd, cmd->flavours[i].offset + 0, SEEK_SET) != 0 4031 || bfd_bread (buf, 8, abfd) != 8) 4032 return FALSE; 4033 4034 abfd->start_address = bfd_h_get_64 (abfd, buf); 4035 } 4036 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_X86_64) 4037 && (cmd->flavours[i].flavour == BFD_MACH_O_x86_THREAD_STATE64)) 4038 { 4039 unsigned char buf[8]; 4040 4041 if (bfd_seek (abfd, cmd->flavours[i].offset + (16 * 8), SEEK_SET) != 0 4042 || bfd_bread (buf, 8, abfd) != 8) 4043 return FALSE; 4044 4045 abfd->start_address = bfd_h_get_64 (abfd, buf); 4046 } 4047 } 4048 4049 return TRUE; 4050 } 4051 4052 bfd_boolean 4053 bfd_mach_o_set_arch_mach (bfd *abfd, 4054 enum bfd_architecture arch, 4055 unsigned long machine) 4056 { 4057 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd); 4058 4059 /* If this isn't the right architecture for this backend, and this 4060 isn't the generic backend, fail. */ 4061 if (arch != bed->arch 4062 && arch != bfd_arch_unknown 4063 && bed->arch != bfd_arch_unknown) 4064 return FALSE; 4065 4066 return bfd_default_set_arch_mach (abfd, arch, machine); 4067 } 4068 4069 static bfd_boolean 4070 bfd_mach_o_scan (bfd *abfd, 4071 bfd_mach_o_header *header, 4072 bfd_mach_o_data_struct *mdata) 4073 { 4074 unsigned int i; 4075 enum bfd_architecture cputype; 4076 unsigned long cpusubtype; 4077 unsigned int hdrsize; 4078 4079 hdrsize = mach_o_wide_p (header) ? 4080 BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE; 4081 4082 mdata->header = *header; 4083 4084 abfd->flags = abfd->flags & BFD_IN_MEMORY; 4085 switch (header->filetype) 4086 { 4087 case BFD_MACH_O_MH_OBJECT: 4088 abfd->flags |= HAS_RELOC; 4089 break; 4090 case BFD_MACH_O_MH_EXECUTE: 4091 abfd->flags |= EXEC_P; 4092 break; 4093 case BFD_MACH_O_MH_DYLIB: 4094 case BFD_MACH_O_MH_BUNDLE: 4095 abfd->flags |= DYNAMIC; 4096 break; 4097 } 4098 4099 abfd->tdata.mach_o_data = mdata; 4100 4101 bfd_mach_o_convert_architecture (header->cputype, header->cpusubtype, 4102 &cputype, &cpusubtype); 4103 if (cputype == bfd_arch_unknown) 4104 { 4105 (*_bfd_error_handler) 4106 (_("bfd_mach_o_scan: unknown architecture 0x%lx/0x%lx"), 4107 header->cputype, header->cpusubtype); 4108 return FALSE; 4109 } 4110 4111 bfd_set_arch_mach (abfd, cputype, cpusubtype); 4112 4113 if (header->ncmds != 0) 4114 { 4115 mdata->commands = bfd_alloc 4116 (abfd, header->ncmds * sizeof (bfd_mach_o_load_command)); 4117 if (mdata->commands == NULL) 4118 return FALSE; 4119 4120 for (i = 0; i < header->ncmds; i++) 4121 { 4122 bfd_mach_o_load_command *cur = &mdata->commands[i]; 4123 4124 if (i == 0) 4125 cur->offset = hdrsize; 4126 else 4127 { 4128 bfd_mach_o_load_command *prev = &mdata->commands[i - 1]; 4129 cur->offset = prev->offset + prev->len; 4130 } 4131 4132 if (bfd_mach_o_read_command (abfd, cur) < 0) 4133 return FALSE; 4134 } 4135 } 4136 4137 /* Sections should be flatten before scanning start address. */ 4138 bfd_mach_o_flatten_sections (abfd); 4139 if (!bfd_mach_o_scan_start_address (abfd)) 4140 return FALSE; 4141 4142 return TRUE; 4143 } 4144 4145 bfd_boolean 4146 bfd_mach_o_mkobject_init (bfd *abfd) 4147 { 4148 bfd_mach_o_data_struct *mdata = NULL; 4149 4150 mdata = bfd_alloc (abfd, sizeof (bfd_mach_o_data_struct)); 4151 if (mdata == NULL) 4152 return FALSE; 4153 abfd->tdata.mach_o_data = mdata; 4154 4155 mdata->header.magic = 0; 4156 mdata->header.cputype = 0; 4157 mdata->header.cpusubtype = 0; 4158 mdata->header.filetype = 0; 4159 mdata->header.ncmds = 0; 4160 mdata->header.sizeofcmds = 0; 4161 mdata->header.flags = 0; 4162 mdata->header.byteorder = BFD_ENDIAN_UNKNOWN; 4163 mdata->commands = NULL; 4164 mdata->nsects = 0; 4165 mdata->sections = NULL; 4166 mdata->dyn_reloc_cache = NULL; 4167 4168 return TRUE; 4169 } 4170 4171 static bfd_boolean 4172 bfd_mach_o_gen_mkobject (bfd *abfd) 4173 { 4174 bfd_mach_o_data_struct *mdata; 4175 4176 if (!bfd_mach_o_mkobject_init (abfd)) 4177 return FALSE; 4178 4179 mdata = bfd_mach_o_get_data (abfd); 4180 mdata->header.magic = BFD_MACH_O_MH_MAGIC; 4181 mdata->header.cputype = 0; 4182 mdata->header.cpusubtype = 0; 4183 mdata->header.byteorder = abfd->xvec->byteorder; 4184 mdata->header.version = 1; 4185 4186 return TRUE; 4187 } 4188 4189 const bfd_target * 4190 bfd_mach_o_header_p (bfd *abfd, 4191 bfd_mach_o_filetype filetype, 4192 bfd_mach_o_cpu_type cputype) 4193 { 4194 bfd_mach_o_header header; 4195 bfd_mach_o_data_struct *mdata; 4196 4197 if (!bfd_mach_o_read_header (abfd, &header)) 4198 goto wrong; 4199 4200 if (! (header.byteorder == BFD_ENDIAN_BIG 4201 || header.byteorder == BFD_ENDIAN_LITTLE)) 4202 { 4203 (*_bfd_error_handler) (_("unknown header byte-order value 0x%lx"), 4204 (unsigned long) header.byteorder); 4205 goto wrong; 4206 } 4207 4208 if (! ((header.byteorder == BFD_ENDIAN_BIG 4209 && abfd->xvec->byteorder == BFD_ENDIAN_BIG 4210 && abfd->xvec->header_byteorder == BFD_ENDIAN_BIG) 4211 || (header.byteorder == BFD_ENDIAN_LITTLE 4212 && abfd->xvec->byteorder == BFD_ENDIAN_LITTLE 4213 && abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE))) 4214 goto wrong; 4215 4216 /* Check cputype and filetype. 4217 In case of wildcard, do not accept magics that are handled by existing 4218 targets. */ 4219 if (cputype) 4220 { 4221 if (header.cputype != cputype) 4222 goto wrong; 4223 } 4224 4225 if (filetype) 4226 { 4227 if (header.filetype != filetype) 4228 goto wrong; 4229 } 4230 else 4231 { 4232 switch (header.filetype) 4233 { 4234 case BFD_MACH_O_MH_CORE: 4235 /* Handled by core_p */ 4236 goto wrong; 4237 default: 4238 break; 4239 } 4240 } 4241 4242 mdata = (bfd_mach_o_data_struct *) bfd_zalloc (abfd, sizeof (*mdata)); 4243 if (mdata == NULL) 4244 goto fail; 4245 4246 if (!bfd_mach_o_scan (abfd, &header, mdata)) 4247 goto wrong; 4248 4249 return abfd->xvec; 4250 4251 wrong: 4252 bfd_set_error (bfd_error_wrong_format); 4253 4254 fail: 4255 return NULL; 4256 } 4257 4258 static const bfd_target * 4259 bfd_mach_o_gen_object_p (bfd *abfd) 4260 { 4261 return bfd_mach_o_header_p (abfd, 0, 0); 4262 } 4263 4264 static const bfd_target * 4265 bfd_mach_o_gen_core_p (bfd *abfd) 4266 { 4267 return bfd_mach_o_header_p (abfd, BFD_MACH_O_MH_CORE, 0); 4268 } 4269 4270 typedef struct mach_o_fat_archentry 4271 { 4272 unsigned long cputype; 4273 unsigned long cpusubtype; 4274 unsigned long offset; 4275 unsigned long size; 4276 unsigned long align; 4277 } mach_o_fat_archentry; 4278 4279 typedef struct mach_o_fat_data_struct 4280 { 4281 unsigned long magic; 4282 unsigned long nfat_arch; 4283 mach_o_fat_archentry *archentries; 4284 } mach_o_fat_data_struct; 4285 4286 const bfd_target * 4287 bfd_mach_o_archive_p (bfd *abfd) 4288 { 4289 mach_o_fat_data_struct *adata = NULL; 4290 struct mach_o_fat_header_external hdr; 4291 unsigned long i; 4292 4293 if (bfd_seek (abfd, 0, SEEK_SET) != 0 4294 || bfd_bread (&hdr, sizeof (hdr), abfd) != sizeof (hdr)) 4295 goto error; 4296 4297 adata = bfd_alloc (abfd, sizeof (mach_o_fat_data_struct)); 4298 if (adata == NULL) 4299 goto error; 4300 4301 adata->magic = bfd_getb32 (hdr.magic); 4302 adata->nfat_arch = bfd_getb32 (hdr.nfat_arch); 4303 if (adata->magic != 0xcafebabe) 4304 goto error; 4305 /* Avoid matching Java bytecode files, which have the same magic number. 4306 In the Java bytecode file format this field contains the JVM version, 4307 which starts at 43.0. */ 4308 if (adata->nfat_arch > 30) 4309 goto error; 4310 4311 adata->archentries = 4312 bfd_alloc (abfd, adata->nfat_arch * sizeof (mach_o_fat_archentry)); 4313 if (adata->archentries == NULL) 4314 goto error; 4315 4316 for (i = 0; i < adata->nfat_arch; i++) 4317 { 4318 struct mach_o_fat_arch_external arch; 4319 if (bfd_bread (&arch, sizeof (arch), abfd) != sizeof (arch)) 4320 goto error; 4321 adata->archentries[i].cputype = bfd_getb32 (arch.cputype); 4322 adata->archentries[i].cpusubtype = bfd_getb32 (arch.cpusubtype); 4323 adata->archentries[i].offset = bfd_getb32 (arch.offset); 4324 adata->archentries[i].size = bfd_getb32 (arch.size); 4325 adata->archentries[i].align = bfd_getb32 (arch.align); 4326 } 4327 4328 abfd->tdata.mach_o_fat_data = adata; 4329 return abfd->xvec; 4330 4331 error: 4332 if (adata != NULL) 4333 bfd_release (abfd, adata); 4334 bfd_set_error (bfd_error_wrong_format); 4335 return NULL; 4336 } 4337 4338 /* Set the filename for a fat binary member ABFD, whose bfd architecture is 4339 ARCH_TYPE/ARCH_SUBTYPE and corresponding entry in header is ENTRY. 4340 Set arelt_data and origin fields too. */ 4341 4342 static void 4343 bfd_mach_o_fat_member_init (bfd *abfd, 4344 enum bfd_architecture arch_type, 4345 unsigned long arch_subtype, 4346 mach_o_fat_archentry *entry) 4347 { 4348 struct areltdata *areltdata; 4349 /* Create the member filename. Use ARCH_NAME. */ 4350 const bfd_arch_info_type *ap = bfd_lookup_arch (arch_type, arch_subtype); 4351 4352 if (ap) 4353 { 4354 /* Use the architecture name if known. */ 4355 abfd->filename = ap->printable_name; 4356 } 4357 else 4358 { 4359 /* Forge a uniq id. */ 4360 const size_t namelen = 2 + 8 + 1 + 2 + 8 + 1; 4361 char *name = bfd_alloc (abfd, namelen); 4362 snprintf (name, namelen, "0x%lx-0x%lx", 4363 entry->cputype, entry->cpusubtype); 4364 abfd->filename = name; 4365 } 4366 4367 areltdata = bfd_zmalloc (sizeof (struct areltdata)); 4368 areltdata->parsed_size = entry->size; 4369 abfd->arelt_data = areltdata; 4370 abfd->iostream = NULL; 4371 abfd->origin = entry->offset; 4372 } 4373 4374 bfd * 4375 bfd_mach_o_openr_next_archived_file (bfd *archive, bfd *prev) 4376 { 4377 mach_o_fat_data_struct *adata; 4378 mach_o_fat_archentry *entry = NULL; 4379 unsigned long i; 4380 bfd *nbfd; 4381 enum bfd_architecture arch_type; 4382 unsigned long arch_subtype; 4383 4384 adata = (mach_o_fat_data_struct *) archive->tdata.mach_o_fat_data; 4385 BFD_ASSERT (adata != NULL); 4386 4387 /* Find index of previous entry. */ 4388 if (prev == NULL) 4389 { 4390 /* Start at first one. */ 4391 i = 0; 4392 } 4393 else 4394 { 4395 /* Find index of PREV. */ 4396 for (i = 0; i < adata->nfat_arch; i++) 4397 { 4398 if (adata->archentries[i].offset == prev->origin) 4399 break; 4400 } 4401 4402 if (i == adata->nfat_arch) 4403 { 4404 /* Not found. */ 4405 bfd_set_error (bfd_error_bad_value); 4406 return NULL; 4407 } 4408 4409 /* Get next entry. */ 4410 i++; 4411 } 4412 4413 if (i >= adata->nfat_arch) 4414 { 4415 bfd_set_error (bfd_error_no_more_archived_files); 4416 return NULL; 4417 } 4418 4419 entry = &adata->archentries[i]; 4420 nbfd = _bfd_new_bfd_contained_in (archive); 4421 if (nbfd == NULL) 4422 return NULL; 4423 4424 bfd_mach_o_convert_architecture (entry->cputype, entry->cpusubtype, 4425 &arch_type, &arch_subtype); 4426 4427 bfd_mach_o_fat_member_init (nbfd, arch_type, arch_subtype, entry); 4428 4429 bfd_set_arch_mach (nbfd, arch_type, arch_subtype); 4430 4431 return nbfd; 4432 } 4433 4434 /* Analogous to stat call. */ 4435 4436 static int 4437 bfd_mach_o_fat_stat_arch_elt (bfd *abfd, struct stat *buf) 4438 { 4439 if (abfd->arelt_data == NULL) 4440 { 4441 bfd_set_error (bfd_error_invalid_operation); 4442 return -1; 4443 } 4444 4445 buf->st_mtime = 0; 4446 buf->st_uid = 0; 4447 buf->st_gid = 0; 4448 buf->st_mode = 0644; 4449 buf->st_size = arelt_size (abfd); 4450 4451 return 0; 4452 } 4453 4454 /* If ABFD format is FORMAT and architecture is ARCH, return it. 4455 If ABFD is a fat image containing a member that corresponds to FORMAT 4456 and ARCH, returns it. 4457 In other case, returns NULL. 4458 This function allows transparent uses of fat images. */ 4459 4460 bfd * 4461 bfd_mach_o_fat_extract (bfd *abfd, 4462 bfd_format format, 4463 const bfd_arch_info_type *arch) 4464 { 4465 bfd *res; 4466 mach_o_fat_data_struct *adata; 4467 unsigned int i; 4468 4469 if (bfd_check_format (abfd, format)) 4470 { 4471 if (bfd_get_arch_info (abfd) == arch) 4472 return abfd; 4473 return NULL; 4474 } 4475 if (!bfd_check_format (abfd, bfd_archive) 4476 || abfd->xvec != &mach_o_fat_vec) 4477 return NULL; 4478 4479 /* This is a Mach-O fat image. */ 4480 adata = (mach_o_fat_data_struct *) abfd->tdata.mach_o_fat_data; 4481 BFD_ASSERT (adata != NULL); 4482 4483 for (i = 0; i < adata->nfat_arch; i++) 4484 { 4485 struct mach_o_fat_archentry *e = &adata->archentries[i]; 4486 enum bfd_architecture cpu_type; 4487 unsigned long cpu_subtype; 4488 4489 bfd_mach_o_convert_architecture (e->cputype, e->cpusubtype, 4490 &cpu_type, &cpu_subtype); 4491 if (cpu_type != arch->arch || cpu_subtype != arch->mach) 4492 continue; 4493 4494 /* The architecture is found. */ 4495 res = _bfd_new_bfd_contained_in (abfd); 4496 if (res == NULL) 4497 return NULL; 4498 4499 bfd_mach_o_fat_member_init (res, cpu_type, cpu_subtype, e); 4500 4501 if (bfd_check_format (res, format)) 4502 { 4503 BFD_ASSERT (bfd_get_arch_info (res) == arch); 4504 return res; 4505 } 4506 bfd_close (res); 4507 return NULL; 4508 } 4509 4510 return NULL; 4511 } 4512 4513 int 4514 bfd_mach_o_lookup_command (bfd *abfd, 4515 bfd_mach_o_load_command_type type, 4516 bfd_mach_o_load_command **mcommand) 4517 { 4518 struct mach_o_data_struct *md = bfd_mach_o_get_data (abfd); 4519 bfd_mach_o_load_command *ncmd = NULL; 4520 unsigned int i, num; 4521 4522 BFD_ASSERT (md != NULL); 4523 BFD_ASSERT (mcommand != NULL); 4524 4525 num = 0; 4526 for (i = 0; i < md->header.ncmds; i++) 4527 { 4528 struct bfd_mach_o_load_command *cmd = &md->commands[i]; 4529 4530 if (cmd->type != type) 4531 continue; 4532 4533 if (num == 0) 4534 ncmd = cmd; 4535 num++; 4536 } 4537 4538 *mcommand = ncmd; 4539 return num; 4540 } 4541 4542 unsigned long 4543 bfd_mach_o_stack_addr (enum bfd_mach_o_cpu_type type) 4544 { 4545 switch (type) 4546 { 4547 case BFD_MACH_O_CPU_TYPE_MC680x0: 4548 return 0x04000000; 4549 case BFD_MACH_O_CPU_TYPE_MC88000: 4550 return 0xffffe000; 4551 case BFD_MACH_O_CPU_TYPE_POWERPC: 4552 return 0xc0000000; 4553 case BFD_MACH_O_CPU_TYPE_I386: 4554 return 0xc0000000; 4555 case BFD_MACH_O_CPU_TYPE_SPARC: 4556 return 0xf0000000; 4557 case BFD_MACH_O_CPU_TYPE_I860: 4558 return 0; 4559 case BFD_MACH_O_CPU_TYPE_HPPA: 4560 return 0xc0000000 - 0x04000000; 4561 default: 4562 return 0; 4563 } 4564 } 4565 4566 /* The following two tables should be kept, as far as possible, in order of 4567 most frequently used entries to optimize their use from gas. */ 4568 4569 const bfd_mach_o_xlat_name bfd_mach_o_section_type_name[] = 4570 { 4571 { "regular", BFD_MACH_O_S_REGULAR}, 4572 { "coalesced", BFD_MACH_O_S_COALESCED}, 4573 { "zerofill", BFD_MACH_O_S_ZEROFILL}, 4574 { "cstring_literals", BFD_MACH_O_S_CSTRING_LITERALS}, 4575 { "4byte_literals", BFD_MACH_O_S_4BYTE_LITERALS}, 4576 { "8byte_literals", BFD_MACH_O_S_8BYTE_LITERALS}, 4577 { "16byte_literals", BFD_MACH_O_S_16BYTE_LITERALS}, 4578 { "literal_pointers", BFD_MACH_O_S_LITERAL_POINTERS}, 4579 { "mod_init_func_pointers", BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS}, 4580 { "mod_fini_func_pointers", BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS}, 4581 { "gb_zerofill", BFD_MACH_O_S_GB_ZEROFILL}, 4582 { "interposing", BFD_MACH_O_S_INTERPOSING}, 4583 { "dtrace_dof", BFD_MACH_O_S_DTRACE_DOF}, 4584 { "non_lazy_symbol_pointers", BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS}, 4585 { "lazy_symbol_pointers", BFD_MACH_O_S_LAZY_SYMBOL_POINTERS}, 4586 { "symbol_stubs", BFD_MACH_O_S_SYMBOL_STUBS}, 4587 { "lazy_dylib_symbol_pointers", BFD_MACH_O_S_LAZY_DYLIB_SYMBOL_POINTERS}, 4588 { NULL, 0} 4589 }; 4590 4591 const bfd_mach_o_xlat_name bfd_mach_o_section_attribute_name[] = 4592 { 4593 { "pure_instructions", BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS }, 4594 { "some_instructions", BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS }, 4595 { "loc_reloc", BFD_MACH_O_S_ATTR_LOC_RELOC }, 4596 { "ext_reloc", BFD_MACH_O_S_ATTR_EXT_RELOC }, 4597 { "debug", BFD_MACH_O_S_ATTR_DEBUG }, 4598 { "live_support", BFD_MACH_O_S_ATTR_LIVE_SUPPORT }, 4599 { "no_dead_strip", BFD_MACH_O_S_ATTR_NO_DEAD_STRIP }, 4600 { "strip_static_syms", BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS }, 4601 { "no_toc", BFD_MACH_O_S_ATTR_NO_TOC }, 4602 { "self_modifying_code", BFD_MACH_O_S_SELF_MODIFYING_CODE }, 4603 { "modifying_code", BFD_MACH_O_S_SELF_MODIFYING_CODE }, 4604 { NULL, 0} 4605 }; 4606 4607 /* Get the section type from NAME. Return 256 if NAME is unknown. */ 4608 4609 unsigned int 4610 bfd_mach_o_get_section_type_from_name (bfd *abfd, const char *name) 4611 { 4612 const bfd_mach_o_xlat_name *x; 4613 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd); 4614 4615 for (x = bfd_mach_o_section_type_name; x->name; x++) 4616 if (strcmp (x->name, name) == 0) 4617 { 4618 /* We found it... does the target support it? */ 4619 if (bed->bfd_mach_o_section_type_valid_for_target == NULL 4620 || bed->bfd_mach_o_section_type_valid_for_target (x->val)) 4621 return x->val; /* OK. */ 4622 else 4623 break; /* Not supported. */ 4624 } 4625 /* Maximum section ID = 0xff. */ 4626 return 256; 4627 } 4628 4629 /* Get the section attribute from NAME. Return -1 if NAME is unknown. */ 4630 4631 unsigned int 4632 bfd_mach_o_get_section_attribute_from_name (const char *name) 4633 { 4634 const bfd_mach_o_xlat_name *x; 4635 4636 for (x = bfd_mach_o_section_attribute_name; x->name; x++) 4637 if (strcmp (x->name, name) == 0) 4638 return x->val; 4639 return (unsigned int)-1; 4640 } 4641 4642 int 4643 bfd_mach_o_core_fetch_environment (bfd *abfd, 4644 unsigned char **rbuf, 4645 unsigned int *rlen) 4646 { 4647 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 4648 unsigned long stackaddr = bfd_mach_o_stack_addr (mdata->header.cputype); 4649 unsigned int i = 0; 4650 4651 for (i = 0; i < mdata->header.ncmds; i++) 4652 { 4653 bfd_mach_o_load_command *cur = &mdata->commands[i]; 4654 bfd_mach_o_segment_command *seg = NULL; 4655 4656 if (cur->type != BFD_MACH_O_LC_SEGMENT) 4657 continue; 4658 4659 seg = &cur->command.segment; 4660 4661 if ((seg->vmaddr + seg->vmsize) == stackaddr) 4662 { 4663 unsigned long start = seg->fileoff; 4664 unsigned long end = seg->fileoff + seg->filesize; 4665 unsigned char *buf = bfd_malloc (1024); 4666 unsigned long size = 1024; 4667 4668 for (;;) 4669 { 4670 bfd_size_type nread = 0; 4671 unsigned long offset; 4672 int found_nonnull = 0; 4673 4674 if (size > (end - start)) 4675 size = (end - start); 4676 4677 buf = bfd_realloc_or_free (buf, size); 4678 if (buf == NULL) 4679 return -1; 4680 4681 if (bfd_seek (abfd, end - size, SEEK_SET) != 0) 4682 { 4683 free (buf); 4684 return -1; 4685 } 4686 4687 nread = bfd_bread (buf, size, abfd); 4688 4689 if (nread != size) 4690 { 4691 free (buf); 4692 return -1; 4693 } 4694 4695 for (offset = 4; offset <= size; offset += 4) 4696 { 4697 unsigned long val; 4698 4699 val = *((unsigned long *) (buf + size - offset)); 4700 if (! found_nonnull) 4701 { 4702 if (val != 0) 4703 found_nonnull = 1; 4704 } 4705 else if (val == 0x0) 4706 { 4707 unsigned long bottom; 4708 unsigned long top; 4709 4710 bottom = seg->fileoff + seg->filesize - offset; 4711 top = seg->fileoff + seg->filesize - 4; 4712 *rbuf = bfd_malloc (top - bottom); 4713 *rlen = top - bottom; 4714 4715 memcpy (*rbuf, buf + size - *rlen, *rlen); 4716 free (buf); 4717 return 0; 4718 } 4719 } 4720 4721 if (size == (end - start)) 4722 break; 4723 4724 size *= 2; 4725 } 4726 4727 free (buf); 4728 } 4729 } 4730 4731 return -1; 4732 } 4733 4734 char * 4735 bfd_mach_o_core_file_failing_command (bfd *abfd) 4736 { 4737 unsigned char *buf = NULL; 4738 unsigned int len = 0; 4739 int ret = -1; 4740 4741 ret = bfd_mach_o_core_fetch_environment (abfd, &buf, &len); 4742 if (ret < 0) 4743 return NULL; 4744 4745 return (char *) buf; 4746 } 4747 4748 int 4749 bfd_mach_o_core_file_failing_signal (bfd *abfd ATTRIBUTE_UNUSED) 4750 { 4751 return 0; 4752 } 4753 4754 static bfd_mach_o_uuid_command * 4755 bfd_mach_o_lookup_uuid_command (bfd *abfd) 4756 { 4757 bfd_mach_o_load_command *uuid_cmd; 4758 int ncmd = bfd_mach_o_lookup_command (abfd, BFD_MACH_O_LC_UUID, &uuid_cmd); 4759 if (ncmd != 1) 4760 return FALSE; 4761 return &uuid_cmd->command.uuid; 4762 } 4763 4764 /* Return true if ABFD is a dSYM file and its UUID matches UUID_CMD. */ 4765 4766 static bfd_boolean 4767 bfd_mach_o_dsym_for_uuid_p (bfd *abfd, const bfd_mach_o_uuid_command *uuid_cmd) 4768 { 4769 bfd_mach_o_uuid_command *dsym_uuid_cmd; 4770 4771 BFD_ASSERT (abfd); 4772 BFD_ASSERT (uuid_cmd); 4773 4774 if (!bfd_check_format (abfd, bfd_object)) 4775 return FALSE; 4776 4777 if (bfd_get_flavour (abfd) != bfd_target_mach_o_flavour 4778 || bfd_mach_o_get_data (abfd) == NULL 4779 || bfd_mach_o_get_data (abfd)->header.filetype != BFD_MACH_O_MH_DSYM) 4780 return FALSE; 4781 4782 dsym_uuid_cmd = bfd_mach_o_lookup_uuid_command (abfd); 4783 if (dsym_uuid_cmd == NULL) 4784 return FALSE; 4785 4786 if (memcmp (uuid_cmd->uuid, dsym_uuid_cmd->uuid, 4787 sizeof (uuid_cmd->uuid)) != 0) 4788 return FALSE; 4789 4790 return TRUE; 4791 } 4792 4793 /* Find a BFD in DSYM_FILENAME which matches ARCH and UUID_CMD. 4794 The caller is responsible for closing the returned BFD object and 4795 its my_archive if the returned BFD is in a fat dSYM. */ 4796 4797 static bfd * 4798 bfd_mach_o_find_dsym (const char *dsym_filename, 4799 const bfd_mach_o_uuid_command *uuid_cmd, 4800 const bfd_arch_info_type *arch) 4801 { 4802 bfd *base_dsym_bfd, *dsym_bfd; 4803 4804 BFD_ASSERT (uuid_cmd); 4805 4806 base_dsym_bfd = bfd_openr (dsym_filename, NULL); 4807 if (base_dsym_bfd == NULL) 4808 return NULL; 4809 4810 dsym_bfd = bfd_mach_o_fat_extract (base_dsym_bfd, bfd_object, arch); 4811 if (bfd_mach_o_dsym_for_uuid_p (dsym_bfd, uuid_cmd)) 4812 return dsym_bfd; 4813 4814 bfd_close (dsym_bfd); 4815 if (base_dsym_bfd != dsym_bfd) 4816 bfd_close (base_dsym_bfd); 4817 4818 return NULL; 4819 } 4820 4821 /* Return a BFD created from a dSYM file for ABFD. 4822 The caller is responsible for closing the returned BFD object, its 4823 filename, and its my_archive if the returned BFD is in a fat dSYM. */ 4824 4825 static bfd * 4826 bfd_mach_o_follow_dsym (bfd *abfd) 4827 { 4828 char *dsym_filename; 4829 bfd_mach_o_uuid_command *uuid_cmd; 4830 bfd *dsym_bfd, *base_bfd = abfd; 4831 const char *base_basename; 4832 4833 if (abfd == NULL || bfd_get_flavour (abfd) != bfd_target_mach_o_flavour) 4834 return NULL; 4835 4836 if (abfd->my_archive) 4837 base_bfd = abfd->my_archive; 4838 /* BFD may have been opened from a stream. */ 4839 if (base_bfd->filename == NULL) 4840 { 4841 bfd_set_error (bfd_error_invalid_operation); 4842 return NULL; 4843 } 4844 base_basename = lbasename (base_bfd->filename); 4845 4846 uuid_cmd = bfd_mach_o_lookup_uuid_command (abfd); 4847 if (uuid_cmd == NULL) 4848 return NULL; 4849 4850 /* TODO: We assume the DWARF file has the same as the binary's. 4851 It seems apple's GDB checks all files in the dSYM bundle directory. 4852 http://opensource.apple.com/source/gdb/gdb-1708/src/gdb/macosx/macosx-tdep.c 4853 */ 4854 dsym_filename = (char *)bfd_malloc (strlen (base_bfd->filename) 4855 + strlen (dsym_subdir) + 1 4856 + strlen (base_basename) + 1); 4857 sprintf (dsym_filename, "%s%s/%s", 4858 base_bfd->filename, dsym_subdir, base_basename); 4859 4860 dsym_bfd = bfd_mach_o_find_dsym (dsym_filename, uuid_cmd, 4861 bfd_get_arch_info (abfd)); 4862 if (dsym_bfd == NULL) 4863 free (dsym_filename); 4864 4865 return dsym_bfd; 4866 } 4867 4868 bfd_boolean 4869 bfd_mach_o_find_nearest_line (bfd *abfd, 4870 asection *section, 4871 asymbol **symbols, 4872 bfd_vma offset, 4873 const char **filename_ptr, 4874 const char **functionname_ptr, 4875 unsigned int *line_ptr) 4876 { 4877 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 4878 if (mdata == NULL) 4879 return FALSE; 4880 switch (mdata->header.filetype) 4881 { 4882 case BFD_MACH_O_MH_OBJECT: 4883 break; 4884 case BFD_MACH_O_MH_EXECUTE: 4885 case BFD_MACH_O_MH_DYLIB: 4886 case BFD_MACH_O_MH_BUNDLE: 4887 case BFD_MACH_O_MH_KEXT_BUNDLE: 4888 if (mdata->dwarf2_find_line_info == NULL) 4889 { 4890 mdata->dsym_bfd = bfd_mach_o_follow_dsym (abfd); 4891 /* When we couldn't find dSYM for this binary, we look for 4892 the debug information in the binary itself. In this way, 4893 we won't try finding separated dSYM again because 4894 mdata->dwarf2_find_line_info will be filled. */ 4895 if (! mdata->dsym_bfd) 4896 break; 4897 if (! _bfd_dwarf2_slurp_debug_info (abfd, mdata->dsym_bfd, 4898 dwarf_debug_sections, symbols, 4899 &mdata->dwarf2_find_line_info)) 4900 return FALSE; 4901 } 4902 break; 4903 default: 4904 return FALSE; 4905 } 4906 if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections, 4907 section, symbols, offset, 4908 filename_ptr, functionname_ptr, 4909 line_ptr, NULL, 0, 4910 &mdata->dwarf2_find_line_info)) 4911 return TRUE; 4912 return FALSE; 4913 } 4914 4915 bfd_boolean 4916 bfd_mach_o_close_and_cleanup (bfd *abfd) 4917 { 4918 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 4919 if (bfd_get_format (abfd) == bfd_object && mdata != NULL) 4920 { 4921 _bfd_dwarf2_cleanup_debug_info (abfd, &mdata->dwarf2_find_line_info); 4922 bfd_mach_o_free_cached_info (abfd); 4923 if (mdata->dsym_bfd != NULL) 4924 { 4925 bfd *fat_bfd = mdata->dsym_bfd->my_archive; 4926 char *dsym_filename = (char *)(fat_bfd 4927 ? fat_bfd->filename 4928 : mdata->dsym_bfd->filename); 4929 bfd_close (mdata->dsym_bfd); 4930 mdata->dsym_bfd = NULL; 4931 if (fat_bfd) 4932 bfd_close (fat_bfd); 4933 free (dsym_filename); 4934 } 4935 } 4936 4937 if (bfd_get_format (abfd) == bfd_archive 4938 && abfd->xvec == &mach_o_fat_vec) 4939 return TRUE; 4940 return _bfd_generic_close_and_cleanup (abfd); 4941 } 4942 4943 bfd_boolean bfd_mach_o_free_cached_info (bfd *abfd) 4944 { 4945 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); 4946 asection *asect; 4947 free (mdata->dyn_reloc_cache); 4948 mdata->dyn_reloc_cache = NULL; 4949 for (asect = abfd->sections; asect != NULL; asect = asect->next) 4950 { 4951 free (asect->relocation); 4952 asect->relocation = NULL; 4953 } 4954 4955 return TRUE; 4956 } 4957 4958 #define bfd_mach_o_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup 4959 #define bfd_mach_o_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup 4960 4961 #define bfd_mach_o_swap_reloc_in NULL 4962 #define bfd_mach_o_swap_reloc_out NULL 4963 #define bfd_mach_o_print_thread NULL 4964 #define bfd_mach_o_tgt_seg_table NULL 4965 #define bfd_mach_o_section_type_valid_for_tgt NULL 4966 4967 #define TARGET_NAME mach_o_be_vec 4968 #define TARGET_STRING "mach-o-be" 4969 #define TARGET_ARCHITECTURE bfd_arch_unknown 4970 #define TARGET_BIG_ENDIAN 1 4971 #define TARGET_ARCHIVE 0 4972 #define TARGET_PRIORITY 1 4973 #include "mach-o-target.c" 4974 4975 #undef TARGET_NAME 4976 #undef TARGET_STRING 4977 #undef TARGET_ARCHITECTURE 4978 #undef TARGET_BIG_ENDIAN 4979 #undef TARGET_ARCHIVE 4980 #undef TARGET_PRIORITY 4981 4982 #define TARGET_NAME mach_o_le_vec 4983 #define TARGET_STRING "mach-o-le" 4984 #define TARGET_ARCHITECTURE bfd_arch_unknown 4985 #define TARGET_BIG_ENDIAN 0 4986 #define TARGET_ARCHIVE 0 4987 #define TARGET_PRIORITY 1 4988 4989 #include "mach-o-target.c" 4990 4991 #undef TARGET_NAME 4992 #undef TARGET_STRING 4993 #undef TARGET_ARCHITECTURE 4994 #undef TARGET_BIG_ENDIAN 4995 #undef TARGET_ARCHIVE 4996 #undef TARGET_PRIORITY 4997 4998 /* Not yet handled: creating an archive. */ 4999 #define bfd_mach_o_mkarchive _bfd_noarchive_mkarchive 5000 5001 /* Not used. */ 5002 #define bfd_mach_o_read_ar_hdr _bfd_noarchive_read_ar_hdr 5003 #define bfd_mach_o_write_ar_hdr _bfd_noarchive_write_ar_hdr 5004 #define bfd_mach_o_slurp_armap _bfd_noarchive_slurp_armap 5005 #define bfd_mach_o_slurp_extended_name_table _bfd_noarchive_slurp_extended_name_table 5006 #define bfd_mach_o_construct_extended_name_table _bfd_noarchive_construct_extended_name_table 5007 #define bfd_mach_o_truncate_arname _bfd_noarchive_truncate_arname 5008 #define bfd_mach_o_write_armap _bfd_noarchive_write_armap 5009 #define bfd_mach_o_get_elt_at_index _bfd_noarchive_get_elt_at_index 5010 #define bfd_mach_o_generic_stat_arch_elt bfd_mach_o_fat_stat_arch_elt 5011 #define bfd_mach_o_update_armap_timestamp _bfd_noarchive_update_armap_timestamp 5012 5013 #define TARGET_NAME mach_o_fat_vec 5014 #define TARGET_STRING "mach-o-fat" 5015 #define TARGET_ARCHITECTURE bfd_arch_unknown 5016 #define TARGET_BIG_ENDIAN 1 5017 #define TARGET_ARCHIVE 1 5018 #define TARGET_PRIORITY 0 5019 5020 #include "mach-o-target.c" 5021 5022 #undef TARGET_NAME 5023 #undef TARGET_STRING 5024 #undef TARGET_ARCHITECTURE 5025 #undef TARGET_BIG_ENDIAN 5026 #undef TARGET_ARCHIVE 5027 #undef TARGET_PRIORITY 5028