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