1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright (c) 1988 AT&T 24 * All Rights Reserved 25 * 26 * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved. 27 */ 28 29 /* 30 * Module sections. Initialize special sections 31 */ 32 33 #define ELF_TARGET_AMD64 34 35 #include <string.h> 36 #include <strings.h> 37 #include <stdio.h> 38 #include <link.h> 39 #include <debug.h> 40 #include "msg.h" 41 #include "_libld.h" 42 43 inline static void 44 remove_local(Ofl_desc *ofl, Sym_desc *sdp, int allow_ldynsym) 45 { 46 Sym *sym = sdp->sd_sym; 47 uchar_t type = ELF_ST_TYPE(sym->st_info); 48 /* LINTED - only used for assert() */ 49 int err; 50 51 if ((ofl->ofl_flags & FLG_OF_REDLSYM) == 0) { 52 ofl->ofl_locscnt--; 53 54 err = st_delstring(ofl->ofl_strtab, sdp->sd_name); 55 assert(err != -1); 56 57 if (allow_ldynsym && ldynsym_symtype[type]) { 58 ofl->ofl_dynlocscnt--; 59 60 err = st_delstring(ofl->ofl_dynstrtab, sdp->sd_name); 61 assert(err != -1); 62 /* Remove from sort section? */ 63 DYNSORT_COUNT(sdp, sym, type, --); 64 } 65 } 66 sdp->sd_flags |= FLG_SY_ISDISC; 67 } 68 69 inline static void 70 remove_scoped(Ofl_desc *ofl, Sym_desc *sdp, int allow_ldynsym) 71 { 72 Sym *sym = sdp->sd_sym; 73 uchar_t type = ELF_ST_TYPE(sym->st_info); 74 /* LINTED - only used for assert() */ 75 int err; 76 77 ofl->ofl_scopecnt--; 78 ofl->ofl_elimcnt++; 79 80 err = st_delstring(ofl->ofl_strtab, sdp->sd_name); 81 assert(err != -1); 82 83 if (allow_ldynsym && ldynsym_symtype[type]) { 84 ofl->ofl_dynscopecnt--; 85 86 err = st_delstring(ofl->ofl_dynstrtab, sdp->sd_name); 87 assert(err != -1); 88 /* Remove from sort section? */ 89 DYNSORT_COUNT(sdp, sym, type, --); 90 } 91 sdp->sd_flags |= FLG_SY_ELIM; 92 } 93 94 inline static void 95 ignore_sym(Ofl_desc *ofl, Ifl_desc *ifl, Sym_desc *sdp, int allow_ldynsym) 96 { 97 Os_desc *osp; 98 Is_desc *isp = sdp->sd_isc; 99 uchar_t bind = ELF_ST_BIND(sdp->sd_sym->st_info); 100 101 if (bind == STB_LOCAL) { 102 uchar_t type = ELF_ST_TYPE(sdp->sd_sym->st_info); 103 104 /* 105 * Skip section symbols, these were never collected in the 106 * first place. 107 */ 108 if (type == STT_SECTION) 109 return; 110 111 /* 112 * Determine if the whole file is being removed. Remove any 113 * file symbol, and any symbol that is not associated with a 114 * section, provided the symbol has not been identified as 115 * (update) required. 116 */ 117 if (((ifl->ifl_flags & FLG_IF_FILEREF) == 0) && 118 ((type == STT_FILE) || ((isp == NULL) && 119 ((sdp->sd_flags & FLG_SY_UPREQD) == 0)))) { 120 DBG_CALL(Dbg_syms_discarded(ofl->ofl_lml, sdp)); 121 if (ifl->ifl_flags & FLG_IF_IGNORE) 122 remove_local(ofl, sdp, allow_ldynsym); 123 return; 124 } 125 126 } else { 127 /* 128 * Global symbols can only be eliminated when the interfaces of 129 * an object have been defined via versioning/scoping. 130 */ 131 if (!SYM_IS_HIDDEN(sdp)) 132 return; 133 134 /* 135 * Remove any unreferenced symbols that are not associated with 136 * a section. 137 */ 138 if ((isp == NULL) && ((sdp->sd_flags & FLG_SY_UPREQD) == 0)) { 139 DBG_CALL(Dbg_syms_discarded(ofl->ofl_lml, sdp)); 140 if (ifl->ifl_flags & FLG_IF_IGNORE) 141 remove_scoped(ofl, sdp, allow_ldynsym); 142 return; 143 } 144 } 145 146 /* 147 * Do not discard any symbols that are associated with non-allocable 148 * segments. 149 */ 150 if (isp && ((isp->is_flags & FLG_IS_SECTREF) == 0) && 151 ((osp = isp->is_osdesc) != 0) && 152 (osp->os_sgdesc->sg_phdr.p_type == PT_LOAD)) { 153 DBG_CALL(Dbg_syms_discarded(ofl->ofl_lml, sdp)); 154 if (ifl->ifl_flags & FLG_IF_IGNORE) { 155 if (bind == STB_LOCAL) 156 remove_local(ofl, sdp, allow_ldynsym); 157 else 158 remove_scoped(ofl, sdp, allow_ldynsym); 159 } 160 } 161 } 162 163 static Boolean 164 isdesc_discarded(Is_desc *isp) 165 { 166 Ifl_desc *ifl = isp->is_file; 167 Os_desc *osp = isp->is_osdesc; 168 Word ptype = osp->os_sgdesc->sg_phdr.p_type; 169 170 if (isp->is_flags & FLG_IS_DISCARD) 171 return (TRUE); 172 173 /* 174 * If the file is discarded, it will take 175 * the section with it. 176 */ 177 if (ifl && 178 (((ifl->ifl_flags & FLG_IF_FILEREF) == 0) || 179 ((ptype == PT_LOAD) && 180 ((isp->is_flags & FLG_IS_SECTREF) == 0) && 181 (isp->is_shdr->sh_size > 0))) && 182 (ifl->ifl_flags & FLG_IF_IGNORE)) 183 return (TRUE); 184 185 return (FALSE); 186 } 187 188 /* 189 * There are situations where we may count output sections (ofl_shdrcnt) 190 * that are subsequently eliminated from the output object. Whether or 191 * not this happens cannot be known until all input has been seen and 192 * section elimination code has run. However, the situations where this 193 * outcome is possible are known, and are flagged by setting FLG_OF_ADJOSCNT. 194 * 195 * If FLG_OF_ADJOSCNT is set, this routine makes a pass over the output 196 * sections. If an unused output section is encountered, we decrement 197 * ofl->ofl_shdrcnt and remove the section name from the .shstrtab string 198 * table (ofl->ofl_shdrsttab). 199 * 200 * This code must be kept in sync with the similar code 201 * found in outfile.c:ld_create_outfile(). 202 */ 203 static void 204 adjust_os_count(Ofl_desc *ofl) 205 { 206 Sg_desc *sgp; 207 Is_desc *isp; 208 Os_desc *osp; 209 Aliste idx1; 210 211 if ((ofl->ofl_flags & FLG_OF_ADJOSCNT) == 0) 212 return; 213 214 /* 215 * For each output section, look at the input sections to find at least 216 * one input section that has not been eliminated. If none are found, 217 * the -z ignore processing above has eliminated that output section. 218 */ 219 for (APLIST_TRAVERSE(ofl->ofl_segs, idx1, sgp)) { 220 Aliste idx2; 221 222 for (APLIST_TRAVERSE(sgp->sg_osdescs, idx2, osp)) { 223 Aliste idx3; 224 int keep = 0, os_isdescs_idx; 225 226 OS_ISDESCS_TRAVERSE(os_isdescs_idx, osp, idx3, isp) { 227 /* 228 * We have found a kept input section, 229 * so the output section will be created. 230 */ 231 if (!isdesc_discarded(isp)) { 232 keep = 1; 233 break; 234 } 235 } 236 /* 237 * If no section of this name was kept, decrement 238 * the count and remove the name from .shstrtab. 239 */ 240 if (keep == 0) { 241 /* LINTED - only used for assert() */ 242 int err; 243 244 ofl->ofl_shdrcnt--; 245 err = st_delstring(ofl->ofl_shdrsttab, 246 osp->os_name); 247 assert(err != -1); 248 } 249 } 250 } 251 } 252 253 /* 254 * If -zignore has been in effect, scan all input files to determine if the 255 * file, or sections from the file, have been referenced. If not, the file or 256 * some of the files sections can be discarded. If sections are to be 257 * discarded, rescan the output relocations and the symbol table and remove 258 * the relocations and symbol entries that are no longer required. 259 * 260 * Note: It's possible that a section which is being discarded has contributed 261 * to the GOT table or the PLT table. However, we can't at this point 262 * eliminate the corresponding entries. This is because there could well 263 * be other sections referencing those same entries, but we don't have 264 * the infrastructure to determine this. So, keep the PLT and GOT 265 * entries in the table in case someone wants them. 266 * Note: The section to be affected needs to be allocatable. 267 * So even if -zignore is in effect, if the section is not allocatable, 268 * we do not eliminate it. 269 */ 270 static uintptr_t 271 ignore_section_processing(Ofl_desc *ofl) 272 { 273 Sg_desc *sgp; 274 Is_desc *isp; 275 Os_desc *osp; 276 Ifl_desc *ifl; 277 Rel_cachebuf *rcbp; 278 Rel_desc *rsp; 279 int allow_ldynsym = OFL_ALLOW_LDYNSYM(ofl); 280 Aliste idx1; 281 282 for (APLIST_TRAVERSE(ofl->ofl_objs, idx1, ifl)) { 283 uint_t num, discard; 284 285 /* 286 * Diagnose (-D unused) a completely unreferenced file. 287 */ 288 if ((ifl->ifl_flags & FLG_IF_FILEREF) == 0) 289 DBG_CALL(Dbg_unused_file(ofl->ofl_lml, 290 ifl->ifl_name, 0, 0)); 291 if (((ofl->ofl_flags1 & FLG_OF1_IGNPRC) == 0) || 292 ((ifl->ifl_flags & FLG_IF_IGNORE) == 0)) 293 continue; 294 295 /* 296 * Before scanning the whole symbol table to determine if 297 * symbols should be discard - quickly (relatively) scan the 298 * sections to determine if any are to be discarded. 299 */ 300 discard = 0; 301 if (ifl->ifl_flags & FLG_IF_FILEREF) { 302 for (num = 1; num < ifl->ifl_shnum; num++) { 303 if (((isp = ifl->ifl_isdesc[num]) != NULL) && 304 ((isp->is_flags & FLG_IS_SECTREF) == 0) && 305 ((osp = isp->is_osdesc) != NULL) && 306 ((sgp = osp->os_sgdesc) != NULL) && 307 (sgp->sg_phdr.p_type == PT_LOAD)) { 308 discard++; 309 break; 310 } 311 } 312 } 313 314 /* 315 * No sections are to be 'ignored' 316 */ 317 if ((discard == 0) && (ifl->ifl_flags & FLG_IF_FILEREF)) 318 continue; 319 320 /* 321 * We know that we have discarded sections. Scan the symbol 322 * table for this file to determine if symbols need to be 323 * discarded that are associated with the 'ignored' sections. 324 */ 325 for (num = 1; num < ifl->ifl_symscnt; num++) { 326 Sym_desc *sdp; 327 328 /* 329 * If the symbol definition has been resolved to another 330 * file, or the symbol has already been discarded or 331 * eliminated, skip it. 332 */ 333 sdp = ifl->ifl_oldndx[num]; 334 if ((sdp->sd_file != ifl) || 335 (sdp->sd_flags & 336 (FLG_SY_ISDISC | FLG_SY_INVALID | FLG_SY_ELIM))) 337 continue; 338 339 /* 340 * Complete the investigation of the symbol. 341 */ 342 ignore_sym(ofl, ifl, sdp, allow_ldynsym); 343 } 344 } 345 346 /* 347 * If we were only here to solicit debugging diagnostics, we're done. 348 */ 349 if ((ofl->ofl_flags1 & FLG_OF1_IGNPRC) == 0) 350 return (1); 351 352 /* 353 * Scan all output relocations searching for those against discarded or 354 * ignored sections. If one is found, decrement the total outrel count. 355 */ 356 REL_CACHE_TRAVERSE(&ofl->ofl_outrels, idx1, rcbp, rsp) { 357 Is_desc *isc = rsp->rel_isdesc; 358 uint_t flags, entsize; 359 Shdr *shdr; 360 361 if ((isc == NULL) || ((isc->is_flags & (FLG_IS_SECTREF))) || 362 ((ifl = isc->is_file) == NULL) || 363 ((ifl->ifl_flags & FLG_IF_IGNORE) == 0) || 364 ((shdr = isc->is_shdr) == NULL) || 365 ((shdr->sh_flags & SHF_ALLOC) == 0)) 366 continue; 367 368 flags = rsp->rel_flags; 369 370 if (flags & (FLG_REL_GOT | FLG_REL_BSS | 371 FLG_REL_NOINFO | FLG_REL_PLT)) 372 continue; 373 374 osp = RELAUX_GET_OSDESC(rsp); 375 376 if (rsp->rel_flags & FLG_REL_RELA) 377 entsize = sizeof (Rela); 378 else 379 entsize = sizeof (Rel); 380 381 assert(osp->os_szoutrels > 0); 382 osp->os_szoutrels -= entsize; 383 384 if (!(flags & FLG_REL_PLT)) 385 ofl->ofl_reloccntsub++; 386 387 if (rsp->rel_rtype == ld_targ.t_m.m_r_relative) 388 ofl->ofl_relocrelcnt--; 389 } 390 391 /* 392 * As a result of our work here, the number of output sections may 393 * have decreased. Trigger a call to adjust_os_count(). 394 */ 395 ofl->ofl_flags |= FLG_OF_ADJOSCNT; 396 397 return (1); 398 } 399 400 /* 401 * Allocate Elf_Data, Shdr, and Is_desc structures for a new 402 * section. 403 * 404 * entry: 405 * ofl - Output file descriptor 406 * shtype - SHT_ type code for section. 407 * shname - String giving the name for the new section. 408 * entcnt - # of items contained in the data part of the new section. 409 * This value is multiplied against the known element size 410 * for the section type to determine the size of the data 411 * area for the section. It is only meaningful in cases where 412 * the section type has a non-zero element size. In other cases, 413 * the caller must set the size fields in the *ret_data and 414 * *ret_shdr structs manually. 415 * ret_isec, ret_shdr, ret_data - Address of pointers to 416 * receive address of newly allocated structs. 417 * 418 * exit: 419 * On error, returns S_ERROR. On success, returns (1), and the 420 * ret_ pointers have been updated to point at the new structures, 421 * which have been filled in. To finish the task, the caller must 422 * update any fields within the supplied descriptors that differ 423 * from its needs, and then call ld_place_section(). 424 */ 425 static uintptr_t 426 new_section(Ofl_desc *ofl, Word shtype, const char *shname, Xword entcnt, 427 Is_desc **ret_isec, Shdr **ret_shdr, Elf_Data **ret_data) 428 { 429 typedef struct sec_info { 430 Word d_type; 431 Word align; /* Used in both data and section header */ 432 Word sh_flags; 433 Word sh_entsize; 434 } SEC_INFO_T; 435 436 const SEC_INFO_T *sec_info; 437 438 Shdr *shdr; 439 Elf_Data *data; 440 Is_desc *isec; 441 size_t size; 442 443 /* 444 * For each type of section, we have a distinct set of 445 * SEC_INFO_T values. This macro defines a static structure 446 * containing those values and generates code to set the sec_info 447 * pointer to refer to it. The pointer in sec_info remains valid 448 * outside of the declaration scope because the info_s struct is static. 449 * 450 * We can't determine the value of M_WORD_ALIGN at compile time, so 451 * a different variant is used for those cases. 452 */ 453 #define SET_SEC_INFO(d_type, d_align, sh_flags, sh_entsize) \ 454 { \ 455 static const SEC_INFO_T info_s = { d_type, d_align, sh_flags, \ 456 sh_entsize}; \ 457 sec_info = &info_s; \ 458 } 459 #define SET_SEC_INFO_WORD_ALIGN(d_type, sh_flags, sh_entsize) \ 460 { \ 461 static SEC_INFO_T info_s = { d_type, 0, sh_flags, \ 462 sh_entsize}; \ 463 info_s.align = ld_targ.t_m.m_word_align; \ 464 sec_info = &info_s; \ 465 } 466 467 switch (shtype) { 468 case SHT_PROGBITS: 469 /* 470 * SHT_PROGBITS sections contain are used for many 471 * different sections. Alignments and flags differ. 472 * Some have a standard entsize, and others don't. 473 * We set some defaults here, but there is no expectation 474 * that they are correct or complete for any specific 475 * purpose. The caller must provide the correct values. 476 */ 477 SET_SEC_INFO_WORD_ALIGN(ELF_T_BYTE, SHF_ALLOC, 0) 478 break; 479 480 case SHT_SYMTAB: 481 SET_SEC_INFO_WORD_ALIGN(ELF_T_SYM, 0, sizeof (Sym)) 482 break; 483 484 case SHT_DYNSYM: 485 SET_SEC_INFO_WORD_ALIGN(ELF_T_SYM, SHF_ALLOC, sizeof (Sym)) 486 break; 487 488 case SHT_SUNW_LDYNSYM: 489 ofl->ofl_flags |= FLG_OF_OSABI; 490 SET_SEC_INFO_WORD_ALIGN(ELF_T_SYM, SHF_ALLOC, sizeof (Sym)) 491 break; 492 493 case SHT_STRTAB: 494 /* 495 * A string table may or may not be allocable, depending 496 * on context, so we leave that flag unset and leave it to 497 * the caller to add it if necessary. 498 * 499 * String tables do not have a standard entsize, so 500 * we set it to 0. 501 */ 502 SET_SEC_INFO(ELF_T_BYTE, 1, SHF_STRINGS, 0) 503 break; 504 505 case SHT_RELA: 506 /* 507 * Relocations with an addend (Everything except 32-bit X86). 508 * The caller is expected to set all section header flags. 509 */ 510 SET_SEC_INFO_WORD_ALIGN(ELF_T_RELA, 0, sizeof (Rela)) 511 break; 512 513 case SHT_REL: 514 /* 515 * Relocations without an addend (32-bit X86 only). 516 * The caller is expected to set all section header flags. 517 */ 518 SET_SEC_INFO_WORD_ALIGN(ELF_T_REL, 0, sizeof (Rel)) 519 break; 520 521 case SHT_HASH: 522 SET_SEC_INFO_WORD_ALIGN(ELF_T_WORD, SHF_ALLOC, sizeof (Word)) 523 break; 524 525 case SHT_SUNW_symsort: 526 case SHT_SUNW_tlssort: 527 ofl->ofl_flags |= FLG_OF_OSABI; 528 SET_SEC_INFO_WORD_ALIGN(ELF_T_WORD, SHF_ALLOC, sizeof (Word)) 529 break; 530 531 case SHT_DYNAMIC: 532 /* 533 * A dynamic section may or may not be allocable, and may or 534 * may not be writable, depending on context, so we leave the 535 * flags unset and leave it to the caller to add them if 536 * necessary. 537 */ 538 SET_SEC_INFO_WORD_ALIGN(ELF_T_DYN, 0, sizeof (Dyn)) 539 break; 540 541 case SHT_NOBITS: 542 /* 543 * SHT_NOBITS is used for BSS-type sections. The size and 544 * alignment depend on the specific use and must be adjusted 545 * by the caller. 546 */ 547 SET_SEC_INFO(ELF_T_BYTE, 0, SHF_ALLOC | SHF_WRITE, 0) 548 break; 549 550 case SHT_INIT_ARRAY: 551 case SHT_FINI_ARRAY: 552 case SHT_PREINIT_ARRAY: 553 SET_SEC_INFO(ELF_T_ADDR, sizeof (Addr), SHF_ALLOC | SHF_WRITE, 554 sizeof (Addr)) 555 break; 556 557 case SHT_SYMTAB_SHNDX: 558 /* 559 * Note that these sections are created to be associated 560 * with both symtab and dynsym symbol tables. However, they 561 * are non-allocable in all cases, because the runtime 562 * linker has no need for this information. It is purely 563 * informational, used by elfdump(1), debuggers, etc. 564 */ 565 SET_SEC_INFO_WORD_ALIGN(ELF_T_WORD, 0, sizeof (Word)); 566 break; 567 568 case SHT_SUNW_cap: 569 ofl->ofl_flags |= FLG_OF_OSABI; 570 SET_SEC_INFO_WORD_ALIGN(ELF_T_CAP, SHF_ALLOC, sizeof (Cap)); 571 break; 572 573 case SHT_SUNW_capchain: 574 ofl->ofl_flags |= FLG_OF_OSABI; 575 SET_SEC_INFO_WORD_ALIGN(ELF_T_WORD, SHF_ALLOC, 576 sizeof (Capchain)); 577 break; 578 579 case SHT_SUNW_capinfo: 580 ofl->ofl_flags |= FLG_OF_OSABI; 581 #if _ELF64 582 SET_SEC_INFO(ELF_T_XWORD, sizeof (Xword), SHF_ALLOC, 583 sizeof (Capinfo)); 584 #else 585 SET_SEC_INFO(ELF_T_WORD, sizeof (Word), SHF_ALLOC, 586 sizeof (Capinfo)); 587 #endif 588 break; 589 590 case SHT_SUNW_move: 591 ofl->ofl_flags |= FLG_OF_OSABI; 592 SET_SEC_INFO(ELF_T_BYTE, sizeof (Lword), 593 SHF_ALLOC | SHF_WRITE, sizeof (Move)); 594 break; 595 596 case SHT_SUNW_syminfo: 597 ofl->ofl_flags |= FLG_OF_OSABI; 598 /* 599 * The sh_info field of the SHT_*_syminfo section points 600 * to the header index of the associated .dynamic section, 601 * so we also set SHF_INFO_LINK. 602 */ 603 SET_SEC_INFO_WORD_ALIGN(ELF_T_BYTE, 604 SHF_ALLOC | SHF_INFO_LINK, sizeof (Syminfo)); 605 break; 606 607 case SHT_SUNW_verneed: 608 case SHT_SUNW_verdef: 609 ofl->ofl_flags |= FLG_OF_OSABI; 610 /* 611 * The info for verneed and versym happen to be the same. 612 * The entries in these sections are not of uniform size, 613 * so we set the entsize to 0. 614 */ 615 SET_SEC_INFO_WORD_ALIGN(ELF_T_BYTE, SHF_ALLOC, 0); 616 break; 617 618 case SHT_SUNW_versym: 619 ofl->ofl_flags |= FLG_OF_OSABI; 620 SET_SEC_INFO_WORD_ALIGN(ELF_T_BYTE, SHF_ALLOC, 621 sizeof (Versym)); 622 break; 623 624 default: 625 /* Should not happen: fcn called with unknown section type */ 626 assert(0); 627 return (S_ERROR); 628 } 629 #undef SET_SEC_INFO 630 #undef SET_SEC_INFO_WORD_ALIGN 631 632 size = entcnt * sec_info->sh_entsize; 633 634 /* 635 * Allocate and initialize the Elf_Data structure. 636 */ 637 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == NULL) 638 return (S_ERROR); 639 data->d_type = sec_info->d_type; 640 data->d_size = size; 641 data->d_align = sec_info->align; 642 data->d_version = ofl->ofl_dehdr->e_version; 643 644 /* 645 * Allocate and initialize the Shdr structure. 646 */ 647 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == NULL) 648 return (S_ERROR); 649 shdr->sh_type = shtype; 650 shdr->sh_size = size; 651 shdr->sh_flags = sec_info->sh_flags; 652 shdr->sh_addralign = sec_info->align; 653 shdr->sh_entsize = sec_info->sh_entsize; 654 655 /* 656 * Allocate and initialize the Is_desc structure. 657 */ 658 if ((isec = libld_calloc(1, sizeof (Is_desc))) == NULL) 659 return (S_ERROR); 660 isec->is_name = shname; 661 isec->is_shdr = shdr; 662 isec->is_indata = data; 663 664 665 *ret_isec = isec; 666 *ret_shdr = shdr; 667 *ret_data = data; 668 return (1); 669 } 670 671 /* 672 * Use an existing input section as a template to create a new 673 * input section with the same values as the original, other than 674 * the size of the data area which is supplied by the caller. 675 * 676 * entry: 677 * ofl - Output file descriptor 678 * ifl - Input file section to use as a template 679 * size - Size of data area for new section 680 * ret_isec, ret_shdr, ret_data - Address of pointers to 681 * receive address of newly allocated structs. 682 * 683 * exit: 684 * On error, returns S_ERROR. On success, returns (1), and the 685 * ret_ pointers have been updated to point at the new structures, 686 * which have been filled in. To finish the task, the caller must 687 * update any fields within the supplied descriptors that differ 688 * from its needs, and then call ld_place_section(). 689 */ 690 static uintptr_t 691 new_section_from_template(Ofl_desc *ofl, Is_desc *tmpl_isp, size_t size, 692 Is_desc **ret_isec, Shdr **ret_shdr, Elf_Data **ret_data) 693 { 694 Shdr *shdr; 695 Elf_Data *data; 696 Is_desc *isec; 697 698 /* 699 * Allocate and initialize the Elf_Data structure. 700 */ 701 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == NULL) 702 return (S_ERROR); 703 data->d_type = tmpl_isp->is_indata->d_type; 704 data->d_size = size; 705 data->d_align = tmpl_isp->is_shdr->sh_addralign; 706 data->d_version = ofl->ofl_dehdr->e_version; 707 708 /* 709 * Allocate and initialize the Shdr structure. 710 */ 711 if ((shdr = libld_malloc(sizeof (Shdr))) == NULL) 712 return (S_ERROR); 713 *shdr = *tmpl_isp->is_shdr; 714 shdr->sh_addr = 0; 715 shdr->sh_offset = 0; 716 shdr->sh_size = size; 717 718 /* 719 * Allocate and initialize the Is_desc structure. 720 */ 721 if ((isec = libld_calloc(1, sizeof (Is_desc))) == NULL) 722 return (S_ERROR); 723 isec->is_name = tmpl_isp->is_name; 724 isec->is_shdr = shdr; 725 isec->is_indata = data; 726 727 728 *ret_isec = isec; 729 *ret_shdr = shdr; 730 *ret_data = data; 731 return (1); 732 } 733 734 /* 735 * Build a .bss section for allocation of tentative definitions. Any `static' 736 * .bss definitions would have been associated to their own .bss sections and 737 * thus collected from the input files. `global' .bss definitions are tagged 738 * as COMMON and do not cause any associated .bss section elements to be 739 * generated. Here we add up all these COMMON symbols and generate the .bss 740 * section required to represent them. 741 */ 742 uintptr_t 743 ld_make_bss(Ofl_desc *ofl, Xword size, Xword align, uint_t ident) 744 { 745 Shdr *shdr; 746 Elf_Data *data; 747 Is_desc *isec; 748 Os_desc *osp; 749 Xword rsize = (Xword)ofl->ofl_relocbsssz; 750 751 /* 752 * Allocate header structs. We will set the name ourselves below, 753 * and there is no entcnt for a BSS. So, the shname and entcnt 754 * arguments are 0. 755 */ 756 if (new_section(ofl, SHT_NOBITS, NULL, 0, 757 &isec, &shdr, &data) == S_ERROR) 758 return (S_ERROR); 759 760 data->d_size = (size_t)size; 761 data->d_align = (size_t)align; 762 763 shdr->sh_size = size; 764 shdr->sh_addralign = align; 765 766 if (ident == ld_targ.t_id.id_tlsbss) { 767 isec->is_name = MSG_ORIG(MSG_SCN_TBSS); 768 ofl->ofl_istlsbss = isec; 769 shdr->sh_flags |= SHF_TLS; 770 771 } else if (ident == ld_targ.t_id.id_bss) { 772 isec->is_name = MSG_ORIG(MSG_SCN_BSS); 773 ofl->ofl_isbss = isec; 774 775 #if defined(_ELF64) 776 } else if ((ld_targ.t_m.m_mach == EM_AMD64) && 777 (ident == ld_targ.t_id.id_lbss)) { 778 isec->is_name = MSG_ORIG(MSG_SCN_LBSS); 779 ofl->ofl_islbss = isec; 780 shdr->sh_flags |= SHF_AMD64_LARGE; 781 #endif 782 } 783 784 /* 785 * Retain this .*bss input section as this will be where global symbol 786 * references are added. 787 */ 788 if ((osp = ld_place_section(ofl, isec, NULL, ident, NULL)) == 789 (Os_desc *)S_ERROR) 790 return (S_ERROR); 791 792 /* 793 * If relocations exist against a .*bss section, a section symbol must 794 * be created for the section in the .dynsym symbol table. 795 */ 796 if (!(osp->os_flags & FLG_OS_OUTREL)) { 797 ofl_flag_t flagtotest; 798 799 if (ident == ld_targ.t_id.id_tlsbss) 800 flagtotest = FLG_OF1_TLSOREL; 801 else 802 flagtotest = FLG_OF1_BSSOREL; 803 804 if (ofl->ofl_flags1 & flagtotest) { 805 ofl->ofl_dynshdrcnt++; 806 osp->os_flags |= FLG_OS_OUTREL; 807 } 808 } 809 810 osp->os_szoutrels = rsize; 811 return (1); 812 } 813 814 /* 815 * Build a SHT_{INIT|FINI|PREINIT}ARRAY section (specified via 816 * ld -z *array=name). 817 */ 818 static uintptr_t 819 make_array(Ofl_desc *ofl, Word shtype, const char *sectname, APlist *alp) 820 { 821 uint_t entcount; 822 Aliste idx; 823 Elf_Data *data; 824 Is_desc *isec; 825 Shdr *shdr; 826 Sym_desc *sdp; 827 Rel_desc reld; 828 Rela reloc; 829 Os_desc *osp; 830 uintptr_t ret = 1; 831 832 if (alp == NULL) 833 return (1); 834 835 entcount = 0; 836 for (APLIST_TRAVERSE(alp, idx, sdp)) 837 entcount++; 838 839 if (new_section(ofl, shtype, sectname, entcount, &isec, &shdr, &data) == 840 S_ERROR) 841 return (S_ERROR); 842 843 if ((data->d_buf = libld_calloc(sizeof (Addr), entcount)) == NULL) 844 return (S_ERROR); 845 846 if (ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_array, NULL) == 847 (Os_desc *)S_ERROR) 848 return (S_ERROR); 849 850 osp = isec->is_osdesc; 851 852 if ((ofl->ofl_osinitarray == NULL) && (shtype == SHT_INIT_ARRAY)) 853 ofl->ofl_osinitarray = osp; 854 if ((ofl->ofl_ospreinitarray == NULL) && (shtype == SHT_PREINIT_ARRAY)) 855 ofl->ofl_ospreinitarray = osp; 856 else if ((ofl->ofl_osfiniarray == NULL) && (shtype == SHT_FINI_ARRAY)) 857 ofl->ofl_osfiniarray = osp; 858 859 /* 860 * Create relocations against this section to initialize it to the 861 * function addresses. 862 */ 863 reld.rel_isdesc = isec; 864 reld.rel_aux = NULL; 865 reld.rel_flags = FLG_REL_LOAD; 866 867 /* 868 * Fabricate the relocation information (as if a relocation record had 869 * been input - see init_rel()). 870 */ 871 reld.rel_rtype = ld_targ.t_m.m_r_arrayaddr; 872 reld.rel_roffset = 0; 873 reld.rel_raddend = 0; 874 875 /* 876 * Create a minimal relocation record to satisfy process_sym_reloc() 877 * debugging requirements. 878 */ 879 reloc.r_offset = 0; 880 reloc.r_info = ELF_R_INFO(0, ld_targ.t_m.m_r_arrayaddr); 881 reloc.r_addend = 0; 882 883 DBG_CALL(Dbg_reloc_generate(ofl->ofl_lml, osp, 884 ld_targ.t_m.m_rel_sht_type)); 885 for (APLIST_TRAVERSE(alp, idx, sdp)) { 886 reld.rel_sym = sdp; 887 888 if (ld_process_sym_reloc(ofl, &reld, (Rel *)&reloc, isec, 889 MSG_INTL(MSG_STR_COMMAND), 0) == S_ERROR) { 890 ret = S_ERROR; 891 continue; 892 } 893 894 reld.rel_roffset += (Xword)sizeof (Addr); 895 reloc.r_offset = reld.rel_roffset; 896 } 897 898 return (ret); 899 } 900 901 /* 902 * Build a comment section (-Qy option). 903 */ 904 static uintptr_t 905 make_comment(Ofl_desc *ofl) 906 { 907 Shdr *shdr; 908 Elf_Data *data; 909 Is_desc *isec; 910 911 if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_COMMENT), 0, 912 &isec, &shdr, &data) == S_ERROR) 913 return (S_ERROR); 914 915 data->d_buf = (void *)ofl->ofl_sgsid; 916 data->d_size = strlen(ofl->ofl_sgsid) + 1; 917 data->d_align = 1; 918 919 shdr->sh_size = (Xword)data->d_size; 920 shdr->sh_flags = 0; 921 shdr->sh_addralign = 1; 922 923 return ((uintptr_t)ld_place_section(ofl, isec, NULL, 924 ld_targ.t_id.id_note, NULL)); 925 } 926 927 /* 928 * Make the dynamic section. Calculate the size of any strings referenced 929 * within this structure, they will be added to the global string table 930 * (.dynstr). This routine should be called before make_dynstr(). 931 * 932 * This routine must be maintained in parallel with update_odynamic() 933 * in update.c 934 */ 935 static uintptr_t 936 make_dynamic(Ofl_desc *ofl) 937 { 938 Shdr *shdr; 939 Os_desc *osp; 940 Elf_Data *data; 941 Is_desc *isec; 942 size_t cnt = 0; 943 Aliste idx; 944 Ifl_desc *ifl; 945 Sym_desc *sdp; 946 size_t size; 947 Str_tbl *strtbl; 948 ofl_flag_t flags = ofl->ofl_flags; 949 int not_relobj = !(flags & FLG_OF_RELOBJ); 950 int unused = 0; 951 952 /* 953 * Select the required string table. 954 */ 955 if (OFL_IS_STATIC_OBJ(ofl)) 956 strtbl = ofl->ofl_strtab; 957 else 958 strtbl = ofl->ofl_dynstrtab; 959 960 /* 961 * Only a limited subset of DT_ entries apply to relocatable 962 * objects. See the comment at the head of update_odynamic() in 963 * update.c for details. 964 */ 965 if (new_section(ofl, SHT_DYNAMIC, MSG_ORIG(MSG_SCN_DYNAMIC), 0, 966 &isec, &shdr, &data) == S_ERROR) 967 return (S_ERROR); 968 969 /* 970 * new_section() does not set SHF_ALLOC. If we're building anything 971 * besides a relocatable object, then the .dynamic section should 972 * reside in allocatable memory. 973 */ 974 if (not_relobj) 975 shdr->sh_flags |= SHF_ALLOC; 976 977 /* 978 * new_section() does not set SHF_WRITE. If we're building an object 979 * that specifies an interpretor, then a DT_DEBUG entry is created, 980 * which is initialized to the applications link-map list at runtime. 981 */ 982 if (ofl->ofl_osinterp) 983 shdr->sh_flags |= SHF_WRITE; 984 985 osp = ofl->ofl_osdynamic = 986 ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_dynamic, NULL); 987 988 /* 989 * Reserve entries for any needed dependencies. 990 */ 991 for (APLIST_TRAVERSE(ofl->ofl_sos, idx, ifl)) { 992 if (!(ifl->ifl_flags & (FLG_IF_NEEDED | FLG_IF_NEEDSTR))) 993 continue; 994 995 /* 996 * If this dependency didn't satisfy any symbol references, 997 * generate a debugging diagnostic (ld(1) -Dunused can be used 998 * to display these). If this is a standard needed dependency, 999 * and -z ignore is in effect, drop the dependency. Explicitly 1000 * defined dependencies (i.e., -N dep) don't get dropped, and 1001 * are flagged as being required to simplify update_odynamic() 1002 * processing. 1003 */ 1004 if ((ifl->ifl_flags & FLG_IF_NEEDSTR) || 1005 ((ifl->ifl_flags & FLG_IF_DEPREQD) == 0)) { 1006 if (unused++ == 0) 1007 DBG_CALL(Dbg_util_nl(ofl->ofl_lml, DBG_NL_STD)); 1008 DBG_CALL(Dbg_unused_file(ofl->ofl_lml, ifl->ifl_soname, 1009 (ifl->ifl_flags & FLG_IF_NEEDSTR), 0)); 1010 1011 /* 1012 * Guidance: Remove unused dependency. 1013 * 1014 * If -z ignore is in effect, this warning is not 1015 * needed because we will quietly remove the unused 1016 * dependency. 1017 */ 1018 if (OFL_GUIDANCE(ofl, FLG_OFG_NO_UNUSED) && 1019 ((ifl->ifl_flags & FLG_IF_IGNORE) == 0)) 1020 ld_eprintf(ofl, ERR_GUIDANCE, 1021 MSG_INTL(MSG_GUIDE_UNUSED), 1022 ifl->ifl_soname); 1023 1024 if (ifl->ifl_flags & FLG_IF_NEEDSTR) 1025 ifl->ifl_flags |= FLG_IF_DEPREQD; 1026 else if (ifl->ifl_flags & FLG_IF_IGNORE) 1027 continue; 1028 } 1029 1030 /* 1031 * If this object requires a DT_POSFLAG_1 entry, reserve it. 1032 */ 1033 if ((ifl->ifl_flags & MSK_IF_POSFLAG1) && not_relobj) 1034 cnt++; 1035 1036 if (st_insert(strtbl, ifl->ifl_soname) == -1) 1037 return (S_ERROR); 1038 cnt++; 1039 1040 /* 1041 * If the needed entry contains the $ORIGIN token make sure 1042 * the associated DT_1_FLAGS entry is created. 1043 */ 1044 if (strstr(ifl->ifl_soname, MSG_ORIG(MSG_STR_ORIGIN))) { 1045 ofl->ofl_dtflags_1 |= DF_1_ORIGIN; 1046 ofl->ofl_dtflags |= DF_ORIGIN; 1047 } 1048 } 1049 1050 if (unused) 1051 DBG_CALL(Dbg_util_nl(ofl->ofl_lml, DBG_NL_STD)); 1052 1053 if (not_relobj) { 1054 /* 1055 * Reserve entries for any per-symbol auxiliary/filter strings. 1056 */ 1057 cnt += alist_nitems(ofl->ofl_dtsfltrs); 1058 1059 /* 1060 * Reserve entries for _init() and _fini() section addresses. 1061 */ 1062 if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_INIT_U), 1063 SYM_NOHASH, NULL, ofl)) != NULL) && 1064 (sdp->sd_ref == REF_REL_NEED) && 1065 (sdp->sd_sym->st_shndx != SHN_UNDEF)) { 1066 sdp->sd_flags |= FLG_SY_UPREQD; 1067 cnt++; 1068 } 1069 if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_FINI_U), 1070 SYM_NOHASH, NULL, ofl)) != NULL) && 1071 (sdp->sd_ref == REF_REL_NEED) && 1072 (sdp->sd_sym->st_shndx != SHN_UNDEF)) { 1073 sdp->sd_flags |= FLG_SY_UPREQD; 1074 cnt++; 1075 } 1076 1077 /* 1078 * Reserve entries for any soname, filter name (shared libs 1079 * only), run-path pointers, cache names and audit requirements. 1080 */ 1081 if (ofl->ofl_soname) { 1082 cnt++; 1083 if (st_insert(strtbl, ofl->ofl_soname) == -1) 1084 return (S_ERROR); 1085 } 1086 if (ofl->ofl_filtees) { 1087 cnt++; 1088 if (st_insert(strtbl, ofl->ofl_filtees) == -1) 1089 return (S_ERROR); 1090 1091 /* 1092 * If the filtees entry contains the $ORIGIN token 1093 * make sure the associated DT_1_FLAGS entry is created. 1094 */ 1095 if (strstr(ofl->ofl_filtees, 1096 MSG_ORIG(MSG_STR_ORIGIN))) { 1097 ofl->ofl_dtflags_1 |= DF_1_ORIGIN; 1098 ofl->ofl_dtflags |= DF_ORIGIN; 1099 } 1100 } 1101 } 1102 1103 if (ofl->ofl_rpath) { 1104 cnt += 2; /* DT_RPATH & DT_RUNPATH */ 1105 if (st_insert(strtbl, ofl->ofl_rpath) == -1) 1106 return (S_ERROR); 1107 1108 /* 1109 * If the rpath entry contains the $ORIGIN token make sure 1110 * the associated DT_1_FLAGS entry is created. 1111 */ 1112 if (strstr(ofl->ofl_rpath, MSG_ORIG(MSG_STR_ORIGIN))) { 1113 ofl->ofl_dtflags_1 |= DF_1_ORIGIN; 1114 ofl->ofl_dtflags |= DF_ORIGIN; 1115 } 1116 } 1117 1118 if (not_relobj) { 1119 Aliste idx; 1120 Sg_desc *sgp; 1121 1122 if (ofl->ofl_config) { 1123 cnt++; 1124 if (st_insert(strtbl, ofl->ofl_config) == -1) 1125 return (S_ERROR); 1126 1127 /* 1128 * If the config entry contains the $ORIGIN token 1129 * make sure the associated DT_1_FLAGS entry is created. 1130 */ 1131 if (strstr(ofl->ofl_config, MSG_ORIG(MSG_STR_ORIGIN))) { 1132 ofl->ofl_dtflags_1 |= DF_1_ORIGIN; 1133 ofl->ofl_dtflags |= DF_ORIGIN; 1134 } 1135 } 1136 if (ofl->ofl_depaudit) { 1137 cnt++; 1138 if (st_insert(strtbl, ofl->ofl_depaudit) == -1) 1139 return (S_ERROR); 1140 } 1141 if (ofl->ofl_audit) { 1142 cnt++; 1143 if (st_insert(strtbl, ofl->ofl_audit) == -1) 1144 return (S_ERROR); 1145 } 1146 1147 /* 1148 * Reserve entries for the DT_HASH, DT_STRTAB, DT_STRSZ, 1149 * DT_SYMTAB, DT_SYMENT, and DT_CHECKSUM. 1150 */ 1151 cnt += 6; 1152 1153 /* 1154 * If we are including local functions at the head of 1155 * the dynsym, then also reserve entries for DT_SUNW_SYMTAB 1156 * and DT_SUNW_SYMSZ. 1157 */ 1158 if (OFL_ALLOW_LDYNSYM(ofl)) 1159 cnt += 2; 1160 1161 if ((ofl->ofl_dynsymsortcnt > 0) || 1162 (ofl->ofl_dyntlssortcnt > 0)) 1163 cnt++; /* DT_SUNW_SORTENT */ 1164 1165 if (ofl->ofl_dynsymsortcnt > 0) 1166 cnt += 2; /* DT_SUNW_[SYMSORT|SYMSORTSZ] */ 1167 1168 if (ofl->ofl_dyntlssortcnt > 0) 1169 cnt += 2; /* DT_SUNW_[TLSSORT|TLSSORTSZ] */ 1170 1171 if ((flags & (FLG_OF_VERDEF | FLG_OF_NOVERSEC)) == 1172 FLG_OF_VERDEF) 1173 cnt += 2; /* DT_VERDEF & DT_VERDEFNUM */ 1174 1175 if ((flags & (FLG_OF_VERNEED | FLG_OF_NOVERSEC)) == 1176 FLG_OF_VERNEED) 1177 cnt += 2; /* DT_VERNEED & DT_VERNEEDNUM */ 1178 1179 if ((flags & FLG_OF_COMREL) && ofl->ofl_relocrelcnt) 1180 cnt++; /* DT_RELACOUNT */ 1181 1182 if (flags & FLG_OF_TEXTREL) /* DT_TEXTREL */ 1183 cnt++; 1184 1185 if (ofl->ofl_osfiniarray) /* DT_FINI_ARRAY */ 1186 cnt += 2; /* DT_FINI_ARRAYSZ */ 1187 1188 if (ofl->ofl_osinitarray) /* DT_INIT_ARRAY */ 1189 cnt += 2; /* DT_INIT_ARRAYSZ */ 1190 1191 if (ofl->ofl_ospreinitarray) /* DT_PREINIT_ARRAY & */ 1192 cnt += 2; /* DT_PREINIT_ARRAYSZ */ 1193 1194 /* 1195 * If we have plt's reserve a DT_PLTRELSZ, DT_PLTREL and 1196 * DT_JMPREL. 1197 */ 1198 if (ofl->ofl_pltcnt) 1199 cnt += 3; 1200 1201 /* 1202 * If plt padding is needed (Sparcv9). 1203 */ 1204 if (ofl->ofl_pltpad) 1205 cnt += 2; /* DT_PLTPAD & DT_PLTPADSZ */ 1206 1207 /* 1208 * If we have any relocations reserve a DT_REL, DT_RELSZ and 1209 * DT_RELENT entry. 1210 */ 1211 if (ofl->ofl_relocsz) 1212 cnt += 3; 1213 1214 /* 1215 * If a syminfo section is required create DT_SYMINFO, 1216 * DT_SYMINSZ, and DT_SYMINENT entries. 1217 */ 1218 if (flags & FLG_OF_SYMINFO) 1219 cnt += 3; 1220 1221 /* 1222 * If there are any partially initialized sections allocate 1223 * DT_MOVETAB, DT_MOVESZ and DT_MOVEENT. 1224 */ 1225 if (ofl->ofl_osmove) 1226 cnt += 3; 1227 1228 /* 1229 * Allocate one DT_REGISTER entry for every register symbol. 1230 */ 1231 cnt += ofl->ofl_regsymcnt; 1232 1233 /* 1234 * Reserve a entry for each '-zrtldinfo=...' specified 1235 * on the command line. 1236 */ 1237 for (APLIST_TRAVERSE(ofl->ofl_rtldinfo, idx, sdp)) 1238 cnt++; 1239 1240 /* 1241 * The following entry should only be placed in a segment that 1242 * is writable. 1243 */ 1244 if (((sgp = osp->os_sgdesc) != NULL) && 1245 (sgp->sg_phdr.p_flags & PF_W) && ofl->ofl_osinterp) 1246 cnt++; /* DT_DEBUG */ 1247 1248 /* 1249 * Capabilities require a .dynamic entry for the .SUNW_cap 1250 * section. 1251 */ 1252 if (ofl->ofl_oscap) 1253 cnt++; /* DT_SUNW_CAP */ 1254 1255 /* 1256 * Symbol capabilities require a .dynamic entry for the 1257 * .SUNW_capinfo section. 1258 */ 1259 if (ofl->ofl_oscapinfo) 1260 cnt++; /* DT_SUNW_CAPINFO */ 1261 1262 /* 1263 * Capabilities chain information requires a .SUNW_capchain 1264 * entry (DT_SUNW_CAPCHAIN), entry size (DT_SUNW_CAPCHAINENT), 1265 * and total size (DT_SUNW_CAPCHAINSZ). 1266 */ 1267 if (ofl->ofl_oscapchain) 1268 cnt += 3; 1269 1270 if (flags & FLG_OF_SYMBOLIC) 1271 cnt++; /* DT_SYMBOLIC */ 1272 1273 if (ofl->ofl_aslr != 0) /* DT_SUNW_ASLR */ 1274 cnt++; 1275 } 1276 1277 /* 1278 * Account for Architecture dependent .dynamic entries, and defaults. 1279 */ 1280 (*ld_targ.t_mr.mr_mach_make_dynamic)(ofl, &cnt); 1281 1282 /* 1283 * DT_FLAGS, DT_FLAGS_1, DT_SUNW_STRPAD, and DT_NULL. Also, 1284 * allow room for the unused extra DT_NULLs. These are included 1285 * to allow an ELF editor room to add items later. 1286 */ 1287 cnt += 4 + DYNAMIC_EXTRA_ELTS; 1288 1289 /* 1290 * DT_SUNW_LDMACH. Used to hold the ELF machine code of the 1291 * linker that produced the output object. This information 1292 * allows us to determine whether a given object was linked 1293 * natively, or by a linker running on a different type of 1294 * system. This information can be valuable if one suspects 1295 * that a problem might be due to alignment or byte order issues. 1296 */ 1297 cnt++; 1298 1299 /* 1300 * Determine the size of the section from the number of entries. 1301 */ 1302 size = cnt * (size_t)shdr->sh_entsize; 1303 1304 shdr->sh_size = (Xword)size; 1305 data->d_size = size; 1306 1307 /* 1308 * There are several tags that are specific to the Solaris osabi 1309 * range which we unconditionally put into any dynamic section 1310 * we create (e.g. DT_SUNW_STRPAD or DT_SUNW_LDMACH). As such, 1311 * any Solaris object with a dynamic section should be tagged as 1312 * ELFOSABI_SOLARIS. 1313 */ 1314 ofl->ofl_flags |= FLG_OF_OSABI; 1315 1316 return ((uintptr_t)ofl->ofl_osdynamic); 1317 } 1318 1319 /* 1320 * Build the GOT section and its associated relocation entries. 1321 */ 1322 uintptr_t 1323 ld_make_got(Ofl_desc *ofl) 1324 { 1325 Elf_Data *data; 1326 Shdr *shdr; 1327 Is_desc *isec; 1328 size_t size = (size_t)ofl->ofl_gotcnt * ld_targ.t_m.m_got_entsize; 1329 size_t rsize = (size_t)ofl->ofl_relocgotsz; 1330 1331 if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_GOT), 0, 1332 &isec, &shdr, &data) == S_ERROR) 1333 return (S_ERROR); 1334 1335 data->d_size = size; 1336 1337 shdr->sh_flags |= SHF_WRITE; 1338 shdr->sh_size = (Xword)size; 1339 shdr->sh_entsize = ld_targ.t_m.m_got_entsize; 1340 1341 ofl->ofl_osgot = ld_place_section(ofl, isec, NULL, 1342 ld_targ.t_id.id_got, NULL); 1343 if (ofl->ofl_osgot == (Os_desc *)S_ERROR) 1344 return (S_ERROR); 1345 1346 ofl->ofl_osgot->os_szoutrels = (Xword)rsize; 1347 1348 return (1); 1349 } 1350 1351 /* 1352 * Build an interpreter section. 1353 */ 1354 static uintptr_t 1355 make_interp(Ofl_desc *ofl) 1356 { 1357 Shdr *shdr; 1358 Elf_Data *data; 1359 Is_desc *isec; 1360 const char *iname = ofl->ofl_interp; 1361 size_t size; 1362 1363 /* 1364 * If -z nointerp is in effect, don't create an interpreter section. 1365 */ 1366 if (ofl->ofl_flags1 & FLG_OF1_NOINTRP) 1367 return (1); 1368 1369 /* 1370 * An .interp section is always created for a dynamic executable. 1371 * A user can define the interpreter to use. This definition overrides 1372 * the default that would be recorded in an executable, and triggers 1373 * the creation of an .interp section in any other object. Presumably 1374 * the user knows what they are doing. Refer to the generic ELF ABI 1375 * section 5-4, and the ld(1) -I option. 1376 */ 1377 if (((ofl->ofl_flags & (FLG_OF_DYNAMIC | FLG_OF_EXEC | 1378 FLG_OF_RELOBJ)) != (FLG_OF_DYNAMIC | FLG_OF_EXEC)) && !iname) 1379 return (1); 1380 1381 /* 1382 * In the case of a dynamic executable, supply a default interpreter 1383 * if the user has not specified their own. 1384 */ 1385 if (iname == NULL) 1386 iname = ofl->ofl_interp = ld_targ.t_m.m_def_interp; 1387 1388 size = strlen(iname) + 1; 1389 1390 if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_INTERP), 0, 1391 &isec, &shdr, &data) == S_ERROR) 1392 return (S_ERROR); 1393 1394 data->d_size = size; 1395 shdr->sh_size = (Xword)size; 1396 data->d_align = shdr->sh_addralign = 1; 1397 1398 ofl->ofl_osinterp = 1399 ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_interp, NULL); 1400 return ((uintptr_t)ofl->ofl_osinterp); 1401 } 1402 1403 /* 1404 * Common function used to build the SHT_SUNW_versym section, SHT_SUNW_syminfo 1405 * section, and SHT_SUNW_capinfo section. Each of these sections provide 1406 * additional symbol information, and their size parallels the associated 1407 * symbol table. 1408 */ 1409 static Os_desc * 1410 make_sym_sec(Ofl_desc *ofl, const char *sectname, Word stype, int ident) 1411 { 1412 Shdr *shdr; 1413 Elf_Data *data; 1414 Is_desc *isec; 1415 1416 /* 1417 * We don't know the size of this section yet, so set it to 0. The 1418 * size gets filled in after the associated symbol table is sized. 1419 */ 1420 if (new_section(ofl, stype, sectname, 0, &isec, &shdr, &data) == 1421 S_ERROR) 1422 return ((Os_desc *)S_ERROR); 1423 1424 return (ld_place_section(ofl, isec, NULL, ident, NULL)); 1425 } 1426 1427 /* 1428 * Determine whether a symbol capability is redundant because the object 1429 * capabilities are more restrictive. 1430 */ 1431 inline static int 1432 is_cap_redundant(Objcapset *ocapset, Objcapset *scapset) 1433 { 1434 Alist *oalp, *salp; 1435 elfcap_mask_t omsk, smsk; 1436 1437 /* 1438 * Inspect any platform capabilities. If the object defines platform 1439 * capabilities, then the object will only be loaded for those 1440 * platforms. A symbol capability set that doesn't define the same 1441 * platforms is redundant, and a symbol capability that does not provide 1442 * at least one platform name that matches a platform name in the object 1443 * capabilities will never execute (as the object wouldn't have been 1444 * loaded). 1445 */ 1446 oalp = ocapset->oc_plat.cl_val; 1447 salp = scapset->oc_plat.cl_val; 1448 if (oalp && ((salp == NULL) || cap_names_match(oalp, salp))) 1449 return (1); 1450 1451 /* 1452 * If the symbol capability set defines platforms, and the object 1453 * doesn't, then the symbol set is more restrictive. 1454 */ 1455 if (salp && (oalp == NULL)) 1456 return (0); 1457 1458 /* 1459 * Next, inspect any machine name capabilities. If the object defines 1460 * machine name capabilities, then the object will only be loaded for 1461 * those machines. A symbol capability set that doesn't define the same 1462 * machine names is redundant, and a symbol capability that does not 1463 * provide at least one machine name that matches a machine name in the 1464 * object capabilities will never execute (as the object wouldn't have 1465 * been loaded). 1466 */ 1467 oalp = ocapset->oc_plat.cl_val; 1468 salp = scapset->oc_plat.cl_val; 1469 if (oalp && ((salp == NULL) || cap_names_match(oalp, salp))) 1470 return (1); 1471 1472 /* 1473 * If the symbol capability set defines machine names, and the object 1474 * doesn't, then the symbol set is more restrictive. 1475 */ 1476 if (salp && (oalp == NULL)) 1477 return (0); 1478 1479 /* 1480 * Next, inspect any hardware capabilities. If the objects hardware 1481 * capabilities are greater than or equal to that of the symbols 1482 * capabilities, then the symbol capability set is redundant. If the 1483 * symbols hardware capabilities are greater that the objects, then the 1484 * symbol set is more restrictive. 1485 * 1486 * Note that this is a somewhat arbitrary definition, as each capability 1487 * bit is independent of the others, and some of the higher order bits 1488 * could be considered to be less important than lower ones. However, 1489 * this is the only reasonable non-subjective definition. 1490 */ 1491 omsk = ocapset->oc_hw_2.cm_val; 1492 smsk = scapset->oc_hw_2.cm_val; 1493 if ((omsk > smsk) || (omsk && (omsk == smsk))) 1494 return (1); 1495 if (omsk < smsk) 1496 return (0); 1497 1498 /* 1499 * Finally, inspect the remaining hardware capabilities. 1500 */ 1501 omsk = ocapset->oc_hw_1.cm_val; 1502 smsk = scapset->oc_hw_1.cm_val; 1503 if ((omsk > smsk) || (omsk && (omsk == smsk))) 1504 return (1); 1505 1506 return (0); 1507 } 1508 1509 /* 1510 * Capabilities values might have been assigned excluded values. These 1511 * excluded values should be removed before calculating any capabilities 1512 * sections size. 1513 */ 1514 static void 1515 capmask_value(Lm_list *lml, Word type, Capmask *capmask, int *title) 1516 { 1517 /* 1518 * First determine whether any bits should be excluded. 1519 */ 1520 if ((capmask->cm_val & capmask->cm_exc) == 0) 1521 return; 1522 1523 DBG_CALL(Dbg_cap_post_title(lml, title)); 1524 1525 DBG_CALL(Dbg_cap_val_entry(lml, DBG_STATE_CURRENT, type, 1526 capmask->cm_val, ld_targ.t_m.m_mach)); 1527 DBG_CALL(Dbg_cap_val_entry(lml, DBG_STATE_EXCLUDE, type, 1528 capmask->cm_exc, ld_targ.t_m.m_mach)); 1529 1530 capmask->cm_val &= ~capmask->cm_exc; 1531 1532 DBG_CALL(Dbg_cap_val_entry(lml, DBG_STATE_RESOLVED, type, 1533 capmask->cm_val, ld_targ.t_m.m_mach)); 1534 } 1535 1536 static void 1537 capstr_value(Lm_list *lml, Word type, Caplist *caplist, int *title) 1538 { 1539 Aliste idx1, idx2; 1540 char *estr; 1541 Capstr *capstr; 1542 Boolean found = FALSE; 1543 1544 /* 1545 * First determine whether any strings should be excluded. 1546 */ 1547 for (APLIST_TRAVERSE(caplist->cl_exc, idx1, estr)) { 1548 for (ALIST_TRAVERSE(caplist->cl_val, idx2, capstr)) { 1549 if (strcmp(estr, capstr->cs_str) == 0) { 1550 found = TRUE; 1551 break; 1552 } 1553 } 1554 } 1555 1556 if (found == FALSE) 1557 return; 1558 1559 /* 1560 * Traverse the current strings, then delete the excluded strings, 1561 * and finally display the resolved strings. 1562 */ 1563 if (DBG_ENABLED) { 1564 Dbg_cap_post_title(lml, title); 1565 for (ALIST_TRAVERSE(caplist->cl_val, idx2, capstr)) { 1566 Dbg_cap_ptr_entry(lml, DBG_STATE_CURRENT, type, 1567 capstr->cs_str); 1568 } 1569 } 1570 for (APLIST_TRAVERSE(caplist->cl_exc, idx1, estr)) { 1571 for (ALIST_TRAVERSE(caplist->cl_val, idx2, capstr)) { 1572 if (strcmp(estr, capstr->cs_str) == 0) { 1573 DBG_CALL(Dbg_cap_ptr_entry(lml, 1574 DBG_STATE_EXCLUDE, type, capstr->cs_str)); 1575 alist_delete(caplist->cl_val, &idx2); 1576 break; 1577 } 1578 } 1579 } 1580 if (DBG_ENABLED) { 1581 for (ALIST_TRAVERSE(caplist->cl_val, idx2, capstr)) { 1582 Dbg_cap_ptr_entry(lml, DBG_STATE_RESOLVED, type, 1583 capstr->cs_str); 1584 } 1585 } 1586 } 1587 1588 /* 1589 * Build a capabilities section. 1590 */ 1591 #define CAP_UPDATE(cap, capndx, tag, val) \ 1592 cap->c_tag = tag; \ 1593 cap->c_un.c_val = val; \ 1594 cap++, capndx++; 1595 1596 static uintptr_t 1597 make_cap(Ofl_desc *ofl, Word shtype, const char *shname, int ident) 1598 { 1599 Shdr *shdr; 1600 Elf_Data *data; 1601 Is_desc *isec; 1602 Cap *cap; 1603 size_t size = 0; 1604 Word capndx = 0; 1605 Str_tbl *strtbl; 1606 Objcapset *ocapset = &ofl->ofl_ocapset; 1607 Aliste idx1; 1608 Capstr *capstr; 1609 int title = 0; 1610 1611 /* 1612 * Determine which string table to use for any CA_SUNW_MACH, 1613 * CA_SUNW_PLAT, or CA_SUNW_ID strings. 1614 */ 1615 if (OFL_IS_STATIC_OBJ(ofl)) 1616 strtbl = ofl->ofl_strtab; 1617 else 1618 strtbl = ofl->ofl_dynstrtab; 1619 1620 /* 1621 * If symbol capabilities have been requested, but none have been 1622 * created, warn the user. This scenario can occur if none of the 1623 * input relocatable objects defined any object capabilities. 1624 */ 1625 if ((ofl->ofl_flags & FLG_OF_OTOSCAP) && (ofl->ofl_capsymcnt == 0)) 1626 ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_CAP_NOSYMSFOUND)); 1627 1628 /* 1629 * If symbol capabilities have been collected, but no symbols are left 1630 * referencing these capabilities, promote the capability groups back 1631 * to an object capability definition. 1632 */ 1633 if ((ofl->ofl_flags & FLG_OF_OTOSCAP) && ofl->ofl_capsymcnt && 1634 (ofl->ofl_capfamilies == NULL)) { 1635 ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_CAP_NOSYMSFOUND)); 1636 ld_cap_move_symtoobj(ofl); 1637 ofl->ofl_capsymcnt = 0; 1638 ofl->ofl_capgroups = NULL; 1639 ofl->ofl_flags &= ~FLG_OF_OTOSCAP; 1640 } 1641 1642 /* 1643 * Remove any excluded capabilities. 1644 */ 1645 capstr_value(ofl->ofl_lml, CA_SUNW_PLAT, &ocapset->oc_plat, &title); 1646 capstr_value(ofl->ofl_lml, CA_SUNW_MACH, &ocapset->oc_mach, &title); 1647 capmask_value(ofl->ofl_lml, CA_SUNW_HW_2, &ocapset->oc_hw_2, &title); 1648 capmask_value(ofl->ofl_lml, CA_SUNW_HW_1, &ocapset->oc_hw_1, &title); 1649 capmask_value(ofl->ofl_lml, CA_SUNW_SF_1, &ocapset->oc_sf_1, &title); 1650 1651 /* 1652 * Determine how many entries are required for any object capabilities. 1653 */ 1654 size += alist_nitems(ocapset->oc_plat.cl_val); 1655 size += alist_nitems(ocapset->oc_mach.cl_val); 1656 if (ocapset->oc_hw_2.cm_val) 1657 size++; 1658 if (ocapset->oc_hw_1.cm_val) 1659 size++; 1660 if (ocapset->oc_sf_1.cm_val) 1661 size++; 1662 1663 /* 1664 * Only identify a capabilities group if the group has content. If a 1665 * capabilities identifier exists, and no other capabilities have been 1666 * supplied, remove the identifier. This scenario could exist if a 1667 * user mistakenly defined a lone identifier, or if an identified group 1668 * was overridden so as to clear the existing capabilities and the 1669 * identifier was not also cleared. 1670 */ 1671 if (ocapset->oc_id.cs_str) { 1672 if (size) 1673 size++; 1674 else 1675 ocapset->oc_id.cs_str = NULL; 1676 } 1677 if (size) 1678 size++; /* Add CA_SUNW_NULL */ 1679 1680 /* 1681 * Determine how many entries are required for any symbol capabilities. 1682 */ 1683 if (ofl->ofl_capsymcnt) { 1684 /* 1685 * If there are no object capabilities, a CA_SUNW_NULL entry 1686 * is required before any symbol capabilities. 1687 */ 1688 if (size == 0) 1689 size++; 1690 size += ofl->ofl_capsymcnt; 1691 } 1692 1693 if (size == 0) 1694 return (NULL); 1695 1696 if (new_section(ofl, shtype, shname, size, &isec, 1697 &shdr, &data) == S_ERROR) 1698 return (S_ERROR); 1699 1700 if ((data->d_buf = libld_malloc(shdr->sh_size)) == NULL) 1701 return (S_ERROR); 1702 1703 cap = (Cap *)data->d_buf; 1704 1705 /* 1706 * Fill in any object capabilities. If there is an identifier, then the 1707 * identifier comes first. The remaining items follow in precedence 1708 * order, although the order isn't important for runtime verification. 1709 */ 1710 if (ocapset->oc_id.cs_str) { 1711 ofl->ofl_flags |= FLG_OF_CAPSTRS; 1712 if (st_insert(strtbl, ocapset->oc_id.cs_str) == -1) 1713 return (S_ERROR); 1714 ocapset->oc_id.cs_ndx = capndx; 1715 CAP_UPDATE(cap, capndx, CA_SUNW_ID, 0); 1716 } 1717 if (ocapset->oc_plat.cl_val) { 1718 ofl->ofl_flags |= (FLG_OF_PTCAP | FLG_OF_CAPSTRS); 1719 1720 /* 1721 * Insert any platform name strings in the appropriate string 1722 * table. The capability value can't be filled in yet, as the 1723 * final offset of the strings isn't known until later. 1724 */ 1725 for (ALIST_TRAVERSE(ocapset->oc_plat.cl_val, idx1, capstr)) { 1726 if (st_insert(strtbl, capstr->cs_str) == -1) 1727 return (S_ERROR); 1728 capstr->cs_ndx = capndx; 1729 CAP_UPDATE(cap, capndx, CA_SUNW_PLAT, 0); 1730 } 1731 } 1732 if (ocapset->oc_mach.cl_val) { 1733 ofl->ofl_flags |= (FLG_OF_PTCAP | FLG_OF_CAPSTRS); 1734 1735 /* 1736 * Insert the machine name strings in the appropriate string 1737 * table. The capability value can't be filled in yet, as the 1738 * final offset of the strings isn't known until later. 1739 */ 1740 for (ALIST_TRAVERSE(ocapset->oc_mach.cl_val, idx1, capstr)) { 1741 if (st_insert(strtbl, capstr->cs_str) == -1) 1742 return (S_ERROR); 1743 capstr->cs_ndx = capndx; 1744 CAP_UPDATE(cap, capndx, CA_SUNW_MACH, 0); 1745 } 1746 } 1747 if (ocapset->oc_hw_2.cm_val) { 1748 ofl->ofl_flags |= FLG_OF_PTCAP; 1749 CAP_UPDATE(cap, capndx, CA_SUNW_HW_2, ocapset->oc_hw_2.cm_val); 1750 } 1751 if (ocapset->oc_hw_1.cm_val) { 1752 ofl->ofl_flags |= FLG_OF_PTCAP; 1753 CAP_UPDATE(cap, capndx, CA_SUNW_HW_1, ocapset->oc_hw_1.cm_val); 1754 } 1755 if (ocapset->oc_sf_1.cm_val) { 1756 ofl->ofl_flags |= FLG_OF_PTCAP; 1757 CAP_UPDATE(cap, capndx, CA_SUNW_SF_1, ocapset->oc_sf_1.cm_val); 1758 } 1759 CAP_UPDATE(cap, capndx, CA_SUNW_NULL, 0); 1760 1761 /* 1762 * Fill in any symbol capabilities. 1763 */ 1764 if (ofl->ofl_capgroups) { 1765 Cap_group *cgp; 1766 1767 for (APLIST_TRAVERSE(ofl->ofl_capgroups, idx1, cgp)) { 1768 Objcapset *scapset = &cgp->cg_set; 1769 Aliste idx2; 1770 Is_desc *isp; 1771 1772 cgp->cg_ndx = capndx; 1773 1774 if (scapset->oc_id.cs_str) { 1775 ofl->ofl_flags |= FLG_OF_CAPSTRS; 1776 /* 1777 * Insert the identifier string in the 1778 * appropriate string table. The capability 1779 * value can't be filled in yet, as the final 1780 * offset of the string isn't known until later. 1781 */ 1782 if (st_insert(strtbl, 1783 scapset->oc_id.cs_str) == -1) 1784 return (S_ERROR); 1785 scapset->oc_id.cs_ndx = capndx; 1786 CAP_UPDATE(cap, capndx, CA_SUNW_ID, 0); 1787 } 1788 1789 if (scapset->oc_plat.cl_val) { 1790 ofl->ofl_flags |= FLG_OF_CAPSTRS; 1791 1792 /* 1793 * Insert the platform name string in the 1794 * appropriate string table. The capability 1795 * value can't be filled in yet, as the final 1796 * offset of the string isn't known until later. 1797 */ 1798 for (ALIST_TRAVERSE(scapset->oc_plat.cl_val, 1799 idx2, capstr)) { 1800 if (st_insert(strtbl, 1801 capstr->cs_str) == -1) 1802 return (S_ERROR); 1803 capstr->cs_ndx = capndx; 1804 CAP_UPDATE(cap, capndx, 1805 CA_SUNW_PLAT, 0); 1806 } 1807 } 1808 if (scapset->oc_mach.cl_val) { 1809 ofl->ofl_flags |= FLG_OF_CAPSTRS; 1810 1811 /* 1812 * Insert the machine name string in the 1813 * appropriate string table. The capability 1814 * value can't be filled in yet, as the final 1815 * offset of the string isn't known until later. 1816 */ 1817 for (ALIST_TRAVERSE(scapset->oc_mach.cl_val, 1818 idx2, capstr)) { 1819 if (st_insert(strtbl, 1820 capstr->cs_str) == -1) 1821 return (S_ERROR); 1822 capstr->cs_ndx = capndx; 1823 CAP_UPDATE(cap, capndx, 1824 CA_SUNW_MACH, 0); 1825 } 1826 } 1827 if (scapset->oc_hw_2.cm_val) { 1828 CAP_UPDATE(cap, capndx, CA_SUNW_HW_2, 1829 scapset->oc_hw_2.cm_val); 1830 } 1831 if (scapset->oc_hw_1.cm_val) { 1832 CAP_UPDATE(cap, capndx, CA_SUNW_HW_1, 1833 scapset->oc_hw_1.cm_val); 1834 } 1835 if (scapset->oc_sf_1.cm_val) { 1836 CAP_UPDATE(cap, capndx, CA_SUNW_SF_1, 1837 scapset->oc_sf_1.cm_val); 1838 } 1839 CAP_UPDATE(cap, capndx, CA_SUNW_NULL, 0); 1840 1841 /* 1842 * If any object capabilities are available, determine 1843 * whether these symbol capabilities are less 1844 * restrictive, and hence redundant. 1845 */ 1846 if (((ofl->ofl_flags & FLG_OF_PTCAP) == 0) || 1847 (is_cap_redundant(ocapset, scapset) == 0)) 1848 continue; 1849 1850 /* 1851 * Indicate any files that provide redundant symbol 1852 * capabilities. 1853 */ 1854 for (APLIST_TRAVERSE(cgp->cg_secs, idx2, isp)) { 1855 ld_eprintf(ofl, ERR_WARNING, 1856 MSG_INTL(MSG_CAP_REDUNDANT), 1857 isp->is_file->ifl_name, 1858 EC_WORD(isp->is_scnndx), isp->is_name); 1859 } 1860 } 1861 } 1862 1863 /* 1864 * If capabilities strings are required, the sh_info field of the 1865 * section header will be set to the associated string table. 1866 */ 1867 if (ofl->ofl_flags & FLG_OF_CAPSTRS) 1868 shdr->sh_flags |= SHF_INFO_LINK; 1869 1870 /* 1871 * Place these capabilities in the output file. 1872 */ 1873 if ((ofl->ofl_oscap = ld_place_section(ofl, isec, 1874 NULL, ident, NULL)) == (Os_desc *)S_ERROR) 1875 return (S_ERROR); 1876 1877 /* 1878 * If symbol capabilities are required, then a .SUNW_capinfo section is 1879 * also created. This table will eventually be sized to match the 1880 * associated symbol table. 1881 */ 1882 if (ofl->ofl_capfamilies) { 1883 if ((ofl->ofl_oscapinfo = make_sym_sec(ofl, 1884 MSG_ORIG(MSG_SCN_SUNWCAPINFO), SHT_SUNW_capinfo, 1885 ld_targ.t_id.id_capinfo)) == (Os_desc *)S_ERROR) 1886 return (S_ERROR); 1887 1888 /* 1889 * If we're generating a dynamic object, capabilities family 1890 * members are maintained in a .SUNW_capchain section. 1891 */ 1892 if (ofl->ofl_capchaincnt && 1893 ((ofl->ofl_flags & FLG_OF_RELOBJ) == 0)) { 1894 if (new_section(ofl, SHT_SUNW_capchain, 1895 MSG_ORIG(MSG_SCN_SUNWCAPCHAIN), 1896 ofl->ofl_capchaincnt, &isec, &shdr, 1897 &data) == S_ERROR) 1898 return (S_ERROR); 1899 1900 ofl->ofl_oscapchain = ld_place_section(ofl, isec, 1901 NULL, ld_targ.t_id.id_capchain, NULL); 1902 if (ofl->ofl_oscapchain == (Os_desc *)S_ERROR) 1903 return (S_ERROR); 1904 1905 } 1906 } 1907 return (1); 1908 } 1909 #undef CAP_UPDATE 1910 1911 /* 1912 * Build the PLT section and its associated relocation entries. 1913 */ 1914 static uintptr_t 1915 make_plt(Ofl_desc *ofl) 1916 { 1917 Shdr *shdr; 1918 Elf_Data *data; 1919 Is_desc *isec; 1920 size_t size = ld_targ.t_m.m_plt_reservsz + 1921 (((size_t)ofl->ofl_pltcnt + (size_t)ofl->ofl_pltpad) * 1922 ld_targ.t_m.m_plt_entsize); 1923 size_t rsize = (size_t)ofl->ofl_relocpltsz; 1924 1925 /* 1926 * On sparc, account for the NOP at the end of the plt. 1927 */ 1928 if (ld_targ.t_m.m_mach == LD_TARG_BYCLASS(EM_SPARC, EM_SPARCV9)) 1929 size += sizeof (Word); 1930 1931 if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_PLT), 0, 1932 &isec, &shdr, &data) == S_ERROR) 1933 return (S_ERROR); 1934 1935 data->d_size = size; 1936 data->d_align = ld_targ.t_m.m_plt_align; 1937 1938 shdr->sh_flags = ld_targ.t_m.m_plt_shf_flags; 1939 shdr->sh_size = (Xword)size; 1940 shdr->sh_addralign = ld_targ.t_m.m_plt_align; 1941 shdr->sh_entsize = ld_targ.t_m.m_plt_entsize; 1942 1943 ofl->ofl_osplt = ld_place_section(ofl, isec, NULL, 1944 ld_targ.t_id.id_plt, NULL); 1945 if (ofl->ofl_osplt == (Os_desc *)S_ERROR) 1946 return (S_ERROR); 1947 1948 ofl->ofl_osplt->os_szoutrels = (Xword)rsize; 1949 1950 return (1); 1951 } 1952 1953 /* 1954 * Make the hash table. Only built for dynamic executables and shared 1955 * libraries, and provides hashed lookup into the global symbol table 1956 * (.dynsym) for the run-time linker to resolve symbol lookups. 1957 */ 1958 static uintptr_t 1959 make_hash(Ofl_desc *ofl) 1960 { 1961 Shdr *shdr; 1962 Elf_Data *data; 1963 Is_desc *isec; 1964 size_t size; 1965 Word nsyms = ofl->ofl_globcnt; 1966 size_t cnt; 1967 1968 /* 1969 * Allocate section header structures. We set entcnt to 0 1970 * because it's going to change after we place this section. 1971 */ 1972 if (new_section(ofl, SHT_HASH, MSG_ORIG(MSG_SCN_HASH), 0, 1973 &isec, &shdr, &data) == S_ERROR) 1974 return (S_ERROR); 1975 1976 /* 1977 * Place the section first since it will affect the local symbol 1978 * count. 1979 */ 1980 ofl->ofl_oshash = 1981 ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_hash, NULL); 1982 if (ofl->ofl_oshash == (Os_desc *)S_ERROR) 1983 return (S_ERROR); 1984 1985 /* 1986 * Calculate the number of output hash buckets. 1987 */ 1988 ofl->ofl_hashbkts = findprime(nsyms); 1989 1990 /* 1991 * The size of the hash table is determined by 1992 * 1993 * i. the initial nbucket and nchain entries (2) 1994 * ii. the number of buckets (calculated above) 1995 * iii. the number of chains (this is based on the number of 1996 * symbols in the .dynsym array). 1997 */ 1998 cnt = 2 + ofl->ofl_hashbkts + DYNSYM_ALL_CNT(ofl); 1999 size = cnt * shdr->sh_entsize; 2000 2001 /* 2002 * Finalize the section header and data buffer initialization. 2003 */ 2004 if ((data->d_buf = libld_calloc(size, 1)) == NULL) 2005 return (S_ERROR); 2006 data->d_size = size; 2007 shdr->sh_size = (Xword)size; 2008 2009 return (1); 2010 } 2011 2012 /* 2013 * Generate the standard symbol table. Contains all locals and globals, 2014 * and resides in a non-allocatable section (ie. it can be stripped). 2015 */ 2016 static uintptr_t 2017 make_symtab(Ofl_desc *ofl) 2018 { 2019 Shdr *shdr; 2020 Elf_Data *data; 2021 Is_desc *isec; 2022 Is_desc *xisec = 0; 2023 size_t size; 2024 Word symcnt; 2025 2026 /* 2027 * Create the section headers. Note that we supply an ent_cnt 2028 * of 0. We won't know the count until the section has been placed. 2029 */ 2030 if (new_section(ofl, SHT_SYMTAB, MSG_ORIG(MSG_SCN_SYMTAB), 0, 2031 &isec, &shdr, &data) == S_ERROR) 2032 return (S_ERROR); 2033 2034 /* 2035 * Place the section first since it will affect the local symbol 2036 * count. 2037 */ 2038 if ((ofl->ofl_ossymtab = ld_place_section(ofl, isec, NULL, 2039 ld_targ.t_id.id_symtab, NULL)) == (Os_desc *)S_ERROR) 2040 return (S_ERROR); 2041 2042 /* 2043 * At this point we've created all but the 'shstrtab' section. 2044 * Determine if we have to use 'Extended Sections'. If so - then 2045 * also create a SHT_SYMTAB_SHNDX section. 2046 */ 2047 if ((ofl->ofl_shdrcnt + 1) >= SHN_LORESERVE) { 2048 Shdr *xshdr; 2049 Elf_Data *xdata; 2050 2051 if (new_section(ofl, SHT_SYMTAB_SHNDX, 2052 MSG_ORIG(MSG_SCN_SYMTAB_SHNDX), 0, &xisec, 2053 &xshdr, &xdata) == S_ERROR) 2054 return (S_ERROR); 2055 2056 if ((ofl->ofl_ossymshndx = ld_place_section(ofl, xisec, NULL, 2057 ld_targ.t_id.id_symtab_ndx, NULL)) == (Os_desc *)S_ERROR) 2058 return (S_ERROR); 2059 } 2060 2061 /* 2062 * Calculated number of symbols, which need to be augmented by 2063 * the (yet to be created) .shstrtab entry. 2064 */ 2065 symcnt = (size_t)(1 + SYMTAB_ALL_CNT(ofl)); 2066 size = symcnt * shdr->sh_entsize; 2067 2068 /* 2069 * Finalize the section header and data buffer initialization. 2070 */ 2071 data->d_size = size; 2072 shdr->sh_size = (Xword)size; 2073 2074 /* 2075 * If we created a SHT_SYMTAB_SHNDX - then set it's sizes too. 2076 */ 2077 if (xisec) { 2078 size_t xsize = symcnt * sizeof (Word); 2079 2080 xisec->is_indata->d_size = xsize; 2081 xisec->is_shdr->sh_size = (Xword)xsize; 2082 } 2083 2084 return (1); 2085 } 2086 2087 /* 2088 * Build a dynamic symbol table. These tables reside in the text 2089 * segment of a dynamic executable or shared library. 2090 * 2091 * .SUNW_ldynsym contains local function symbols 2092 * .dynsym contains only globals symbols 2093 * 2094 * The two tables are created adjacent to each other, with .SUNW_ldynsym 2095 * coming first. 2096 */ 2097 static uintptr_t 2098 make_dynsym(Ofl_desc *ofl) 2099 { 2100 Shdr *shdr, *lshdr; 2101 Elf_Data *data, *ldata; 2102 Is_desc *isec, *lisec; 2103 size_t size; 2104 Xword cnt; 2105 int allow_ldynsym; 2106 2107 /* 2108 * Unless explicitly disabled, always produce a .SUNW_ldynsym section 2109 * when it is allowed by the file type, even if the resulting 2110 * table only ends up with a single STT_FILE in it. There are 2111 * two reasons: (1) It causes the generation of the DT_SUNW_SYMTAB 2112 * entry in the .dynamic section, which is something we would 2113 * like to encourage, and (2) Without it, we cannot generate 2114 * the associated .SUNW_dyn[sym|tls]sort sections, which are of 2115 * value to DTrace. 2116 * 2117 * In practice, it is extremely rare for an object not to have 2118 * local symbols for .SUNW_ldynsym, so 99% of the time, we'd be 2119 * doing it anyway. 2120 */ 2121 allow_ldynsym = OFL_ALLOW_LDYNSYM(ofl); 2122 2123 /* 2124 * Create the section headers. Note that we supply an ent_cnt 2125 * of 0. We won't know the count until the section has been placed. 2126 */ 2127 if (allow_ldynsym && new_section(ofl, SHT_SUNW_LDYNSYM, 2128 MSG_ORIG(MSG_SCN_LDYNSYM), 0, &lisec, &lshdr, &ldata) == S_ERROR) 2129 return (S_ERROR); 2130 2131 if (new_section(ofl, SHT_DYNSYM, MSG_ORIG(MSG_SCN_DYNSYM), 0, 2132 &isec, &shdr, &data) == S_ERROR) 2133 return (S_ERROR); 2134 2135 /* 2136 * Place the section(s) first since it will affect the local symbol 2137 * count. 2138 */ 2139 if (allow_ldynsym && 2140 ((ofl->ofl_osldynsym = ld_place_section(ofl, lisec, NULL, 2141 ld_targ.t_id.id_ldynsym, NULL)) == (Os_desc *)S_ERROR)) 2142 return (S_ERROR); 2143 ofl->ofl_osdynsym = 2144 ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_dynsym, NULL); 2145 if (ofl->ofl_osdynsym == (Os_desc *)S_ERROR) 2146 return (S_ERROR); 2147 2148 cnt = DYNSYM_ALL_CNT(ofl); 2149 size = (size_t)cnt * shdr->sh_entsize; 2150 2151 /* 2152 * Finalize the section header and data buffer initialization. 2153 */ 2154 data->d_size = size; 2155 shdr->sh_size = (Xword)size; 2156 2157 /* 2158 * An ldynsym contains local function symbols. It is not 2159 * used for linking, but if present, serves to allow better 2160 * stack traces to be generated in contexts where the symtab 2161 * is not available. (dladdr(), or stripped executable/library files). 2162 */ 2163 if (allow_ldynsym) { 2164 cnt = 1 + ofl->ofl_dynlocscnt + ofl->ofl_dynscopecnt; 2165 size = (size_t)cnt * shdr->sh_entsize; 2166 2167 ldata->d_size = size; 2168 lshdr->sh_size = (Xword)size; 2169 } 2170 2171 return (1); 2172 } 2173 2174 /* 2175 * Build .SUNW_dynsymsort and/or .SUNW_dyntlssort sections. These are 2176 * index sections for the .SUNW_ldynsym/.dynsym pair that present data 2177 * and function symbols sorted by address. 2178 */ 2179 static uintptr_t 2180 make_dynsort(Ofl_desc *ofl) 2181 { 2182 Shdr *shdr; 2183 Elf_Data *data; 2184 Is_desc *isec; 2185 2186 /* Only do it if the .SUNW_ldynsym section is present */ 2187 if (!OFL_ALLOW_LDYNSYM(ofl)) 2188 return (1); 2189 2190 /* .SUNW_dynsymsort */ 2191 if (ofl->ofl_dynsymsortcnt > 0) { 2192 if (new_section(ofl, SHT_SUNW_symsort, 2193 MSG_ORIG(MSG_SCN_DYNSYMSORT), ofl->ofl_dynsymsortcnt, 2194 &isec, &shdr, &data) == S_ERROR) 2195 return (S_ERROR); 2196 2197 if ((ofl->ofl_osdynsymsort = ld_place_section(ofl, isec, NULL, 2198 ld_targ.t_id.id_dynsort, NULL)) == (Os_desc *)S_ERROR) 2199 return (S_ERROR); 2200 } 2201 2202 /* .SUNW_dyntlssort */ 2203 if (ofl->ofl_dyntlssortcnt > 0) { 2204 if (new_section(ofl, SHT_SUNW_tlssort, 2205 MSG_ORIG(MSG_SCN_DYNTLSSORT), 2206 ofl->ofl_dyntlssortcnt, &isec, &shdr, &data) == S_ERROR) 2207 return (S_ERROR); 2208 2209 if ((ofl->ofl_osdyntlssort = ld_place_section(ofl, isec, NULL, 2210 ld_targ.t_id.id_dynsort, NULL)) == (Os_desc *)S_ERROR) 2211 return (S_ERROR); 2212 } 2213 2214 return (1); 2215 } 2216 2217 /* 2218 * Helper routine for make_dynsym_shndx. Builds a 2219 * a SHT_SYMTAB_SHNDX for .dynsym or .SUNW_ldynsym, without knowing 2220 * which one it is. 2221 */ 2222 static uintptr_t 2223 make_dyn_shndx(Ofl_desc *ofl, const char *shname, Os_desc *symtab, 2224 Os_desc **ret_os) 2225 { 2226 Is_desc *isec; 2227 Is_desc *dynsymisp; 2228 Shdr *shdr, *dynshdr; 2229 Elf_Data *data; 2230 2231 dynsymisp = ld_os_first_isdesc(symtab); 2232 dynshdr = dynsymisp->is_shdr; 2233 2234 if (new_section(ofl, SHT_SYMTAB_SHNDX, shname, 2235 (dynshdr->sh_size / dynshdr->sh_entsize), 2236 &isec, &shdr, &data) == S_ERROR) 2237 return (S_ERROR); 2238 2239 if ((*ret_os = ld_place_section(ofl, isec, NULL, 2240 ld_targ.t_id.id_dynsym_ndx, NULL)) == (Os_desc *)S_ERROR) 2241 return (S_ERROR); 2242 2243 assert(*ret_os); 2244 2245 return (1); 2246 } 2247 2248 /* 2249 * Build a SHT_SYMTAB_SHNDX for the .dynsym, and .SUNW_ldynsym 2250 */ 2251 static uintptr_t 2252 make_dynsym_shndx(Ofl_desc *ofl) 2253 { 2254 /* 2255 * If there is a .SUNW_ldynsym, generate a section for its extended 2256 * index section as well. 2257 */ 2258 if (OFL_ALLOW_LDYNSYM(ofl)) { 2259 if (make_dyn_shndx(ofl, MSG_ORIG(MSG_SCN_LDYNSYM_SHNDX), 2260 ofl->ofl_osldynsym, &ofl->ofl_osldynshndx) == S_ERROR) 2261 return (S_ERROR); 2262 } 2263 2264 /* The Generate a section for the dynsym */ 2265 if (make_dyn_shndx(ofl, MSG_ORIG(MSG_SCN_DYNSYM_SHNDX), 2266 ofl->ofl_osdynsym, &ofl->ofl_osdynshndx) == S_ERROR) 2267 return (S_ERROR); 2268 2269 return (1); 2270 } 2271 2272 2273 /* 2274 * Build a string table for the section headers. 2275 */ 2276 static uintptr_t 2277 make_shstrtab(Ofl_desc *ofl) 2278 { 2279 Shdr *shdr; 2280 Elf_Data *data; 2281 Is_desc *isec; 2282 size_t size; 2283 2284 if (new_section(ofl, SHT_STRTAB, MSG_ORIG(MSG_SCN_SHSTRTAB), 2285 0, &isec, &shdr, &data) == S_ERROR) 2286 return (S_ERROR); 2287 2288 /* 2289 * Place the section first, as it may effect the number of section 2290 * headers to account for. 2291 */ 2292 ofl->ofl_osshstrtab = 2293 ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_note, NULL); 2294 if (ofl->ofl_osshstrtab == (Os_desc *)S_ERROR) 2295 return (S_ERROR); 2296 2297 size = st_getstrtab_sz(ofl->ofl_shdrsttab); 2298 assert(size > 0); 2299 2300 data->d_size = size; 2301 shdr->sh_size = (Xword)size; 2302 2303 return (1); 2304 } 2305 2306 /* 2307 * Build a string section for the standard symbol table. 2308 */ 2309 static uintptr_t 2310 make_strtab(Ofl_desc *ofl) 2311 { 2312 Shdr *shdr; 2313 Elf_Data *data; 2314 Is_desc *isec; 2315 size_t size; 2316 2317 /* 2318 * This string table consists of all the global and local symbols. 2319 * Account for null bytes at end of the file name and the beginning 2320 * of section. 2321 */ 2322 if (st_insert(ofl->ofl_strtab, ofl->ofl_name) == -1) 2323 return (S_ERROR); 2324 2325 size = st_getstrtab_sz(ofl->ofl_strtab); 2326 assert(size > 0); 2327 2328 if (new_section(ofl, SHT_STRTAB, MSG_ORIG(MSG_SCN_STRTAB), 2329 0, &isec, &shdr, &data) == S_ERROR) 2330 return (S_ERROR); 2331 2332 /* Set the size of the data area */ 2333 data->d_size = size; 2334 shdr->sh_size = (Xword)size; 2335 2336 ofl->ofl_osstrtab = 2337 ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_strtab, NULL); 2338 return ((uintptr_t)ofl->ofl_osstrtab); 2339 } 2340 2341 /* 2342 * Build a string table for the dynamic symbol table. 2343 */ 2344 static uintptr_t 2345 make_dynstr(Ofl_desc *ofl) 2346 { 2347 Shdr *shdr; 2348 Elf_Data *data; 2349 Is_desc *isec; 2350 size_t size; 2351 2352 /* 2353 * If producing a .SUNW_ldynsym, account for the initial STT_FILE 2354 * symbol that precedes the scope reduced global symbols. 2355 */ 2356 if (OFL_ALLOW_LDYNSYM(ofl)) { 2357 if (st_insert(ofl->ofl_dynstrtab, ofl->ofl_name) == -1) 2358 return (S_ERROR); 2359 ofl->ofl_dynscopecnt++; 2360 } 2361 2362 /* 2363 * Account for any local, named register symbols. These locals are 2364 * required for reference from DT_REGISTER .dynamic entries. 2365 */ 2366 if (ofl->ofl_regsyms) { 2367 int ndx; 2368 2369 for (ndx = 0; ndx < ofl->ofl_regsymsno; ndx++) { 2370 Sym_desc *sdp; 2371 2372 if ((sdp = ofl->ofl_regsyms[ndx]) == NULL) 2373 continue; 2374 2375 if (!SYM_IS_HIDDEN(sdp) && 2376 (ELF_ST_BIND(sdp->sd_sym->st_info) != STB_LOCAL)) 2377 continue; 2378 2379 if (sdp->sd_sym->st_name == NULL) 2380 continue; 2381 2382 if (st_insert(ofl->ofl_dynstrtab, sdp->sd_name) == -1) 2383 return (S_ERROR); 2384 } 2385 } 2386 2387 /* 2388 * Reserve entries for any per-symbol auxiliary/filter strings. 2389 */ 2390 if (ofl->ofl_dtsfltrs != NULL) { 2391 Dfltr_desc *dftp; 2392 Aliste idx; 2393 2394 for (ALIST_TRAVERSE(ofl->ofl_dtsfltrs, idx, dftp)) 2395 if (st_insert(ofl->ofl_dynstrtab, dftp->dft_str) == -1) 2396 return (S_ERROR); 2397 } 2398 2399 size = st_getstrtab_sz(ofl->ofl_dynstrtab); 2400 assert(size > 0); 2401 2402 if (new_section(ofl, SHT_STRTAB, MSG_ORIG(MSG_SCN_DYNSTR), 2403 0, &isec, &shdr, &data) == S_ERROR) 2404 return (S_ERROR); 2405 2406 /* Make it allocable if necessary */ 2407 if (!(ofl->ofl_flags & FLG_OF_RELOBJ)) 2408 shdr->sh_flags |= SHF_ALLOC; 2409 2410 /* Set the size of the data area */ 2411 data->d_size = size + DYNSTR_EXTRA_PAD; 2412 2413 shdr->sh_size = (Xword)size; 2414 2415 ofl->ofl_osdynstr = 2416 ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_dynstr, NULL); 2417 return ((uintptr_t)ofl->ofl_osdynstr); 2418 } 2419 2420 /* 2421 * Generate an output relocation section which will contain the relocation 2422 * information to be applied to the `osp' section. 2423 * 2424 * If (osp == NULL) then we are creating the coalesced relocation section 2425 * for an executable and/or a shared object. 2426 */ 2427 static uintptr_t 2428 make_reloc(Ofl_desc *ofl, Os_desc *osp) 2429 { 2430 Shdr *shdr; 2431 Elf_Data *data; 2432 Is_desc *isec; 2433 size_t size; 2434 Xword sh_flags; 2435 char *sectname; 2436 Os_desc *rosp; 2437 Word relsize; 2438 const char *rel_prefix; 2439 2440 /* LINTED */ 2441 if (ld_targ.t_m.m_rel_sht_type == SHT_REL) { 2442 /* REL */ 2443 relsize = sizeof (Rel); 2444 rel_prefix = MSG_ORIG(MSG_SCN_REL); 2445 } else { 2446 /* RELA */ 2447 relsize = sizeof (Rela); 2448 rel_prefix = MSG_ORIG(MSG_SCN_RELA); 2449 } 2450 2451 if (osp) { 2452 size = osp->os_szoutrels; 2453 sh_flags = osp->os_shdr->sh_flags; 2454 if ((sectname = libld_malloc(strlen(rel_prefix) + 2455 strlen(osp->os_name) + 1)) == 0) 2456 return (S_ERROR); 2457 (void) strcpy(sectname, rel_prefix); 2458 (void) strcat(sectname, osp->os_name); 2459 } else if (ofl->ofl_flags & FLG_OF_COMREL) { 2460 size = (ofl->ofl_reloccnt - ofl->ofl_reloccntsub) * relsize; 2461 sh_flags = SHF_ALLOC; 2462 sectname = (char *)MSG_ORIG(MSG_SCN_SUNWRELOC); 2463 } else { 2464 size = ofl->ofl_relocrelsz; 2465 sh_flags = SHF_ALLOC; 2466 sectname = (char *)rel_prefix; 2467 } 2468 2469 /* 2470 * Keep track of total size of 'output relocations' (to be stored 2471 * in .dynamic) 2472 */ 2473 /* LINTED */ 2474 ofl->ofl_relocsz += (Xword)size; 2475 2476 if (new_section(ofl, ld_targ.t_m.m_rel_sht_type, sectname, 0, &isec, 2477 &shdr, &data) == S_ERROR) 2478 return (S_ERROR); 2479 2480 data->d_size = size; 2481 2482 shdr->sh_size = (Xword)size; 2483 if (OFL_ALLOW_DYNSYM(ofl) && (sh_flags & SHF_ALLOC)) 2484 shdr->sh_flags = SHF_ALLOC; 2485 2486 if (osp) { 2487 /* 2488 * The sh_info field of the SHT_REL* sections points to the 2489 * section the relocations are to be applied to. 2490 */ 2491 shdr->sh_flags |= SHF_INFO_LINK; 2492 } 2493 2494 rosp = ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_rel, NULL); 2495 if (rosp == (Os_desc *)S_ERROR) 2496 return (S_ERROR); 2497 2498 /* 2499 * Associate this relocation section to the section its going to 2500 * relocate. 2501 */ 2502 if (osp) { 2503 Aliste idx; 2504 Is_desc *risp; 2505 2506 /* 2507 * This is used primarily so that we can update 2508 * SHT_GROUP[sect_no] entries to point to the 2509 * created output relocation sections. 2510 */ 2511 for (APLIST_TRAVERSE(osp->os_relisdescs, idx, risp)) { 2512 risp->is_osdesc = rosp; 2513 2514 /* 2515 * If the input relocation section had the SHF_GROUP 2516 * flag set - propagate it to the output relocation 2517 * section. 2518 */ 2519 if (risp->is_shdr->sh_flags & SHF_GROUP) { 2520 rosp->os_shdr->sh_flags |= SHF_GROUP; 2521 break; 2522 } 2523 } 2524 osp->os_relosdesc = rosp; 2525 } else 2526 ofl->ofl_osrel = rosp; 2527 2528 /* 2529 * If this is the first relocation section we've encountered save it 2530 * so that the .dynamic entry can be initialized accordingly. 2531 */ 2532 if (ofl->ofl_osrelhead == (Os_desc *)0) 2533 ofl->ofl_osrelhead = rosp; 2534 2535 return (1); 2536 } 2537 2538 /* 2539 * Generate version needed section. 2540 */ 2541 static uintptr_t 2542 make_verneed(Ofl_desc *ofl) 2543 { 2544 Shdr *shdr; 2545 Elf_Data *data; 2546 Is_desc *isec; 2547 2548 /* 2549 * verneed sections do not have a constant element size, so the 2550 * value of ent_cnt specified here (0) is meaningless. 2551 */ 2552 if (new_section(ofl, SHT_SUNW_verneed, MSG_ORIG(MSG_SCN_SUNWVERSION), 2553 0, &isec, &shdr, &data) == S_ERROR) 2554 return (S_ERROR); 2555 2556 /* During version processing we calculated the total size. */ 2557 data->d_size = ofl->ofl_verneedsz; 2558 shdr->sh_size = (Xword)ofl->ofl_verneedsz; 2559 2560 ofl->ofl_osverneed = 2561 ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_version, NULL); 2562 return ((uintptr_t)ofl->ofl_osverneed); 2563 } 2564 2565 /* 2566 * Generate a version definition section. 2567 * 2568 * o the SHT_SUNW_verdef section defines the versions that exist within this 2569 * image. 2570 */ 2571 static uintptr_t 2572 make_verdef(Ofl_desc *ofl) 2573 { 2574 Shdr *shdr; 2575 Elf_Data *data; 2576 Is_desc *isec; 2577 Ver_desc *vdp; 2578 Str_tbl *strtab; 2579 2580 /* 2581 * Reserve a string table entry for the base version dependency (other 2582 * dependencies have symbol representations, which will already be 2583 * accounted for during symbol processing). 2584 */ 2585 vdp = (Ver_desc *)ofl->ofl_verdesc->apl_data[0]; 2586 2587 if (OFL_IS_STATIC_OBJ(ofl)) 2588 strtab = ofl->ofl_strtab; 2589 else 2590 strtab = ofl->ofl_dynstrtab; 2591 2592 if (st_insert(strtab, vdp->vd_name) == -1) 2593 return (S_ERROR); 2594 2595 /* 2596 * verdef sections do not have a constant element size, so the 2597 * value of ent_cnt specified here (0) is meaningless. 2598 */ 2599 if (new_section(ofl, SHT_SUNW_verdef, MSG_ORIG(MSG_SCN_SUNWVERSION), 2600 0, &isec, &shdr, &data) == S_ERROR) 2601 return (S_ERROR); 2602 2603 /* During version processing we calculated the total size. */ 2604 data->d_size = ofl->ofl_verdefsz; 2605 shdr->sh_size = (Xword)ofl->ofl_verdefsz; 2606 2607 ofl->ofl_osverdef = 2608 ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_version, NULL); 2609 return ((uintptr_t)ofl->ofl_osverdef); 2610 } 2611 2612 /* 2613 * This routine is called when -z nopartial is in effect. 2614 */ 2615 uintptr_t 2616 ld_make_parexpn_data(Ofl_desc *ofl, size_t size, Xword align) 2617 { 2618 Shdr *shdr; 2619 Elf_Data *data; 2620 Is_desc *isec; 2621 Os_desc *osp; 2622 2623 if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_DATA), 0, 2624 &isec, &shdr, &data) == S_ERROR) 2625 return (S_ERROR); 2626 2627 shdr->sh_flags |= SHF_WRITE; 2628 data->d_size = size; 2629 shdr->sh_size = (Xword)size; 2630 if (align != 0) { 2631 data->d_align = align; 2632 shdr->sh_addralign = align; 2633 } 2634 2635 if ((data->d_buf = libld_calloc(size, 1)) == NULL) 2636 return (S_ERROR); 2637 2638 /* 2639 * Retain handle to this .data input section. Variables using move 2640 * sections (partial initialization) will be redirected here when 2641 * such global references are added and '-z nopartial' is in effect. 2642 */ 2643 ofl->ofl_isparexpn = isec; 2644 osp = ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_data, NULL); 2645 if (osp == (Os_desc *)S_ERROR) 2646 return (S_ERROR); 2647 2648 if (!(osp->os_flags & FLG_OS_OUTREL)) { 2649 ofl->ofl_dynshdrcnt++; 2650 osp->os_flags |= FLG_OS_OUTREL; 2651 } 2652 return (1); 2653 } 2654 2655 /* 2656 * Make .sunwmove section 2657 */ 2658 uintptr_t 2659 ld_make_sunwmove(Ofl_desc *ofl, int mv_nums) 2660 { 2661 Shdr *shdr; 2662 Elf_Data *data; 2663 Is_desc *isec; 2664 Aliste idx; 2665 Sym_desc *sdp; 2666 int cnt = 1; 2667 2668 2669 if (new_section(ofl, SHT_SUNW_move, MSG_ORIG(MSG_SCN_SUNWMOVE), 2670 mv_nums, &isec, &shdr, &data) == S_ERROR) 2671 return (S_ERROR); 2672 2673 if ((data->d_buf = libld_calloc(data->d_size, 1)) == NULL) 2674 return (S_ERROR); 2675 2676 /* 2677 * Copy move entries 2678 */ 2679 for (APLIST_TRAVERSE(ofl->ofl_parsyms, idx, sdp)) { 2680 Aliste idx2; 2681 Mv_desc *mdp; 2682 2683 if (sdp->sd_flags & FLG_SY_PAREXPN) 2684 continue; 2685 2686 for (ALIST_TRAVERSE(sdp->sd_move, idx2, mdp)) 2687 mdp->md_oidx = cnt++; 2688 } 2689 2690 if ((ofl->ofl_osmove = ld_place_section(ofl, isec, NULL, 0, NULL)) == 2691 (Os_desc *)S_ERROR) 2692 return (S_ERROR); 2693 2694 return (1); 2695 } 2696 2697 /* 2698 * Given a relocation descriptor that references a string table 2699 * input section, locate the string referenced and return a pointer 2700 * to it. 2701 */ 2702 static const char * 2703 strmerge_get_reloc_str(Ofl_desc *ofl, Rel_desc *rsp) 2704 { 2705 Sym_desc *sdp = rsp->rel_sym; 2706 Xword str_off; 2707 2708 /* 2709 * In the case of an STT_SECTION symbol, the addend of the 2710 * relocation gives the offset into the string section. For 2711 * other symbol types, the symbol value is the offset. 2712 */ 2713 2714 if (ELF_ST_TYPE(sdp->sd_sym->st_info) != STT_SECTION) { 2715 str_off = sdp->sd_sym->st_value; 2716 } else if ((rsp->rel_flags & FLG_REL_RELA) == FLG_REL_RELA) { 2717 /* 2718 * For SHT_RELA, the addend value is found in the 2719 * rel_raddend field of the relocation. 2720 */ 2721 str_off = rsp->rel_raddend; 2722 } else { /* REL and STT_SECTION */ 2723 /* 2724 * For SHT_REL, the "addend" is not part of the relocation 2725 * record. Instead, it is found at the relocation target 2726 * address. 2727 */ 2728 uchar_t *addr = (uchar_t *)((uintptr_t)rsp->rel_roffset + 2729 (uintptr_t)rsp->rel_isdesc->is_indata->d_buf); 2730 2731 if (ld_reloc_targval_get(ofl, rsp, addr, &str_off) == 0) 2732 return (0); 2733 } 2734 2735 return (str_off + (char *)sdp->sd_isc->is_indata->d_buf); 2736 } 2737 2738 /* 2739 * First pass over the relocation records for string table merging. 2740 * Build lists of relocations and symbols that will need modification, 2741 * and insert the strings they reference into the mstrtab string table. 2742 * 2743 * entry: 2744 * ofl, osp - As passed to ld_make_strmerge(). 2745 * mstrtab - String table to receive input strings. This table 2746 * must be in its first (initialization) pass and not 2747 * yet cooked (st_getstrtab_sz() not yet called). 2748 * rel_alpp - APlist to receive pointer to any relocation 2749 * descriptors with STT_SECTION symbols that reference 2750 * one of the input sections being merged. 2751 * sym_alpp - APlist to receive pointer to any symbols that reference 2752 * one of the input sections being merged. 2753 * rcp - Pointer to cache of relocation descriptors to examine. 2754 * Either &ofl->ofl_actrels (active relocations) 2755 * or &ofl->ofl_outrels (output relocations). 2756 * 2757 * exit: 2758 * On success, rel_alpp and sym_alpp are updated, and 2759 * any strings in the mergeable input sections referenced by 2760 * a relocation has been entered into mstrtab. True (1) is returned. 2761 * 2762 * On failure, False (0) is returned. 2763 */ 2764 static int 2765 strmerge_pass1(Ofl_desc *ofl, Os_desc *osp, Str_tbl *mstrtab, 2766 APlist **rel_alpp, APlist **sym_alpp, Rel_cache *rcp) 2767 { 2768 Aliste idx; 2769 Rel_cachebuf *rcbp; 2770 Sym_desc *sdp; 2771 Sym_desc *last_sdp = NULL; 2772 Rel_desc *rsp; 2773 const char *name; 2774 2775 REL_CACHE_TRAVERSE(rcp, idx, rcbp, rsp) { 2776 sdp = rsp->rel_sym; 2777 if ((sdp->sd_isc == NULL) || ((sdp->sd_isc->is_flags & 2778 (FLG_IS_DISCARD | FLG_IS_INSTRMRG)) != FLG_IS_INSTRMRG) || 2779 (sdp->sd_isc->is_osdesc != osp)) 2780 continue; 2781 2782 /* 2783 * Remember symbol for use in the third pass. There is no 2784 * reason to save a given symbol more than once, so we take 2785 * advantage of the fact that relocations to a given symbol 2786 * tend to cluster in the list. If this is the same symbol 2787 * we saved last time, don't bother. 2788 */ 2789 if (last_sdp != sdp) { 2790 if (aplist_append(sym_alpp, sdp, AL_CNT_STRMRGSYM) == 2791 NULL) 2792 return (0); 2793 last_sdp = sdp; 2794 } 2795 2796 /* Enter the string into our new string table */ 2797 name = strmerge_get_reloc_str(ofl, rsp); 2798 if (st_insert(mstrtab, name) == -1) 2799 return (0); 2800 2801 /* 2802 * If this is an STT_SECTION symbol, then the second pass 2803 * will need to modify this relocation, so hang on to it. 2804 */ 2805 if ((ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION) && 2806 (aplist_append(rel_alpp, rsp, AL_CNT_STRMRGREL) == NULL)) 2807 return (0); 2808 } 2809 2810 return (1); 2811 } 2812 2813 /* 2814 * If the output section has any SHF_MERGE|SHF_STRINGS input sections, 2815 * replace them with a single merged/compressed input section. 2816 * 2817 * entry: 2818 * ofl - Output file descriptor 2819 * osp - Output section descriptor 2820 * rel_alpp, sym_alpp, - Address of 2 APlists, to be used 2821 * for internal processing. On the initial call to 2822 * ld_make_strmerge, these list pointers must be NULL. 2823 * The caller is encouraged to pass the same lists back for 2824 * successive calls to this function without freeing 2825 * them in between calls. This causes a single pair of 2826 * memory allocations to be reused multiple times. 2827 * 2828 * exit: 2829 * If section merging is possible, it is done. If no errors are 2830 * encountered, True (1) is returned. On error, S_ERROR. 2831 * 2832 * The contents of rel_alpp and sym_alpp on exit are 2833 * undefined. The caller can free them, or pass them back to a subsequent 2834 * call to this routine, but should not examine their contents. 2835 */ 2836 static uintptr_t 2837 ld_make_strmerge(Ofl_desc *ofl, Os_desc *osp, APlist **rel_alpp, 2838 APlist **sym_alpp) 2839 { 2840 Str_tbl *mstrtab; /* string table for string merge secs */ 2841 Is_desc *mstrsec; /* Generated string merge section */ 2842 Is_desc *isp; 2843 Shdr *mstr_shdr; 2844 Elf_Data *mstr_data; 2845 Sym_desc *sdp; 2846 Rel_desc *rsp; 2847 Aliste idx; 2848 size_t data_size; 2849 int st_setstring_status; 2850 size_t stoff; 2851 2852 /* If string table compression is disabled, there's nothing to do */ 2853 if ((ofl->ofl_flags1 & FLG_OF1_NCSTTAB) != 0) 2854 return (1); 2855 2856 /* 2857 * Pass over the mergeable input sections, and if they haven't 2858 * all been discarded, create a string table. 2859 */ 2860 mstrtab = NULL; 2861 for (APLIST_TRAVERSE(osp->os_mstrisdescs, idx, isp)) { 2862 if (isdesc_discarded(isp)) 2863 continue; 2864 2865 /* 2866 * Input sections of 0 size are dubiously valid since they do 2867 * not even contain the NUL string. Ignore them. 2868 */ 2869 if (isp->is_shdr->sh_size == 0) 2870 continue; 2871 2872 /* 2873 * We have at least one non-discarded section. 2874 * Create a string table descriptor. 2875 */ 2876 if ((mstrtab = st_new(FLG_STNEW_COMPRESS)) == NULL) 2877 return (S_ERROR); 2878 break; 2879 } 2880 2881 /* If no string table was created, we have no mergeable sections */ 2882 if (mstrtab == NULL) 2883 return (1); 2884 2885 /* 2886 * This routine has to make 3 passes: 2887 * 2888 * 1) Examine all relocations, insert strings from relocations 2889 * to the mergeable input sections into the string table. 2890 * 2) Modify the relocation values to be correct for the 2891 * new merged section. 2892 * 3) Modify the symbols used by the relocations to reference 2893 * the new section. 2894 * 2895 * These passes cannot be combined: 2896 * - The string table code works in two passes, and all 2897 * strings have to be loaded in pass one before the 2898 * offset of any strings can be determined. 2899 * - Multiple relocations reference a single symbol, so the 2900 * symbol cannot be modified until all relocations are 2901 * fixed. 2902 * 2903 * The number of relocations related to section merging is usually 2904 * a mere fraction of the overall active and output relocation lists, 2905 * and the number of symbols is usually a fraction of the number 2906 * of related relocations. We therefore build APlists for the 2907 * relocations and symbols in the first pass, and then use those 2908 * lists to accelerate the operation of pass 2 and 3. 2909 * 2910 * Reinitialize the lists to a completely empty state. 2911 */ 2912 aplist_reset(*rel_alpp); 2913 aplist_reset(*sym_alpp); 2914 2915 /* 2916 * Pass 1: 2917 * 2918 * Every relocation related to this output section (and the input 2919 * sections that make it up) is found in either the active, or the 2920 * output relocation list, depending on whether the relocation is to 2921 * be processed by this invocation of the linker, or inserted into the 2922 * output object. 2923 * 2924 * Build lists of relocations and symbols that will need modification, 2925 * and insert the strings they reference into the mstrtab string table. 2926 */ 2927 if (strmerge_pass1(ofl, osp, mstrtab, rel_alpp, sym_alpp, 2928 &ofl->ofl_actrels) == 0) 2929 goto return_s_error; 2930 if (strmerge_pass1(ofl, osp, mstrtab, rel_alpp, sym_alpp, 2931 &ofl->ofl_outrels) == 0) 2932 goto return_s_error; 2933 2934 /* 2935 * Get the size of the new input section. Requesting the 2936 * string table size "cooks" the table, and finalizes its contents. 2937 */ 2938 data_size = st_getstrtab_sz(mstrtab); 2939 2940 /* Create a new input section to hold the merged strings */ 2941 if (new_section_from_template(ofl, isp, data_size, 2942 &mstrsec, &mstr_shdr, &mstr_data) == S_ERROR) 2943 goto return_s_error; 2944 mstrsec->is_flags |= FLG_IS_GNSTRMRG; 2945 2946 /* 2947 * Allocate a data buffer for the new input section. 2948 * Then, associate the buffer with the string table descriptor. 2949 */ 2950 if ((mstr_data->d_buf = libld_malloc(data_size)) == NULL) 2951 goto return_s_error; 2952 if (st_setstrbuf(mstrtab, mstr_data->d_buf, data_size) == -1) 2953 goto return_s_error; 2954 2955 /* Add the new section to the output image */ 2956 if (ld_place_section(ofl, mstrsec, NULL, osp->os_identndx, NULL) == 2957 (Os_desc *)S_ERROR) 2958 goto return_s_error; 2959 2960 /* 2961 * Pass 2: 2962 * 2963 * Revisit the relocation descriptors with STT_SECTION symbols 2964 * that were saved by the first pass. Update each relocation 2965 * record so that the offset it contains is for the new section 2966 * instead of the original. 2967 */ 2968 for (APLIST_TRAVERSE(*rel_alpp, idx, rsp)) { 2969 const char *name; 2970 2971 /* Put the string into the merged string table */ 2972 name = strmerge_get_reloc_str(ofl, rsp); 2973 st_setstring_status = st_setstring(mstrtab, name, &stoff); 2974 if (st_setstring_status == -1) { 2975 /* 2976 * A failure to insert at this point means that 2977 * something is corrupt. This isn't a resource issue. 2978 */ 2979 assert(st_setstring_status != -1); 2980 goto return_s_error; 2981 } 2982 2983 /* 2984 * Alter the relocation to access the string at the 2985 * new offset in our new string table. 2986 * 2987 * For SHT_RELA platforms, it suffices to simply 2988 * update the rel_raddend field of the relocation. 2989 * 2990 * For SHT_REL platforms, the new "addend" value 2991 * needs to be written at the address being relocated. 2992 * However, we can't alter the input sections which 2993 * are mapped readonly, and the output image has not 2994 * been created yet. So, we defer this operation, 2995 * using the rel_raddend field of the relocation 2996 * which is normally 0 on a REL platform, to pass the 2997 * new "addend" value to ld_perform_outreloc() or 2998 * ld_do_activerelocs(). The FLG_REL_NADDEND flag 2999 * tells them that this is the case. 3000 */ 3001 if ((rsp->rel_flags & FLG_REL_RELA) == 0) /* REL */ 3002 rsp->rel_flags |= FLG_REL_NADDEND; 3003 rsp->rel_raddend = (Sxword)stoff; 3004 3005 /* 3006 * Generate a symbol name string for STT_SECTION symbols 3007 * that might reference our merged section. This shows up 3008 * in debug output and helps show how the relocation has 3009 * changed from its original input section to our merged one. 3010 */ 3011 if (ld_stt_section_sym_name(mstrsec) == NULL) 3012 goto return_s_error; 3013 } 3014 3015 /* 3016 * Pass 3: 3017 * 3018 * Modify the symbols referenced by the relocation descriptors 3019 * so that they reference the new input section containing the 3020 * merged strings instead of the original input sections. 3021 */ 3022 for (APLIST_TRAVERSE(*sym_alpp, idx, sdp)) { 3023 /* 3024 * If we've already processed this symbol, don't do it 3025 * twice. strmerge_pass1() uses a heuristic (relocations to 3026 * the same symbol clump together) to avoid inserting a 3027 * given symbol more than once, but repeat symbols in 3028 * the list can occur. 3029 */ 3030 if ((sdp->sd_isc->is_flags & FLG_IS_INSTRMRG) == 0) 3031 continue; 3032 3033 if (ELF_ST_TYPE(sdp->sd_sym->st_info) != STT_SECTION) { 3034 /* 3035 * This is not an STT_SECTION symbol, so its 3036 * value is the offset of the string within the 3037 * input section. Update the address to reflect 3038 * the address in our new merged section. 3039 */ 3040 const char *name = sdp->sd_sym->st_value + 3041 (char *)sdp->sd_isc->is_indata->d_buf; 3042 3043 st_setstring_status = 3044 st_setstring(mstrtab, name, &stoff); 3045 if (st_setstring_status == -1) { 3046 /* 3047 * A failure to insert at this point means 3048 * something is corrupt. This isn't a 3049 * resource issue. 3050 */ 3051 assert(st_setstring_status != -1); 3052 goto return_s_error; 3053 } 3054 3055 if (ld_sym_copy(sdp) == S_ERROR) 3056 goto return_s_error; 3057 sdp->sd_sym->st_value = (Word)stoff; 3058 } 3059 3060 /* Redirect the symbol to our new merged section */ 3061 sdp->sd_isc = mstrsec; 3062 } 3063 3064 /* 3065 * There are no references left to the original input string sections. 3066 * Mark them as discarded so they don't go into the output image. 3067 * At the same time, add up the sizes of the replaced sections. 3068 */ 3069 data_size = 0; 3070 for (APLIST_TRAVERSE(osp->os_mstrisdescs, idx, isp)) { 3071 if (isp->is_flags & (FLG_IS_DISCARD | FLG_IS_GNSTRMRG)) 3072 continue; 3073 3074 data_size += isp->is_indata->d_size; 3075 3076 isp->is_flags |= FLG_IS_DISCARD; 3077 DBG_CALL(Dbg_sec_discarded(ofl->ofl_lml, isp, mstrsec)); 3078 } 3079 3080 /* Report how much space we saved in the output section */ 3081 DBG_CALL(Dbg_sec_genstr_compress(ofl->ofl_lml, osp->os_name, data_size, 3082 mstr_data->d_size)); 3083 3084 st_destroy(mstrtab); 3085 return (1); 3086 3087 return_s_error: 3088 st_destroy(mstrtab); 3089 return (S_ERROR); 3090 } 3091 3092 /* 3093 * Update a data buffers size. A number of sections have to be created, and 3094 * the sections header contributes to the size of the eventual section. Thus, 3095 * a section may be created, and once all associated sections have been created, 3096 * we return to establish the required section size. 3097 */ 3098 inline static void 3099 update_data_size(Os_desc *osp, ulong_t cnt) 3100 { 3101 Is_desc *isec = ld_os_first_isdesc(osp); 3102 Elf_Data *data = isec->is_indata; 3103 Shdr *shdr = osp->os_shdr; 3104 size_t size = cnt * shdr->sh_entsize; 3105 3106 shdr->sh_size = (Xword)size; 3107 data->d_size = size; 3108 } 3109 3110 /* 3111 * The following sections are built after all input file processing and symbol 3112 * validation has been carried out. The order is important (because the 3113 * addition of a section adds a new symbol there is a chicken and egg problem 3114 * of maintaining the appropriate counts). By maintaining a known order the 3115 * individual routines can compensate for later, known, additions. 3116 */ 3117 uintptr_t 3118 ld_make_sections(Ofl_desc *ofl) 3119 { 3120 ofl_flag_t flags = ofl->ofl_flags; 3121 Sg_desc *sgp; 3122 3123 /* 3124 * Generate any special sections. 3125 */ 3126 if (flags & FLG_OF_ADDVERS) 3127 if (make_comment(ofl) == S_ERROR) 3128 return (S_ERROR); 3129 3130 if (make_interp(ofl) == S_ERROR) 3131 return (S_ERROR); 3132 3133 /* 3134 * Create a capabilities section if required. 3135 */ 3136 if (make_cap(ofl, SHT_SUNW_cap, MSG_ORIG(MSG_SCN_SUNWCAP), 3137 ld_targ.t_id.id_cap) == S_ERROR) 3138 return (S_ERROR); 3139 3140 /* 3141 * Create any init/fini array sections. 3142 */ 3143 if (make_array(ofl, SHT_INIT_ARRAY, MSG_ORIG(MSG_SCN_INITARRAY), 3144 ofl->ofl_initarray) == S_ERROR) 3145 return (S_ERROR); 3146 3147 if (make_array(ofl, SHT_FINI_ARRAY, MSG_ORIG(MSG_SCN_FINIARRAY), 3148 ofl->ofl_finiarray) == S_ERROR) 3149 return (S_ERROR); 3150 3151 if (make_array(ofl, SHT_PREINIT_ARRAY, MSG_ORIG(MSG_SCN_PREINITARRAY), 3152 ofl->ofl_preiarray) == S_ERROR) 3153 return (S_ERROR); 3154 3155 /* 3156 * Make the .plt section. This occurs after any other relocation 3157 * sections are generated (see reloc_init()) to ensure that the 3158 * associated relocation section is after all the other relocation 3159 * sections. 3160 */ 3161 if ((ofl->ofl_pltcnt) || (ofl->ofl_pltpad)) 3162 if (make_plt(ofl) == S_ERROR) 3163 return (S_ERROR); 3164 3165 /* 3166 * Determine whether any sections or files are not referenced. Under 3167 * -Dunused a diagnostic for any unused components is generated, under 3168 * -zignore the component is removed from the final output. 3169 */ 3170 if (DBG_ENABLED || (ofl->ofl_flags1 & FLG_OF1_IGNPRC)) { 3171 if (ignore_section_processing(ofl) == S_ERROR) 3172 return (S_ERROR); 3173 } 3174 3175 /* 3176 * If we have detected a situation in which previously placed 3177 * output sections may have been discarded, perform the necessary 3178 * readjustment. 3179 */ 3180 if (ofl->ofl_flags & FLG_OF_ADJOSCNT) 3181 adjust_os_count(ofl); 3182 3183 /* 3184 * Do any of the output sections contain input sections that 3185 * are candidates for string table merging? For each such case, 3186 * we create a replacement section, insert it, and discard the 3187 * originals. 3188 * 3189 * rel_alpp and sym_alpp are used by ld_make_strmerge() 3190 * for its internal processing. We are responsible for the 3191 * initialization and cleanup, and ld_make_strmerge() handles the rest. 3192 * This allows us to reuse a single pair of memory buffers, allocated 3193 * for this processing, for all the output sections. 3194 */ 3195 if ((ofl->ofl_flags1 & FLG_OF1_NCSTTAB) == 0) { 3196 int error_seen = 0; 3197 APlist *rel_alpp = NULL; 3198 APlist *sym_alpp = NULL; 3199 Aliste idx1; 3200 3201 for (APLIST_TRAVERSE(ofl->ofl_segs, idx1, sgp)) { 3202 Os_desc *osp; 3203 Aliste idx2; 3204 3205 for (APLIST_TRAVERSE(sgp->sg_osdescs, idx2, osp)) 3206 if ((osp->os_mstrisdescs != NULL) && 3207 (ld_make_strmerge(ofl, osp, 3208 &rel_alpp, &sym_alpp) == 3209 S_ERROR)) { 3210 error_seen = 1; 3211 break; 3212 } 3213 } 3214 if (rel_alpp != NULL) 3215 libld_free(rel_alpp); 3216 if (sym_alpp != NULL) 3217 libld_free(sym_alpp); 3218 if (error_seen != 0) 3219 return (S_ERROR); 3220 } 3221 3222 /* 3223 * Add any necessary versioning information. 3224 */ 3225 if (!(flags & FLG_OF_NOVERSEC)) { 3226 if ((flags & FLG_OF_VERNEED) && 3227 (make_verneed(ofl) == S_ERROR)) 3228 return (S_ERROR); 3229 if ((flags & FLG_OF_VERDEF) && 3230 (make_verdef(ofl) == S_ERROR)) 3231 return (S_ERROR); 3232 if ((flags & (FLG_OF_VERNEED | FLG_OF_VERDEF)) && 3233 ((ofl->ofl_osversym = make_sym_sec(ofl, 3234 MSG_ORIG(MSG_SCN_SUNWVERSYM), SHT_SUNW_versym, 3235 ld_targ.t_id.id_version)) == (Os_desc*)S_ERROR)) 3236 return (S_ERROR); 3237 } 3238 3239 /* 3240 * Create a syminfo section if necessary. 3241 */ 3242 if (flags & FLG_OF_SYMINFO) { 3243 if ((ofl->ofl_ossyminfo = make_sym_sec(ofl, 3244 MSG_ORIG(MSG_SCN_SUNWSYMINFO), SHT_SUNW_syminfo, 3245 ld_targ.t_id.id_syminfo)) == (Os_desc *)S_ERROR) 3246 return (S_ERROR); 3247 } 3248 3249 if (flags & FLG_OF_COMREL) { 3250 /* 3251 * If -zcombreloc is enabled then all relocations (except for 3252 * the PLT's) are coalesced into a single relocation section. 3253 */ 3254 if (ofl->ofl_reloccnt) { 3255 if (make_reloc(ofl, NULL) == S_ERROR) 3256 return (S_ERROR); 3257 } 3258 } else { 3259 Aliste idx1; 3260 3261 /* 3262 * Create the required output relocation sections. Note, new 3263 * sections may be added to the section list that is being 3264 * traversed. These insertions can move the elements of the 3265 * Alist such that a section descriptor is re-read. Recursion 3266 * is prevented by maintaining a previous section pointer and 3267 * insuring that this pointer isn't re-examined. 3268 */ 3269 for (APLIST_TRAVERSE(ofl->ofl_segs, idx1, sgp)) { 3270 Os_desc *osp, *posp = 0; 3271 Aliste idx2; 3272 3273 for (APLIST_TRAVERSE(sgp->sg_osdescs, idx2, osp)) { 3274 if ((osp != posp) && osp->os_szoutrels && 3275 (osp != ofl->ofl_osplt)) { 3276 if (make_reloc(ofl, osp) == S_ERROR) 3277 return (S_ERROR); 3278 } 3279 posp = osp; 3280 } 3281 } 3282 3283 /* 3284 * If we're not building a combined relocation section, then 3285 * build a .rel[a] section as required. 3286 */ 3287 if (ofl->ofl_relocrelsz) { 3288 if (make_reloc(ofl, NULL) == S_ERROR) 3289 return (S_ERROR); 3290 } 3291 } 3292 3293 /* 3294 * The PLT relocations are always in their own section, and we try to 3295 * keep them at the end of the PLT table. We do this to keep the hot 3296 * "data" PLT's at the head of the table nearer the .dynsym & .hash. 3297 */ 3298 if (ofl->ofl_osplt && ofl->ofl_relocpltsz) { 3299 if (make_reloc(ofl, ofl->ofl_osplt) == S_ERROR) 3300 return (S_ERROR); 3301 } 3302 3303 /* 3304 * Finally build the symbol and section header sections. 3305 */ 3306 if (flags & FLG_OF_DYNAMIC) { 3307 if (make_dynamic(ofl) == S_ERROR) 3308 return (S_ERROR); 3309 3310 /* 3311 * A number of sections aren't necessary within a relocatable 3312 * object, even if -dy has been used. 3313 */ 3314 if (!(flags & FLG_OF_RELOBJ)) { 3315 if (make_hash(ofl) == S_ERROR) 3316 return (S_ERROR); 3317 if (make_dynstr(ofl) == S_ERROR) 3318 return (S_ERROR); 3319 if (make_dynsym(ofl) == S_ERROR) 3320 return (S_ERROR); 3321 if (ld_unwind_make_hdr(ofl) == S_ERROR) 3322 return (S_ERROR); 3323 if (make_dynsort(ofl) == S_ERROR) 3324 return (S_ERROR); 3325 } 3326 } 3327 3328 if (!(flags & FLG_OF_STRIP) || (flags & FLG_OF_RELOBJ) || 3329 ((flags & FLG_OF_STATIC) && ofl->ofl_osversym)) { 3330 /* 3331 * Do we need to make a SHT_SYMTAB_SHNDX section 3332 * for the dynsym. If so - do it now. 3333 */ 3334 if (ofl->ofl_osdynsym && 3335 ((ofl->ofl_shdrcnt + 3) >= SHN_LORESERVE)) { 3336 if (make_dynsym_shndx(ofl) == S_ERROR) 3337 return (S_ERROR); 3338 } 3339 3340 if (make_strtab(ofl) == S_ERROR) 3341 return (S_ERROR); 3342 if (make_symtab(ofl) == S_ERROR) 3343 return (S_ERROR); 3344 } else { 3345 /* 3346 * Do we need to make a SHT_SYMTAB_SHNDX section 3347 * for the dynsym. If so - do it now. 3348 */ 3349 if (ofl->ofl_osdynsym && 3350 ((ofl->ofl_shdrcnt + 1) >= SHN_LORESERVE)) { 3351 if (make_dynsym_shndx(ofl) == S_ERROR) 3352 return (S_ERROR); 3353 } 3354 } 3355 3356 if (make_shstrtab(ofl) == S_ERROR) 3357 return (S_ERROR); 3358 3359 /* 3360 * Now that we've created all output sections, adjust the size of the 3361 * SHT_SUNW_versym and SHT_SUNW_syminfo section, which are dependent on 3362 * the associated symbol table sizes. 3363 */ 3364 if (ofl->ofl_osversym || ofl->ofl_ossyminfo) { 3365 ulong_t cnt; 3366 Is_desc *isp; 3367 Os_desc *osp; 3368 3369 if (OFL_IS_STATIC_OBJ(ofl)) 3370 osp = ofl->ofl_ossymtab; 3371 else 3372 osp = ofl->ofl_osdynsym; 3373 3374 isp = ld_os_first_isdesc(osp); 3375 cnt = (isp->is_shdr->sh_size / isp->is_shdr->sh_entsize); 3376 3377 if (ofl->ofl_osversym) 3378 update_data_size(ofl->ofl_osversym, cnt); 3379 3380 if (ofl->ofl_ossyminfo) 3381 update_data_size(ofl->ofl_ossyminfo, cnt); 3382 } 3383 3384 /* 3385 * Now that we've created all output sections, adjust the size of the 3386 * SHT_SUNW_capinfo, which is dependent on the associated symbol table 3387 * size. 3388 */ 3389 if (ofl->ofl_oscapinfo) { 3390 ulong_t cnt; 3391 3392 /* 3393 * Symbol capabilities symbols are placed directly after the 3394 * STT_FILE symbol, section symbols, and any register symbols. 3395 * Effectively these are the first of any series of demoted 3396 * (scoped) symbols. 3397 */ 3398 if (OFL_IS_STATIC_OBJ(ofl)) 3399 cnt = SYMTAB_ALL_CNT(ofl); 3400 else 3401 cnt = DYNSYM_ALL_CNT(ofl); 3402 3403 update_data_size(ofl->ofl_oscapinfo, cnt); 3404 } 3405 return (1); 3406 } 3407 3408 /* 3409 * Build an additional data section - used to back OBJT symbol definitions 3410 * added with a mapfile. 3411 */ 3412 Is_desc * 3413 ld_make_data(Ofl_desc *ofl, size_t size) 3414 { 3415 Shdr *shdr; 3416 Elf_Data *data; 3417 Is_desc *isec; 3418 3419 if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_DATA), 0, 3420 &isec, &shdr, &data) == S_ERROR) 3421 return ((Is_desc *)S_ERROR); 3422 3423 data->d_size = size; 3424 shdr->sh_size = (Xword)size; 3425 shdr->sh_flags |= SHF_WRITE; 3426 3427 if (aplist_append(&ofl->ofl_mapdata, isec, AL_CNT_OFL_MAPSECS) == NULL) 3428 return ((Is_desc *)S_ERROR); 3429 3430 return (isec); 3431 } 3432 3433 /* 3434 * Build an additional text section - used to back FUNC symbol definitions 3435 * added with a mapfile. 3436 */ 3437 Is_desc * 3438 ld_make_text(Ofl_desc *ofl, size_t size) 3439 { 3440 Shdr *shdr; 3441 Elf_Data *data; 3442 Is_desc *isec; 3443 3444 /* 3445 * Insure the size is sufficient to contain the minimum return 3446 * instruction. 3447 */ 3448 if (size < ld_targ.t_nf.nf_size) 3449 size = ld_targ.t_nf.nf_size; 3450 3451 if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_TEXT), 0, 3452 &isec, &shdr, &data) == S_ERROR) 3453 return ((Is_desc *)S_ERROR); 3454 3455 data->d_size = size; 3456 shdr->sh_size = (Xword)size; 3457 shdr->sh_flags |= SHF_EXECINSTR; 3458 3459 /* 3460 * Fill the buffer with the appropriate return instruction. 3461 * Note that there is no need to swap bytes on a non-native, 3462 * link, as the data being copied is given in bytes. 3463 */ 3464 if ((data->d_buf = libld_calloc(size, 1)) == NULL) 3465 return ((Is_desc *)S_ERROR); 3466 (void) memcpy(data->d_buf, ld_targ.t_nf.nf_template, 3467 ld_targ.t_nf.nf_size); 3468 3469 /* 3470 * If size was larger than required, and the target supplies 3471 * a fill function, use it to fill the balance. If there is no 3472 * fill function, we accept the 0-fill supplied by libld_calloc(). 3473 */ 3474 if ((ld_targ.t_ff.ff_execfill != NULL) && (size > ld_targ.t_nf.nf_size)) 3475 ld_targ.t_ff.ff_execfill(data->d_buf, ld_targ.t_nf.nf_size, 3476 size - ld_targ.t_nf.nf_size); 3477 3478 if (aplist_append(&ofl->ofl_maptext, isec, AL_CNT_OFL_MAPSECS) == NULL) 3479 return ((Is_desc *)S_ERROR); 3480 3481 return (isec); 3482 } 3483 3484 void 3485 ld_comdat_validate(Ofl_desc *ofl, Ifl_desc *ifl) 3486 { 3487 int i; 3488 3489 for (i = 0; i < ifl->ifl_shnum; i++) { 3490 Is_desc *isp = ifl->ifl_isdesc[i]; 3491 int types = 0; 3492 char buf[1024] = ""; 3493 Group_desc *gr = NULL; 3494 3495 if ((isp == NULL) || (isp->is_flags & FLG_IS_COMDAT) == 0) 3496 continue; 3497 3498 if (isp->is_shdr->sh_type == SHT_SUNW_COMDAT) { 3499 types++; 3500 (void) strlcpy(buf, MSG_ORIG(MSG_STR_SUNW_COMDAT), 3501 sizeof (buf)); 3502 } 3503 3504 if (strncmp(MSG_ORIG(MSG_SCN_GNU_LINKONCE), isp->is_name, 3505 MSG_SCN_GNU_LINKONCE_SIZE) == 0) { 3506 types++; 3507 if (types > 1) 3508 (void) strlcat(buf, ", ", sizeof (buf)); 3509 (void) strlcat(buf, MSG_ORIG(MSG_SCN_GNU_LINKONCE), 3510 sizeof (buf)); 3511 } 3512 3513 if ((isp->is_shdr->sh_flags & SHF_GROUP) && 3514 ((gr = ld_get_group(ofl, isp)) != NULL) && 3515 (gr->gd_data[0] & GRP_COMDAT)) { 3516 types++; 3517 if (types > 1) 3518 (void) strlcat(buf, ", ", sizeof (buf)); 3519 (void) strlcat(buf, MSG_ORIG(MSG_STR_GROUP), 3520 sizeof (buf)); 3521 } 3522 3523 if (types > 1) 3524 ld_eprintf(ofl, ERR_FATAL, 3525 MSG_INTL(MSG_SCN_MULTICOMDAT), ifl->ifl_name, 3526 EC_WORD(isp->is_scnndx), isp->is_name, buf); 3527 } 3528 }