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