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 2006 Sun Microsystems, Inc. All rights reserved. 27 * Use is subject to license terms. 28 */ 29 #pragma ident "%Z%%M% %I% %E% SMI" 30 31 /* 32 * Module sections. Initialize special sections 33 */ 34 #include <string.h> 35 #include <strings.h> 36 #include <stdio.h> 37 #include <link.h> 38 #include <debug.h> 39 #include "msg.h" 40 #include "_libld.h" 41 42 43 /* 44 * If -zignore is in effect, scan all input sections to see if there are any 45 * which haven't been referenced (and hence can be discarded). If sections are 46 * to be discarded, rescan the output relocations and the symbol table and 47 * remove the relocations and symbol entries that are no longer required. 48 * 49 * Note: It's possible that a section which is being discarded has contributed 50 * to the GOT table or the PLT table. However, we can't at this point 51 * eliminate the corresponding entries. This is because there could well 52 * be other sections referencing those same entries, but we don't have 53 * the infrastructure to determine this. So, keep the PLT and GOT 54 * entries in the table in case someone wants them. 55 * Note: The section to be affected needs to be allocatable. 56 * So even if -zignore is in effect, if the section is not allocatable, 57 * we do not eliminate it. 58 */ 59 static uintptr_t 60 ignore_section_processing(Ofl_desc *ofl) 61 { 62 Listnode *lnp; 63 Ifl_desc *ifl; 64 Rel_cache *rcp; 65 66 for (LIST_TRAVERSE(&ofl->ofl_objs, lnp, ifl)) { 67 uint_t num, discard; 68 69 /* 70 * Diagnose (-D unused) a completely unreferenced file. 71 */ 72 if ((ifl->ifl_flags & FLG_IF_FILEREF) == 0) 73 DBG_CALL(Dbg_unused_file(ofl->ofl_lml, 74 ifl->ifl_name, 0, 0)); 75 if (((ofl->ofl_flags1 & FLG_OF1_IGNPRC) == 0) || 76 ((ifl->ifl_flags & FLG_IF_IGNORE) == 0)) 77 continue; 78 79 /* 80 * Before scanning the whole symbol table to determine if 81 * symbols should be discard - quickly (relatively) scan the 82 * sections to determine if any are to be discarded. 83 */ 84 discard = 0; 85 if (ifl->ifl_flags & FLG_IF_FILEREF) { 86 for (num = 1; num < ifl->ifl_shnum; num++) { 87 Is_desc *isp = ifl->ifl_isdesc[num]; 88 Os_desc *osp; 89 Sg_desc *sgp; 90 91 if (((isp = ifl->ifl_isdesc[num]) != 0) && 92 ((isp->is_flags & FLG_IS_SECTREF) == 0) && 93 ((osp = isp->is_osdesc) != 0) && 94 ((sgp = osp->os_sgdesc) != 0) && 95 (sgp->sg_phdr.p_type == PT_LOAD)) { 96 discard++; 97 break; 98 } 99 } 100 } 101 102 /* 103 * No sections are to be 'ignored' 104 */ 105 if ((discard == 0) && (ifl->ifl_flags & FLG_IF_FILEREF)) 106 continue; 107 108 /* 109 * We know that we have discarded sections. Scan the symbol 110 * table for this file to determine if symbols need to be 111 * discarded that are associated with the 'ignored' sections. 112 */ 113 for (num = 1; num < ifl->ifl_symscnt; num++) { 114 Sym_desc *sdp; 115 Sym *symp; 116 Os_desc *osp; 117 /* LINTED - only used for assert() */ 118 int err; 119 120 sdp = ifl->ifl_oldndx[num]; 121 symp = sdp->sd_sym; 122 123 /* 124 * If the whole file is being eliminated, remove the 125 * local file symbol, and any COMMON symbols (which 126 * aren't associated with a section) provided they 127 * haven't been referenced by a relocation. 128 */ 129 if ((ofl->ofl_flags1 & FLG_OF1_IGNORE) && 130 ((ifl->ifl_flags & FLG_IF_FILEREF) == 0) && 131 ((ELF_ST_TYPE(symp->st_info) == STT_FILE) || 132 ((symp->st_shndx == SHN_COMMON) && 133 ((sdp->sd_flags & FLG_SY_UPREQD) == 0)))) { 134 if ((ofl->ofl_flags1 & FLG_OF1_REDLSYM) == 0) { 135 ofl->ofl_locscnt--; 136 err = st_delstring(ofl->ofl_strtab, 137 sdp->sd_name); 138 assert(err != -1); 139 } 140 sdp->sd_flags |= FLG_SY_ISDISC; 141 continue; 142 } 143 144 /* 145 * Skip any undefined, reserved section symbols, already 146 * discarded or eliminated symbols. Also skip any 147 * symbols that don't originate from a section, or 148 * aren't defined from the file being examined. 149 */ 150 if ((symp->st_shndx == SHN_UNDEF) || 151 (symp->st_shndx >= SHN_LORESERVE) || 152 (ELF_ST_TYPE(symp->st_info) == STT_SECTION) || 153 (sdp->sd_flags & FLG_SY_ISDISC) || 154 (sdp->sd_flags1 & FLG_SY1_ELIM) || 155 (sdp->sd_isc == 0) || (sdp->sd_file != ifl)) 156 continue; 157 158 /* 159 * If any references were made against the section 160 * the symbol is being defined in - skip it. 161 */ 162 if ((sdp->sd_isc->is_flags & FLG_IS_SECTREF) || 163 ((ifl->ifl_flags & FLG_IF_FILEREF) && 164 ((osp = sdp->sd_isc->is_osdesc) != 0) && 165 (osp->os_sgdesc->sg_phdr.p_type != PT_LOAD))) 166 continue; 167 168 /* 169 * Finish processing any local symbols. 170 */ 171 if (ELF_ST_BIND(symp->st_info) == STB_LOCAL) { 172 if (ofl->ofl_flags1 & FLG_OF1_IGNORE) { 173 if ((ofl->ofl_flags1 & 174 FLG_OF1_REDLSYM) == 0) { 175 ofl->ofl_locscnt--; 176 177 err = st_delstring( 178 ofl->ofl_strtab, 179 sdp->sd_name); 180 assert(err != -1); 181 } 182 sdp->sd_flags |= FLG_SY_ISDISC; 183 } 184 DBG_CALL(Dbg_syms_discarded(ofl->ofl_lml, 185 sdp, sdp->sd_isc)); 186 continue; 187 } 188 189 /* 190 * Global symbols can only be eliminated when an objects 191 * interfaces (versioning/scoping) is defined. 192 */ 193 if (sdp->sd_flags1 & FLG_SY1_LOCL) { 194 if (ofl->ofl_flags1 & FLG_OF1_IGNORE) { 195 ofl->ofl_scopecnt--; 196 ofl->ofl_elimcnt++; 197 198 err = st_delstring(ofl->ofl_strtab, 199 sdp->sd_name); 200 assert(err != -1); 201 202 sdp->sd_flags1 |= FLG_SY1_ELIM; 203 } 204 DBG_CALL(Dbg_syms_discarded(ofl->ofl_lml, 205 sdp, sdp->sd_isc)); 206 continue; 207 } 208 } 209 } 210 211 if ((ofl->ofl_flags1 & FLG_OF1_IGNPRC) == 0) 212 return (1); 213 214 /* 215 * Scan all output relocations searching for those against discarded or 216 * ignored sections. If one is found, decrement the total outrel count. 217 */ 218 for (LIST_TRAVERSE(&ofl->ofl_outrels, lnp, rcp)) { 219 Rel_desc *orsp; 220 Os_desc *relosp; 221 222 /* LINTED */ 223 for (orsp = (Rel_desc *)(rcp + 1); 224 orsp < rcp->rc_free; orsp++) { 225 Is_desc *_isdesc = orsp->rel_isdesc; 226 uint_t flags, entsize; 227 Shdr *shdr; 228 Ifl_desc *ifl; 229 230 if ((_isdesc == 0) || 231 ((_isdesc->is_flags & (FLG_IS_SECTREF))) || 232 ((ifl = _isdesc->is_file) == 0) || 233 ((ifl->ifl_flags & FLG_IF_IGNORE) == 0) || 234 ((shdr = _isdesc->is_shdr) == 0) || 235 ((shdr->sh_flags & SHF_ALLOC) == 0)) 236 continue; 237 238 flags = orsp->rel_flags; 239 240 if (flags & (FLG_REL_GOT | FLG_REL_BSS | 241 FLG_REL_NOINFO | FLG_REL_PLT)) 242 continue; 243 244 relosp = orsp->rel_osdesc; 245 246 if (orsp->rel_flags & FLG_REL_RELA) 247 entsize = sizeof (Rela); 248 else 249 entsize = sizeof (Rel); 250 251 assert(relosp->os_szoutrels > 0); 252 relosp->os_szoutrels -= entsize; 253 254 if (!(flags & FLG_REL_PLT)) 255 ofl->ofl_reloccntsub++; 256 257 if (orsp->rel_rtype == M_R_RELATIVE) 258 ofl->ofl_relocrelcnt--; 259 } 260 } 261 return (1); 262 } 263 264 /* 265 * Build a .bss section for allocation of tentative definitions. Any `static' 266 * .bss definitions would have been associated to their own .bss sections and 267 * thus collected from the input files. `global' .bss definitions are tagged 268 * as COMMON and do not cause any associated .bss section elements to be 269 * generated. Here we add up all these COMMON symbols and generate the .bss 270 * section required to represent them. 271 */ 272 uintptr_t 273 ld_make_bss(Ofl_desc *ofl, Xword size, Xword align, Bss_Type which) 274 { 275 Shdr *shdr; 276 Elf_Data *data; 277 Is_desc *isec; 278 Os_desc *osp; 279 uint_t ident; 280 Xword rsize = (Xword)ofl->ofl_relocbsssz; 281 282 /* 283 * Allocate and initialize the Elf_Data structure. 284 */ 285 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 286 return (S_ERROR); 287 data->d_type = ELF_T_BYTE; 288 data->d_size = (size_t)size; 289 data->d_align = (size_t)align; 290 data->d_version = ofl->ofl_dehdr->e_version; 291 292 /* 293 * Allocate and initialize the Shdr structure. 294 */ 295 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 296 return (S_ERROR); 297 shdr->sh_type = SHT_NOBITS; 298 shdr->sh_flags = SHF_ALLOC | SHF_WRITE; 299 shdr->sh_size = size; 300 shdr->sh_addralign = align; 301 302 /* 303 * Allocate and initialize the Is_desc structure. 304 */ 305 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 306 return (S_ERROR); 307 308 isec->is_shdr = shdr; 309 isec->is_indata = data; 310 311 if (which == MAKE_TLS) { 312 isec->is_name = MSG_ORIG(MSG_SCN_TBSS); 313 ident = M_ID_TLSBSS; 314 ofl->ofl_istlsbss = isec; 315 shdr->sh_flags |= SHF_TLS; 316 317 } else if (which == MAKE_BSS) { 318 isec->is_name = MSG_ORIG(MSG_SCN_BSS); 319 ofl->ofl_isbss = isec; 320 ident = M_ID_BSS; 321 322 #if (defined(__i386) || defined(__amd64)) && defined(_ELF64) 323 } else if (which == MAKE_LBSS) { 324 isec->is_name = MSG_ORIG(MSG_SCN_LBSS); 325 ofl->ofl_islbss = isec; 326 ident = M_ID_LBSS; 327 shdr->sh_flags |= SHF_AMD64_LARGE; 328 #endif 329 } 330 331 /* 332 * Retain this .bss input section as this will be where global 333 * symbol references are added. 334 */ 335 if ((osp = ld_place_section(ofl, isec, ident, 0)) == (Os_desc *)S_ERROR) 336 return (S_ERROR); 337 338 /* 339 * If relocations exist against .*bss section, a 340 * section symbol must be created for the section in 341 * the .dynsym symbol table. 342 */ 343 if (!(osp->os_flags & FLG_OS_OUTREL)) { 344 Word flagtotest; 345 if (which == MAKE_TLS) 346 flagtotest = FLG_OF1_TLSOREL; 347 else 348 flagtotest = FLG_OF1_BSSOREL; 349 350 if (ofl->ofl_flags1 & flagtotest) { 351 ofl->ofl_dynshdrcnt++; 352 osp->os_flags |= FLG_OS_OUTREL; 353 } 354 } 355 356 osp->os_szoutrels = rsize; 357 358 return (1); 359 } 360 361 362 /* 363 * Build a SHT_{INIT|FINI|PREINIT}ARRAY section (specified via 364 * ld -z *array=name 365 */ 366 static uintptr_t 367 make_array(Ofl_desc *ofl, Word shtype, const char *sectname, List *list) 368 { 369 uint_t entcount; 370 Listnode *lnp; 371 Elf_Data *data; 372 Is_desc *isec; 373 Shdr *shdr; 374 Sym_desc *sdp; 375 Rel_desc reld; 376 Rela reloc; 377 Os_desc *osp; 378 379 if (list->head == NULL) 380 return (1); 381 382 entcount = 0; 383 for (LIST_TRAVERSE(list, lnp, sdp)) 384 entcount++; 385 386 /* 387 * Allocate and initialize the Elf_Data structure. 388 */ 389 if (((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) || 390 ((data->d_buf = libld_calloc(sizeof (Addr), entcount)) == 0)) 391 return (S_ERROR); 392 393 data->d_type = ELF_T_ADDR; 394 data->d_size = sizeof (Addr) * entcount; 395 data->d_align = sizeof (Addr); 396 data->d_version = ofl->ofl_dehdr->e_version; 397 398 /* 399 * Allocate and initialize the Shdr structure. 400 */ 401 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 402 return (S_ERROR); 403 shdr->sh_type = shtype; 404 shdr->sh_size = (Xword)data->d_size; 405 shdr->sh_entsize = sizeof (Addr); 406 shdr->sh_addralign = (Xword)data->d_align; 407 shdr->sh_flags = SHF_ALLOC | SHF_WRITE; 408 409 /* 410 * Allocate and initialize the Is_desc structure. 411 */ 412 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 413 return (S_ERROR); 414 isec->is_name = sectname; 415 isec->is_shdr = shdr; 416 isec->is_indata = data; 417 418 if (ld_place_section(ofl, isec, M_ID_ARRAY, 0) == (Os_desc *)S_ERROR) 419 return (S_ERROR); 420 421 osp = isec->is_osdesc; 422 423 if ((ofl->ofl_osinitarray == 0) && (shtype == SHT_INIT_ARRAY)) 424 ofl->ofl_osinitarray = osp; 425 if ((ofl->ofl_ospreinitarray == 0) && (shtype == SHT_PREINIT_ARRAY)) 426 ofl->ofl_ospreinitarray = osp; 427 else if ((ofl->ofl_osfiniarray == 0) && (shtype == SHT_FINI_ARRAY)) 428 ofl->ofl_osfiniarray = osp; 429 430 /* 431 * Create relocations against this section to initialize it to the 432 * function addresses. 433 */ 434 reld.rel_osdesc = osp; 435 reld.rel_isdesc = isec; 436 reld.rel_move = 0; 437 reld.rel_flags = FLG_REL_LOAD; 438 439 /* 440 * Fabricate the relocation information (as if a relocation record had 441 * been input - see init_rel()). 442 */ 443 reld.rel_rtype = M_R_ARRAYADDR; 444 reld.rel_roffset = 0; 445 reld.rel_raddend = 0; 446 reld.rel_typedata = 0; 447 448 /* 449 * Create a minimal relocation record to satisfy process_sym_reloc() 450 * debugging requirements. 451 */ 452 reloc.r_offset = 0; 453 reloc.r_info = ELF_R_INFO(0, M_R_ARRAYADDR); 454 reloc.r_addend = 0; 455 456 DBG_CALL(Dbg_reloc_generate(ofl->ofl_lml, osp, M_REL_SHT_TYPE)); 457 for (LIST_TRAVERSE(list, lnp, sdp)) { 458 reld.rel_sname = sdp->sd_name; 459 reld.rel_sym = sdp; 460 461 if (ld_process_sym_reloc(ofl, &reld, (Rel *)&reloc, isec, 462 MSG_INTL(MSG_STR_COMMAND)) == S_ERROR) 463 return (S_ERROR); 464 465 reld.rel_roffset += (Xword)sizeof (Addr); 466 reloc.r_offset = reld.rel_roffset; 467 } 468 469 return (1); 470 } 471 472 /* 473 * Build a comment section (-Qy option). 474 */ 475 static uintptr_t 476 make_comment(Ofl_desc *ofl) 477 { 478 Shdr *shdr; 479 Elf_Data *data; 480 Is_desc *isec; 481 482 /* 483 * Allocate and initialize the Elf_Data structure. 484 */ 485 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 486 return (S_ERROR); 487 data->d_type = ELF_T_BYTE; 488 data->d_buf = (void *)ofl->ofl_sgsid; 489 data->d_size = strlen(ofl->ofl_sgsid) + 1; 490 data->d_align = 1; 491 data->d_version = ofl->ofl_dehdr->e_version; 492 493 /* 494 * Allocate and initialize the Shdr structure. 495 */ 496 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 497 return (S_ERROR); 498 shdr->sh_type = SHT_PROGBITS; 499 shdr->sh_size = (Xword)data->d_size; 500 shdr->sh_addralign = 1; 501 502 /* 503 * Allocate and initialize the Is_desc structure. 504 */ 505 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 506 return (S_ERROR); 507 isec->is_name = MSG_ORIG(MSG_SCN_COMMENT); 508 isec->is_shdr = shdr; 509 isec->is_indata = data; 510 511 return ((uintptr_t)ld_place_section(ofl, isec, M_ID_NOTE, 0)); 512 } 513 514 /* 515 * Make the dynamic section. Calculate the size of any strings referenced 516 * within this structure, they will be added to the global string table 517 * (.dynstr). This routine should be called before make_dynstr(). 518 */ 519 static uintptr_t 520 make_dynamic(Ofl_desc *ofl) 521 { 522 Shdr *shdr; 523 Os_desc *osp; 524 Elf_Data *data; 525 Is_desc *isec; 526 size_t cnt = 0; 527 Listnode *lnp; 528 Ifl_desc *ifl; 529 Sym_desc *sdp; 530 size_t size; 531 Word flags = ofl->ofl_flags; 532 int unused = 0; 533 534 /* 535 * Allocate and initialize the Shdr structure. 536 */ 537 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 538 return (S_ERROR); 539 shdr->sh_type = SHT_DYNAMIC; 540 shdr->sh_flags = SHF_WRITE; 541 if (!(flags & FLG_OF_RELOBJ)) 542 shdr->sh_flags |= SHF_ALLOC; 543 shdr->sh_addralign = M_WORD_ALIGN; 544 if ((shdr->sh_entsize = (Xword)elf_fsize(ELF_T_DYN, 1, 545 ofl->ofl_dehdr->e_version)) == 0) { 546 eprintf(ofl->ofl_lml, ERR_ELF, MSG_INTL(MSG_ELF_FSIZE), 547 ofl->ofl_name); 548 return (S_ERROR); 549 } 550 551 /* 552 * Allocate and initialize the Elf_Data structure. 553 */ 554 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 555 return (S_ERROR); 556 data->d_type = ELF_T_DYN; 557 data->d_size = 0; 558 data->d_align = M_WORD_ALIGN; 559 data->d_version = ofl->ofl_dehdr->e_version; 560 561 /* 562 * Allocate and initialize the Is_desc structure. 563 */ 564 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 565 (Is_desc *)0) 566 return (S_ERROR); 567 isec->is_name = MSG_ORIG(MSG_SCN_DYNAMIC); 568 isec->is_shdr = shdr; 569 isec->is_indata = data; 570 571 osp = ofl->ofl_osdynamic = ld_place_section(ofl, isec, M_ID_DYNAMIC, 0); 572 573 /* 574 * Reserve entries for any needed dependencies. 575 */ 576 for (LIST_TRAVERSE(&ofl->ofl_sos, lnp, ifl)) { 577 Sdf_desc * sdf; 578 579 if (!(ifl->ifl_flags & (FLG_IF_NEEDED | FLG_IF_NEEDSTR))) 580 continue; 581 582 /* 583 * If this dependency didn't satisfy any symbol references, 584 * generate a debugging diagnostic (ld(1) -Dunused can be used 585 * to display these). If this is a standard needed dependency, 586 * and -z ignore is in effect, drop the dependency. Explicitly 587 * defined dependencies (i.e., -N dep) don't get dropped, and 588 * are flagged as being required to simplify update_odynamic() 589 * processing. 590 */ 591 if ((ifl->ifl_flags & FLG_IF_NEEDSTR) || 592 ((ifl->ifl_flags & FLG_IF_DEPREQD) == 0)) { 593 if (unused++ == 0) 594 DBG_CALL(Dbg_util_nl(ofl->ofl_lml, DBG_NL_STD)); 595 DBG_CALL(Dbg_unused_file(ofl->ofl_lml, ifl->ifl_soname, 596 (ifl->ifl_flags & FLG_IF_NEEDSTR), 0)); 597 598 if (ifl->ifl_flags & FLG_IF_NEEDSTR) 599 ifl->ifl_flags |= FLG_IF_DEPREQD; 600 else if (ifl->ifl_flags & FLG_IF_IGNORE) 601 continue; 602 } 603 604 /* 605 * If this object has an accompanying shared object definition 606 * determine if an alternative shared object name has been 607 * specified. 608 */ 609 if (((sdf = ifl->ifl_sdfdesc) != 0) && 610 (sdf->sdf_flags & FLG_SDF_SONAME)) 611 ifl->ifl_soname = sdf->sdf_soname; 612 613 /* 614 * If this object is a lazyload reserve a DT_POSFLAG1 entry. 615 */ 616 if (ifl->ifl_flags & (FLG_IF_LAZYLD | FLG_IF_GRPPRM)) 617 cnt++; 618 619 if (st_insert(ofl->ofl_dynstrtab, ifl->ifl_soname) == -1) 620 return (S_ERROR); 621 cnt++; 622 623 /* 624 * If the needed entry contains the $ORIGIN token make sure 625 * the associated DT_1_FLAGS entry is created. 626 */ 627 if (strstr(ifl->ifl_soname, MSG_ORIG(MSG_STR_ORIGIN))) { 628 ofl->ofl_dtflags_1 |= DF_1_ORIGIN; 629 ofl->ofl_dtflags |= DF_ORIGIN; 630 } 631 } 632 633 if (unused) 634 DBG_CALL(Dbg_util_nl(ofl->ofl_lml, DBG_NL_STD)); 635 636 /* 637 * Reserve entries for any per-symbol auxiliary/filter strings. 638 */ 639 if (ofl->ofl_dtsfltrs) { 640 /* LINTED */ 641 Dfltr_desc * dftp; 642 Aliste off; 643 644 for (ALIST_TRAVERSE(ofl->ofl_dtsfltrs, off, dftp)) 645 cnt++; 646 } 647 648 /* 649 * Reserve entries for any _init() and _fini() section addresses. 650 */ 651 if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_INIT_U), 652 SYM_NOHASH, 0, ofl)) != NULL) && sdp->sd_ref == REF_REL_NEED) { 653 sdp->sd_flags |= FLG_SY_UPREQD; 654 cnt++; 655 } 656 if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_FINI_U), 657 SYM_NOHASH, 0, ofl)) != NULL) && sdp->sd_ref == REF_REL_NEED) { 658 sdp->sd_flags |= FLG_SY_UPREQD; 659 cnt++; 660 } 661 662 /* 663 * Reserve entries for any soname, filter name (shared libs only), 664 * run-path pointers, cache names and audit requirements.. 665 */ 666 if (ofl->ofl_soname) { 667 cnt++; 668 if (st_insert(ofl->ofl_dynstrtab, ofl->ofl_soname) == -1) 669 return (S_ERROR); 670 } 671 if (ofl->ofl_filtees) { 672 cnt++; 673 if (st_insert(ofl->ofl_dynstrtab, ofl->ofl_filtees) == -1) 674 return (S_ERROR); 675 676 /* 677 * If the filtees entry contains the $ORIGIN token make sure 678 * the associated DT_1_FLAGS entry is created. 679 */ 680 if (strstr(ofl->ofl_filtees, MSG_ORIG(MSG_STR_ORIGIN))) { 681 ofl->ofl_dtflags_1 |= DF_1_ORIGIN; 682 ofl->ofl_dtflags |= DF_ORIGIN; 683 } 684 } 685 if (ofl->ofl_rpath) { 686 cnt += 2; /* DT_RPATH & DT_RUNPATH */ 687 if (st_insert(ofl->ofl_dynstrtab, ofl->ofl_rpath) == -1) 688 return (S_ERROR); 689 690 /* 691 * If the rpath entry contains the $ORIGIN token make sure 692 * the associated DT_1_FLAGS entry is created. 693 */ 694 if (strstr(ofl->ofl_rpath, MSG_ORIG(MSG_STR_ORIGIN))) { 695 ofl->ofl_dtflags_1 |= DF_1_ORIGIN; 696 ofl->ofl_dtflags |= DF_ORIGIN; 697 } 698 } 699 if (ofl->ofl_config) { 700 cnt++; 701 if (st_insert(ofl->ofl_dynstrtab, ofl->ofl_config) == -1) 702 return (S_ERROR); 703 704 /* 705 * If the config entry contains the $ORIGIN token make sure 706 * the associated DT_1_FLAGS entry is created. 707 */ 708 if (strstr(ofl->ofl_config, MSG_ORIG(MSG_STR_ORIGIN))) { 709 ofl->ofl_dtflags_1 |= DF_1_ORIGIN; 710 ofl->ofl_dtflags |= DF_ORIGIN; 711 } 712 } 713 if (ofl->ofl_depaudit) { 714 cnt++; 715 if (st_insert(ofl->ofl_dynstrtab, ofl->ofl_depaudit) == -1) 716 return (S_ERROR); 717 } 718 if (ofl->ofl_audit) { 719 cnt++; 720 if (st_insert(ofl->ofl_dynstrtab, ofl->ofl_audit) == -1) 721 return (S_ERROR); 722 } 723 724 725 /* 726 * The following DT_* entries do not apply to relocatable objects 727 */ 728 if (!(ofl->ofl_flags & FLG_OF_RELOBJ)) { 729 /* 730 * Reserve entries for the HASH, STRTAB, STRSZ, SYMTAB, SYMENT, 731 * and CHECKSUM. 732 */ 733 cnt += 6; 734 735 if ((flags & (FLG_OF_VERDEF | FLG_OF_NOVERSEC)) == 736 FLG_OF_VERDEF) 737 cnt += 2; /* DT_VERDEF & DT_VERDEFNUM */ 738 739 if ((flags & (FLG_OF_VERNEED | FLG_OF_NOVERSEC)) == 740 FLG_OF_VERNEED) 741 cnt += 2; /* DT_VERNEED & DT_VERNEEDNUM */ 742 743 if ((ofl->ofl_flags1 & FLG_OF1_RELCNT) && 744 ofl->ofl_relocrelcnt) /* RELACOUNT */ 745 cnt++; 746 747 if (flags & FLG_OF_TEXTREL) /* TEXTREL */ 748 cnt++; 749 750 if (ofl->ofl_osfiniarray) /* FINI_ARRAY & FINI_ARRAYSZ */ 751 cnt += 2; 752 753 if (ofl->ofl_osinitarray) /* INIT_ARRAY & INIT_ARRAYSZ */ 754 cnt += 2; 755 756 if (ofl->ofl_ospreinitarray) /* PREINIT_ARRAY & */ 757 cnt += 2; /* PREINIT_ARRAYSZ */ 758 759 /* 760 * If we have plt's reserve a PLT, PLTSZ, PLTREL and JMPREL. 761 */ 762 if (ofl->ofl_pltcnt) 763 cnt += 3; 764 765 /* 766 * If pltpadding is needed (Sparcv9) 767 */ 768 if (ofl->ofl_pltpad) 769 cnt += 2; /* DT_PLTPAD & DT_PLTPADSZ */ 770 771 /* 772 * If we have any relocations reserve a REL, RELSZ and 773 * RELENT entry. 774 */ 775 if (ofl->ofl_relocsz) 776 cnt += 3; 777 778 /* 779 * If a syminfo section is required create SYMINFO, SYMINSZ, 780 * and SYMINENT entries. 781 */ 782 if (ofl->ofl_flags & FLG_OF_SYMINFO) 783 cnt += 3; 784 785 /* 786 * If there are any partially initialized sections allocate 787 * MOVEENT, MOVESZ and MOVETAB. 788 */ 789 if (ofl->ofl_osmove) 790 cnt += 3; 791 792 /* 793 * Allocate one DT_REGISTER entry for ever register symbol. 794 */ 795 cnt += ofl->ofl_regsymcnt; 796 797 /* 798 * Reserve a entry for each '-zrtldinfo=...' specified 799 * on the command line. 800 */ 801 for (LIST_TRAVERSE(&ofl->ofl_rtldinfo, lnp, sdp)) 802 cnt++; 803 804 /* 805 * These two entries should only be placed in a segment 806 * which is writable. If it's a read-only segment 807 * (due to mapfile magic, e.g. libdl.so.1) then don't allocate 808 * these entries. 809 */ 810 if ((osp->os_sgdesc) && 811 (osp->os_sgdesc->sg_phdr.p_flags & PF_W)) { 812 cnt++; /* FEATURE_1 */ 813 814 if (ofl->ofl_osinterp) 815 cnt++; /* DEBUG */ 816 } 817 818 /* 819 * Any hardware/software capabilities? 820 */ 821 if (ofl->ofl_oscap) 822 cnt++; /* SUNW_CAP */ 823 } 824 825 if (flags & FLG_OF_SYMBOLIC) 826 cnt++; /* SYMBOLIC */ 827 828 /* 829 * Account for Architecture dependent .dynamic entries, and defaults. 830 */ 831 ld_mach_make_dynamic(ofl, &cnt); 832 833 cnt += 3; /* DT_FLAGS, DT_FLAGS_1, */ 834 /* and DT_NULL */ 835 836 /* 837 * Determine the size of the section from the number of entries. 838 */ 839 size = cnt * (size_t)shdr->sh_entsize; 840 841 shdr->sh_size = (Xword)size; 842 data->d_size = size; 843 844 return ((uintptr_t)ofl->ofl_osdynamic); 845 } 846 847 /* 848 * Build the GOT section and its associated relocation entries. 849 */ 850 uintptr_t 851 ld_make_got(Ofl_desc *ofl) 852 { 853 Shdr *shdr; 854 Elf_Data *data; 855 Is_desc *isec; 856 size_t size = (size_t)ofl->ofl_gotcnt * M_GOT_ENTSIZE; 857 size_t rsize = (size_t)ofl->ofl_relocgotsz; 858 859 /* 860 * Allocate and initialize the Elf_Data structure. 861 */ 862 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 863 return (S_ERROR); 864 data->d_type = ELF_T_BYTE; 865 data->d_size = size; 866 data->d_align = M_WORD_ALIGN; 867 data->d_version = ofl->ofl_dehdr->e_version; 868 869 /* 870 * Allocate and initialize the Shdr structure. 871 */ 872 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 873 return (S_ERROR); 874 shdr->sh_type = SHT_PROGBITS; 875 shdr->sh_flags = SHF_ALLOC | SHF_WRITE; 876 shdr->sh_size = (Xword)size; 877 shdr->sh_addralign = M_WORD_ALIGN; 878 shdr->sh_entsize = M_GOT_ENTSIZE; 879 880 /* 881 * Allocate and initialize the Is_desc structure. 882 */ 883 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 884 return (S_ERROR); 885 isec->is_name = MSG_ORIG(MSG_SCN_GOT); 886 isec->is_shdr = shdr; 887 isec->is_indata = data; 888 889 if ((ofl->ofl_osgot = ld_place_section(ofl, isec, M_ID_GOT, 0)) == 890 (Os_desc *)S_ERROR) 891 return (S_ERROR); 892 893 ofl->ofl_osgot->os_szoutrels = (Xword)rsize; 894 895 return (1); 896 } 897 898 /* 899 * Build an interp section. 900 */ 901 static uintptr_t 902 make_interp(Ofl_desc *ofl) 903 { 904 Shdr *shdr; 905 Elf_Data *data; 906 Is_desc *isec; 907 const char *iname = ofl->ofl_interp; 908 size_t size; 909 910 /* 911 * We always build an .interp section for dynamic executables. However 912 * if the user has specifically specified an interpretor we'll build 913 * this section for any output (presumably the user knows what they are 914 * doing. refer ABI section 5-4, and ld.1 man page use of -I). 915 */ 916 if (((ofl->ofl_flags & (FLG_OF_DYNAMIC | FLG_OF_EXEC | 917 FLG_OF_RELOBJ)) != (FLG_OF_DYNAMIC | FLG_OF_EXEC)) && !iname) 918 return (1); 919 920 /* 921 * In the case of a dynamic executable supply a default interpretor 922 * if a specific interpreter has not been specified. 923 */ 924 if (iname == 0) { 925 if (ofl->ofl_dehdr->e_machine == EM_SPARCV9) 926 iname = ofl->ofl_interp = 927 MSG_ORIG(MSG_PTH_RTLD_SPARCV9); 928 else if (ofl->ofl_dehdr->e_machine == EM_AMD64) 929 iname = ofl->ofl_interp = 930 MSG_ORIG(MSG_PTH_RTLD_AMD64); 931 else 932 iname = ofl->ofl_interp = MSG_ORIG(MSG_PTH_RTLD); 933 } 934 935 size = strlen(iname) + 1; 936 937 /* 938 * Allocate and initialize the Elf_Data structure. 939 */ 940 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 941 return (S_ERROR); 942 data->d_type = ELF_T_BYTE; 943 data->d_size = size; 944 data->d_version = ofl->ofl_dehdr->e_version; 945 946 /* 947 * Allocate and initialize the Shdr structure. 948 */ 949 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 950 return (S_ERROR); 951 shdr->sh_type = SHT_PROGBITS; 952 shdr->sh_flags = SHF_ALLOC; 953 shdr->sh_size = (Xword)size; 954 955 /* 956 * Allocate and initialize the Is_desc structure. 957 */ 958 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 959 return (S_ERROR); 960 isec->is_name = MSG_ORIG(MSG_SCN_INTERP); 961 isec->is_shdr = shdr; 962 isec->is_indata = data; 963 964 ofl->ofl_osinterp = ld_place_section(ofl, isec, M_ID_INTERP, 0); 965 return ((uintptr_t)ofl->ofl_osinterp); 966 } 967 968 /* 969 * Build a hardware/software capabilities section. 970 */ 971 static uintptr_t 972 make_cap(Ofl_desc *ofl) 973 { 974 Shdr *shdr; 975 Elf_Data *data; 976 Is_desc *isec; 977 Os_desc *osec; 978 Cap *cap; 979 size_t size = 0; 980 981 /* 982 * Determine how many entries are required. 983 */ 984 if (ofl->ofl_hwcap_1) 985 size++; 986 if (ofl->ofl_sfcap_1) 987 size++; 988 if (size == 0) 989 return (1); 990 size++; /* Add CA_SUNW_NULL */ 991 992 /* 993 * Allocate and initialize the Elf_Data structure. 994 */ 995 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 996 return (S_ERROR); 997 data->d_type = ELF_T_CAP; 998 data->d_version = ofl->ofl_dehdr->e_version; 999 data->d_align = M_WORD_ALIGN; 1000 1001 /* 1002 * Allocate and initialize the Shdr structure. 1003 */ 1004 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1005 return (S_ERROR); 1006 shdr->sh_type = SHT_SUNW_cap; 1007 shdr->sh_flags = SHF_ALLOC; 1008 shdr->sh_addralign = M_WORD_ALIGN; 1009 if ((shdr->sh_entsize = (Xword)elf_fsize(ELF_T_CAP, 1, 1010 ofl->ofl_dehdr->e_version)) == 0) { 1011 eprintf(ofl->ofl_lml, ERR_ELF, MSG_INTL(MSG_ELF_FSIZE), 1012 ofl->ofl_name); 1013 return (S_ERROR); 1014 } 1015 1016 /* 1017 * Allocate and initialize the Is_desc structure. 1018 */ 1019 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 1020 return (S_ERROR); 1021 isec->is_name = MSG_ORIG(MSG_SCN_SUNWCAP); 1022 isec->is_shdr = shdr; 1023 isec->is_indata = data; 1024 1025 /* 1026 * Determine the size of the section, and create the data. 1027 */ 1028 size = size * (size_t)shdr->sh_entsize; 1029 shdr->sh_size = (Xword)size; 1030 data->d_size = size; 1031 if ((data->d_buf = libld_malloc(size)) == 0) 1032 return (S_ERROR); 1033 1034 cap = (Cap *)data->d_buf; 1035 if (ofl->ofl_hwcap_1) { 1036 cap->c_tag = CA_SUNW_HW_1; 1037 cap->c_un.c_val = ofl->ofl_hwcap_1; 1038 cap++; 1039 } 1040 if (ofl->ofl_sfcap_1) { 1041 cap->c_tag = CA_SUNW_SF_1; 1042 cap->c_un.c_val = ofl->ofl_sfcap_1; 1043 cap++; 1044 } 1045 cap->c_tag = CA_SUNW_NULL; 1046 cap->c_un.c_val = 0; 1047 1048 /* 1049 * If we're not creating a relocatable object, save the output section 1050 * to trigger the creation of an associated a program header. 1051 */ 1052 osec = ld_place_section(ofl, isec, M_ID_CAP, 0); 1053 if ((ofl->ofl_flags & FLG_OF_RELOBJ) == 0) 1054 ofl->ofl_oscap = osec; 1055 1056 return ((uintptr_t)osec); 1057 } 1058 1059 /* 1060 * Build the PLT section and its associated relocation entries. 1061 */ 1062 static uintptr_t 1063 make_plt(Ofl_desc *ofl) 1064 { 1065 Shdr *shdr; 1066 Elf_Data *data; 1067 Is_desc *isec; 1068 size_t size = (size_t)M_PLT_RESERVSZ + 1069 (((size_t)ofl->ofl_pltcnt + 1070 (size_t)ofl->ofl_pltpad) * M_PLT_ENTSIZE); 1071 size_t rsize = (size_t)ofl->ofl_relocpltsz; 1072 1073 #if defined(sparc) 1074 /* 1075 * Account for the NOP at the end of the plt. 1076 */ 1077 size += sizeof (Word); 1078 #endif 1079 1080 /* 1081 * Allocate and initialize the Elf_Data structure. 1082 */ 1083 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1084 return (S_ERROR); 1085 data->d_type = ELF_T_BYTE; 1086 data->d_size = size; 1087 data->d_align = M_PLT_ALIGN; 1088 data->d_version = ofl->ofl_dehdr->e_version; 1089 1090 /* 1091 * Allocate and initialize the Shdr structure. 1092 */ 1093 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1094 return (S_ERROR); 1095 shdr->sh_type = SHT_PROGBITS; 1096 shdr->sh_flags = M_PLT_SHF_FLAGS; 1097 shdr->sh_size = (Xword)size; 1098 shdr->sh_addralign = M_PLT_ALIGN; 1099 shdr->sh_entsize = M_PLT_ENTSIZE; 1100 1101 /* 1102 * Allocate and initialize the Is_desc structure. 1103 */ 1104 if ((isec = libld_calloc(1, sizeof (Is_desc))) == (Is_desc *)0) 1105 return (S_ERROR); 1106 isec->is_name = MSG_ORIG(MSG_SCN_PLT); 1107 isec->is_shdr = shdr; 1108 isec->is_indata = data; 1109 1110 if ((ofl->ofl_osplt = ld_place_section(ofl, isec, M_ID_PLT, 0)) == 1111 (Os_desc *)S_ERROR) 1112 return (S_ERROR); 1113 1114 ofl->ofl_osplt->os_szoutrels = (Xword)rsize; 1115 1116 return (1); 1117 } 1118 1119 /* 1120 * Make the hash table. Only built for dynamic executables and shared 1121 * libraries, and provides hashed lookup into the global symbol table 1122 * (.dynsym) for the run-time linker to resolve symbol lookups. 1123 */ 1124 static uintptr_t 1125 make_hash(Ofl_desc *ofl) 1126 { 1127 Shdr *shdr; 1128 Elf_Data *data; 1129 Is_desc *isec; 1130 size_t size; 1131 Word nsyms = ofl->ofl_globcnt; 1132 size_t cnt; 1133 1134 /* 1135 * Allocate and initialize the Elf_Data structure. 1136 */ 1137 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1138 return (S_ERROR); 1139 data->d_type = ELF_T_WORD; 1140 data->d_align = M_WORD_ALIGN; 1141 data->d_version = ofl->ofl_dehdr->e_version; 1142 1143 /* 1144 * Allocate and initialize the Shdr structure. 1145 */ 1146 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1147 return (S_ERROR); 1148 shdr->sh_type = SHT_HASH; 1149 shdr->sh_flags = SHF_ALLOC; 1150 shdr->sh_addralign = M_WORD_ALIGN; 1151 if ((shdr->sh_entsize = (Xword)elf_fsize(ELF_T_WORD, 1, 1152 ofl->ofl_dehdr->e_version)) == 0) { 1153 eprintf(ofl->ofl_lml, ERR_ELF, MSG_INTL(MSG_ELF_FSIZE), 1154 ofl->ofl_name); 1155 return (S_ERROR); 1156 } 1157 1158 /* 1159 * Allocate and initialize the Is_desc structure. 1160 */ 1161 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 1162 return (S_ERROR); 1163 isec->is_name = MSG_ORIG(MSG_SCN_HASH); 1164 isec->is_shdr = shdr; 1165 isec->is_indata = data; 1166 1167 /* 1168 * Place the section first since it will affect the local symbol 1169 * count. 1170 */ 1171 if ((ofl->ofl_oshash = ld_place_section(ofl, isec, M_ID_HASH, 0)) == 1172 (Os_desc *)S_ERROR) 1173 return (S_ERROR); 1174 1175 /* 1176 * Calculate the number of output hash buckets. 1177 */ 1178 ofl->ofl_hashbkts = findprime(nsyms); 1179 1180 /* 1181 * The size of the hash table is determined by 1182 * 1183 * i. the initial nbucket and nchain entries (2) 1184 * ii. the number of buckets (calculated above) 1185 * iii. the number of chains (this is based on the number of 1186 * symbols in the .dynsym array + NULL symbol). 1187 */ 1188 cnt = 2 + ofl->ofl_hashbkts + (ofl->ofl_dynshdrcnt + 1189 ofl->ofl_globcnt + ofl->ofl_lregsymcnt + 1); 1190 size = cnt * shdr->sh_entsize; 1191 1192 /* 1193 * Finalize the section header and data buffer initialization. 1194 */ 1195 if ((data->d_buf = libld_calloc(size, 1)) == 0) 1196 return (S_ERROR); 1197 data->d_size = size; 1198 shdr->sh_size = (Xword)size; 1199 1200 return (1); 1201 } 1202 1203 /* 1204 * Generate the standard symbol table. Contains all locals and globals, 1205 * and resides in a non-allocatable section (ie. it can be stripped). 1206 */ 1207 static uintptr_t 1208 make_symtab(Ofl_desc *ofl) 1209 { 1210 Shdr *shdr; 1211 Elf_Data *data; 1212 Is_desc *isec; 1213 Is_desc *xisec = 0; 1214 size_t size; 1215 Word symcnt; 1216 1217 /* 1218 * Allocate and initialize the Elf_Data structure. 1219 */ 1220 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1221 return (S_ERROR); 1222 data->d_type = ELF_T_SYM; 1223 data->d_align = M_WORD_ALIGN; 1224 data->d_version = ofl->ofl_dehdr->e_version; 1225 1226 /* 1227 * Allocate and initialize the Shdr structure. 1228 */ 1229 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1230 return (S_ERROR); 1231 shdr->sh_type = SHT_SYMTAB; 1232 shdr->sh_addralign = M_WORD_ALIGN; 1233 if ((shdr->sh_entsize = (Xword)elf_fsize(ELF_T_SYM, 1, 1234 ofl->ofl_dehdr->e_version)) == 0) { 1235 eprintf(ofl->ofl_lml, ERR_ELF, MSG_INTL(MSG_ELF_FSIZE), 1236 ofl->ofl_name); 1237 return (S_ERROR); 1238 } 1239 1240 /* 1241 * Allocate and initialize the Is_desc structure. 1242 */ 1243 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 1244 return (S_ERROR); 1245 isec->is_name = MSG_ORIG(MSG_SCN_SYMTAB); 1246 isec->is_shdr = shdr; 1247 isec->is_indata = data; 1248 1249 /* 1250 * Place the section first since it will affect the local symbol 1251 * count. 1252 */ 1253 if ((ofl->ofl_ossymtab = ld_place_section(ofl, isec, M_ID_SYMTAB, 0)) == 1254 (Os_desc *)S_ERROR) 1255 return (S_ERROR); 1256 1257 /* 1258 * At this point we've created all but the 'shstrtab' section. 1259 * Determine if we have to use 'Extended Sections'. If so - then 1260 * also create a SHT_SYMTAB_SHNDX section. 1261 */ 1262 if ((ofl->ofl_shdrcnt + 1) >= SHN_LORESERVE) { 1263 Shdr *xshdr; 1264 Elf_Data *xdata; 1265 1266 if ((xdata = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1267 return (S_ERROR); 1268 xdata->d_type = ELF_T_WORD; 1269 xdata->d_align = M_WORD_ALIGN; 1270 xdata->d_version = ofl->ofl_dehdr->e_version; 1271 if ((xshdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1272 return (S_ERROR); 1273 xshdr->sh_type = SHT_SYMTAB_SHNDX; 1274 xshdr->sh_addralign = M_WORD_ALIGN; 1275 xshdr->sh_entsize = sizeof (Word); 1276 if ((xisec = libld_calloc(1, sizeof (Is_desc))) == 0) 1277 return (S_ERROR); 1278 xisec->is_name = MSG_ORIG(MSG_SCN_SYMTAB_SHNDX); 1279 xisec->is_shdr = xshdr; 1280 xisec->is_indata = xdata; 1281 if ((ofl->ofl_ossymshndx = ld_place_section(ofl, xisec, 1282 M_ID_SYMTAB_NDX, 0)) == (Os_desc *)S_ERROR) 1283 return (S_ERROR); 1284 } 1285 /* 1286 * Calculated number of symbols, which need to be augmented by 1287 * the null first entry, the FILE symbol, and the .shstrtab entry. 1288 */ 1289 symcnt = (size_t)(3 + ofl->ofl_shdrcnt + ofl->ofl_scopecnt + 1290 ofl->ofl_locscnt + ofl->ofl_globcnt); 1291 size = symcnt * shdr->sh_entsize; 1292 1293 /* 1294 * Finalize the section header and data buffer initialization. 1295 */ 1296 data->d_size = size; 1297 shdr->sh_size = (Xword)size; 1298 1299 /* 1300 * If we created a SHT_SYMTAB_SHNDX - then set it's sizes too. 1301 */ 1302 if (xisec) { 1303 size_t xsize = symcnt * sizeof (Word); 1304 1305 xisec->is_indata->d_size = xsize; 1306 xisec->is_shdr->sh_size = (Xword)xsize; 1307 } 1308 1309 return (1); 1310 } 1311 1312 1313 /* 1314 * Build a dynamic symbol table. Contains only globals symbols and resides 1315 * in the text segment of a dynamic executable or shared library. 1316 */ 1317 static uintptr_t 1318 make_dynsym(Ofl_desc *ofl) 1319 { 1320 Shdr *shdr; 1321 Elf_Data *data; 1322 Is_desc *isec; 1323 size_t size; 1324 Xword cnt; 1325 1326 /* 1327 * Allocate and initialize the Elf_Data structure. 1328 */ 1329 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1330 return (S_ERROR); 1331 data->d_type = ELF_T_SYM; 1332 data->d_align = M_WORD_ALIGN; 1333 data->d_version = ofl->ofl_dehdr->e_version; 1334 1335 /* 1336 * Allocate and initialize the Shdr structure. 1337 */ 1338 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1339 return (S_ERROR); 1340 shdr->sh_type = SHT_DYNSYM; 1341 shdr->sh_flags = SHF_ALLOC; 1342 shdr->sh_addralign = M_WORD_ALIGN; 1343 if ((shdr->sh_entsize = (Xword)elf_fsize(ELF_T_SYM, 1, 1344 ofl->ofl_dehdr->e_version)) == 0) { 1345 eprintf(ofl->ofl_lml, ERR_ELF, MSG_INTL(MSG_ELF_FSIZE), 1346 ofl->ofl_name); 1347 return (S_ERROR); 1348 } 1349 1350 /* 1351 * Allocate and initialize the Is_desc structure. 1352 */ 1353 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 1354 return (S_ERROR); 1355 isec->is_name = MSG_ORIG(MSG_SCN_DYNSYM); 1356 isec->is_shdr = shdr; 1357 isec->is_indata = data; 1358 1359 /* 1360 * Place the section first since it will affect the local symbol 1361 * count. 1362 */ 1363 if ((ofl->ofl_osdynsym = ld_place_section(ofl, isec, M_ID_DYNSYM, 0)) == 1364 (Os_desc *)S_ERROR) 1365 return (S_ERROR); 1366 1367 /* 1368 * One extra section header entry for the 'null' entry. 1369 */ 1370 cnt = 1 + ofl->ofl_dynshdrcnt + ofl->ofl_globcnt + ofl->ofl_lregsymcnt; 1371 size = (size_t)cnt * shdr->sh_entsize; 1372 1373 /* 1374 * Finalize the section header and data buffer initialization. 1375 */ 1376 data->d_size = size; 1377 shdr->sh_size = (Xword)size; 1378 1379 return (1); 1380 } 1381 1382 /* 1383 * Build a SHT_SYMTAB_SHNDX for the .dynsym 1384 */ 1385 static uintptr_t 1386 make_dynsym_shndx(Ofl_desc *ofl) 1387 { 1388 Is_desc *isec; 1389 Is_desc *dynsymisp; 1390 Shdr *shdr, *dynshdr; 1391 Elf_Data *data; 1392 1393 /* 1394 * Allocate the Elf_Data structure. 1395 */ 1396 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1397 return (S_ERROR); 1398 data->d_type = ELF_T_WORD; 1399 data->d_align = M_WORD_ALIGN; 1400 data->d_version = ofl->ofl_dehdr->e_version; 1401 1402 /* 1403 * Allocate the Shdr structure. 1404 */ 1405 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1406 return (S_ERROR); 1407 shdr->sh_type = SHT_SYMTAB_SHNDX; 1408 shdr->sh_addralign = M_WORD_ALIGN; 1409 shdr->sh_entsize = sizeof (Word); 1410 1411 /* 1412 * Allocate the Is_desc structure. 1413 */ 1414 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 1415 return (S_ERROR); 1416 isec->is_name = MSG_ORIG(MSG_SCN_DYNSYM_SHNDX); 1417 isec->is_shdr = shdr; 1418 isec->is_indata = data; 1419 1420 if ((ofl->ofl_osdynshndx = ld_place_section(ofl, isec, 1421 M_ID_DYNSYM_NDX, 0)) == (Os_desc *)S_ERROR) 1422 return (S_ERROR); 1423 1424 assert(ofl->ofl_osdynsym); 1425 dynsymisp = (Is_desc *)ofl->ofl_osdynsym->os_isdescs.head->data; 1426 dynshdr = dynsymisp->is_shdr; 1427 shdr->sh_size = (Xword)((dynshdr->sh_size / dynshdr->sh_entsize) * 1428 sizeof (Word)); 1429 data->d_size = shdr->sh_size; 1430 1431 return (1); 1432 } 1433 1434 1435 /* 1436 * Build a string table for the section headers. 1437 */ 1438 static uintptr_t 1439 make_shstrtab(Ofl_desc *ofl) 1440 { 1441 Shdr *shdr; 1442 Elf_Data *data; 1443 Is_desc *isec; 1444 size_t size; 1445 1446 /* 1447 * Allocate the Elf_Data structure. 1448 */ 1449 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1450 return (S_ERROR); 1451 data->d_type = ELF_T_BYTE; 1452 data->d_align = 1; 1453 data->d_version = ofl->ofl_dehdr->e_version; 1454 1455 /* 1456 * Allocate the Shdr structure. 1457 */ 1458 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1459 return (S_ERROR); 1460 shdr->sh_type = SHT_STRTAB; 1461 shdr->sh_flags |= SHF_STRINGS; 1462 shdr->sh_addralign = 1; 1463 1464 /* 1465 * Allocate the Is_desc structure. 1466 */ 1467 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 1468 return (S_ERROR); 1469 isec->is_name = MSG_ORIG(MSG_SCN_SHSTRTAB); 1470 isec->is_shdr = shdr; 1471 isec->is_indata = data; 1472 1473 /* 1474 * Place the section first, as it may effect the number of section 1475 * headers to account for. 1476 */ 1477 if ((ofl->ofl_osshstrtab = ld_place_section(ofl, isec, M_ID_NOTE, 0)) == 1478 (Os_desc *)S_ERROR) 1479 return (S_ERROR); 1480 1481 size = st_getstrtab_sz(ofl->ofl_shdrsttab); 1482 assert(size > 0); 1483 1484 assert(size > 0); 1485 1486 data->d_size = size; 1487 shdr->sh_size = (Xword)size; 1488 1489 return (1); 1490 } 1491 1492 /* 1493 * Build a string section for the standard symbol table. 1494 */ 1495 static uintptr_t 1496 make_strtab(Ofl_desc *ofl) 1497 { 1498 Shdr *shdr; 1499 Elf_Data *data; 1500 Is_desc *isec; 1501 size_t size; 1502 1503 /* 1504 * This string table consists of all the global and local symbols. 1505 * Account for null bytes at end of the file name and the beginning 1506 * of section. 1507 */ 1508 if (st_insert(ofl->ofl_strtab, ofl->ofl_name) == -1) 1509 return (S_ERROR); 1510 1511 size = st_getstrtab_sz(ofl->ofl_strtab); 1512 assert(size > 0); 1513 1514 /* 1515 * Allocate the Elf_Data structure. 1516 */ 1517 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1518 return (S_ERROR); 1519 data->d_size = size; 1520 data->d_type = ELF_T_BYTE; 1521 data->d_align = 1; 1522 data->d_version = ofl->ofl_dehdr->e_version; 1523 1524 /* 1525 * Allocate the Shdr structure. 1526 */ 1527 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1528 return (S_ERROR); 1529 shdr->sh_size = (Xword)size; 1530 shdr->sh_addralign = 1; 1531 shdr->sh_type = SHT_STRTAB; 1532 shdr->sh_flags |= SHF_STRINGS; 1533 1534 /* 1535 * Allocate and initialize the Is_desc structure. 1536 */ 1537 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 1538 return (S_ERROR); 1539 isec->is_name = MSG_ORIG(MSG_SCN_STRTAB); 1540 isec->is_shdr = shdr; 1541 isec->is_indata = data; 1542 1543 ofl->ofl_osstrtab = ld_place_section(ofl, isec, M_ID_STRTAB, 0); 1544 return ((uintptr_t)ofl->ofl_osstrtab); 1545 } 1546 1547 /* 1548 * Build a string table for the dynamic symbol table. 1549 */ 1550 static uintptr_t 1551 make_dynstr(Ofl_desc *ofl) 1552 { 1553 Shdr *shdr; 1554 Elf_Data *data; 1555 Is_desc *isec; 1556 size_t size; 1557 1558 /* 1559 * Account for any local, named register symbols. These locals are 1560 * required for reference from DT_REGISTER .dynamic entries. 1561 */ 1562 if (ofl->ofl_regsyms) { 1563 int ndx; 1564 1565 for (ndx = 0; ndx < ofl->ofl_regsymsno; ndx++) { 1566 Sym_desc * sdp; 1567 1568 if ((sdp = ofl->ofl_regsyms[ndx]) == 0) 1569 continue; 1570 1571 if (((sdp->sd_flags1 & FLG_SY1_LOCL) == 0) && 1572 (ELF_ST_BIND(sdp->sd_sym->st_info) != STB_LOCAL)) 1573 continue; 1574 1575 if (sdp->sd_sym->st_name == 0) 1576 continue; 1577 1578 if (st_insert(ofl->ofl_dynstrtab, sdp->sd_name) == -1) 1579 return (S_ERROR); 1580 } 1581 } 1582 1583 /* 1584 * Reserve entries for any per-symbol auxiliary/filter strings. 1585 */ 1586 if (ofl->ofl_dtsfltrs) { 1587 Dfltr_desc * dftp; 1588 Aliste off; 1589 1590 for (ALIST_TRAVERSE(ofl->ofl_dtsfltrs, off, dftp)) 1591 if (st_insert(ofl->ofl_dynstrtab, dftp->dft_str) == -1) 1592 return (S_ERROR); 1593 } 1594 1595 size = st_getstrtab_sz(ofl->ofl_dynstrtab); 1596 assert(size > 0); 1597 1598 /* 1599 * Allocate the Elf_Data structure. 1600 */ 1601 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1602 return (S_ERROR); 1603 data->d_type = ELF_T_BYTE; 1604 data->d_size = size; 1605 data->d_align = 1; 1606 data->d_version = ofl->ofl_dehdr->e_version; 1607 1608 /* 1609 * Allocate the Shdr structure. 1610 */ 1611 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1612 return (S_ERROR); 1613 if (!(ofl->ofl_flags & FLG_OF_RELOBJ)) 1614 shdr->sh_flags = SHF_ALLOC; 1615 1616 shdr->sh_type = SHT_STRTAB; 1617 shdr->sh_flags |= SHF_STRINGS; 1618 shdr->sh_size = (Xword)size; 1619 shdr->sh_addralign = 1; 1620 1621 /* 1622 * Allocate and initialize the Is_desc structure. 1623 */ 1624 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 1625 return (S_ERROR); 1626 isec->is_name = MSG_ORIG(MSG_SCN_DYNSTR); 1627 isec->is_shdr = shdr; 1628 isec->is_indata = data; 1629 1630 ofl->ofl_osdynstr = ld_place_section(ofl, isec, M_ID_DYNSTR, 0); 1631 return ((uintptr_t)ofl->ofl_osdynstr); 1632 } 1633 1634 /* 1635 * Generate an output relocation section which will contain the relocation 1636 * information to be applied to the `osp' section. 1637 * 1638 * If (osp == NULL) then we are creating the coalesced relocation section 1639 * for an executable and/or a shared object. 1640 */ 1641 static uintptr_t 1642 make_reloc(Ofl_desc *ofl, Os_desc *osp) 1643 { 1644 Shdr *shdr; 1645 Elf_Data *data; 1646 Is_desc *isec; 1647 size_t size; 1648 Xword sh_flags; 1649 char *sectname; 1650 Os_desc *rosp; 1651 Word relsize; 1652 const char *rel_prefix; 1653 1654 /* LINTED */ 1655 if (M_REL_SHT_TYPE == SHT_REL) { 1656 /* REL */ 1657 relsize = sizeof (Rel); 1658 rel_prefix = MSG_ORIG(MSG_SCN_REL); 1659 } else { 1660 /* RELA */ 1661 relsize = sizeof (Rela); 1662 rel_prefix = MSG_ORIG(MSG_SCN_RELA); 1663 } 1664 1665 if (osp) { 1666 size = osp->os_szoutrels; 1667 sh_flags = osp->os_shdr->sh_flags; 1668 if ((sectname = libld_malloc(strlen(rel_prefix) + 1669 strlen(osp->os_name) + 1)) == 0) 1670 return (S_ERROR); 1671 (void) strcpy(sectname, rel_prefix); 1672 (void) strcat(sectname, osp->os_name); 1673 } else if (ofl->ofl_flags1 & FLG_OF1_RELCNT) { 1674 size = (ofl->ofl_reloccnt - ofl->ofl_reloccntsub) * relsize; 1675 sh_flags = SHF_ALLOC; 1676 sectname = (char *)MSG_ORIG(MSG_SCN_SUNWRELOC); 1677 } else { 1678 size = ofl->ofl_relocrelsz; 1679 sh_flags = SHF_ALLOC; 1680 sectname = (char *)rel_prefix; 1681 } 1682 1683 /* 1684 * Keep track of total size of 'output relocations' (to be stored 1685 * in .dynamic) 1686 */ 1687 /* LINTED */ 1688 ofl->ofl_relocsz += (Xword)size; 1689 1690 /* 1691 * Allocate and initialize the Elf_Data structure. 1692 */ 1693 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1694 return (S_ERROR); 1695 data->d_type = M_REL_ELF_TYPE; 1696 data->d_size = size; 1697 data->d_align = M_WORD_ALIGN; 1698 data->d_version = ofl->ofl_dehdr->e_version; 1699 1700 /* 1701 * Allocate and initialize the Shdr structure. 1702 */ 1703 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1704 return (S_ERROR); 1705 shdr->sh_type = M_REL_SHT_TYPE; 1706 shdr->sh_size = (Xword)size; 1707 shdr->sh_addralign = M_WORD_ALIGN; 1708 shdr->sh_entsize = relsize; 1709 1710 if ((ofl->ofl_flags & FLG_OF_DYNAMIC) && 1711 !(ofl->ofl_flags & FLG_OF_RELOBJ) && 1712 (sh_flags & SHF_ALLOC)) 1713 shdr->sh_flags = SHF_ALLOC; 1714 1715 if (osp) { 1716 /* 1717 * The sh_info field of the SHT_REL* sections points to the 1718 * section the relocations are to be applied to. 1719 */ 1720 shdr->sh_flags |= SHF_INFO_LINK; 1721 } 1722 1723 1724 /* 1725 * Allocate and initialize the Is_desc structure. 1726 */ 1727 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 1728 return (S_ERROR); 1729 isec->is_shdr = shdr; 1730 isec->is_indata = data; 1731 isec->is_name = sectname; 1732 1733 1734 /* 1735 * Associate this relocation section to the section its going to 1736 * relocate. 1737 */ 1738 if ((rosp = ld_place_section(ofl, isec, M_ID_REL, 0)) == 1739 (Os_desc *)S_ERROR) 1740 return (S_ERROR); 1741 1742 if (osp) { 1743 Listnode *lnp; 1744 Is_desc *risp; 1745 1746 /* 1747 * We associate the input relocation sections - with 1748 * the newly created output relocation section. 1749 * 1750 * This is used primarily so that we can update 1751 * SHT_GROUP[sect_no] entries to point to the 1752 * created output relocation sections. 1753 */ 1754 for (LIST_TRAVERSE(&(osp->os_relisdescs), lnp, risp)) { 1755 risp->is_osdesc = rosp; 1756 1757 /* 1758 * If the input relocation section had the SHF_GROUP 1759 * flag set - propogate it to the output relocation 1760 * section. 1761 */ 1762 if (risp->is_shdr->sh_flags & SHF_GROUP) { 1763 rosp->os_shdr->sh_flags |= SHF_GROUP; 1764 break; 1765 } 1766 } 1767 osp->os_relosdesc = rosp; 1768 } else 1769 ofl->ofl_osrel = rosp; 1770 1771 /* 1772 * If this is the first relocation section we've encountered save it 1773 * so that the .dynamic entry can be initialized accordingly. 1774 */ 1775 if (ofl->ofl_osrelhead == (Os_desc *)0) 1776 ofl->ofl_osrelhead = rosp; 1777 1778 return (1); 1779 } 1780 1781 /* 1782 * Generate version needed section. 1783 */ 1784 static uintptr_t 1785 make_verneed(Ofl_desc *ofl) 1786 { 1787 Shdr *shdr; 1788 Elf_Data *data; 1789 Is_desc *isec; 1790 size_t size = ofl->ofl_verneedsz; 1791 1792 /* 1793 * Allocate and initialize the Elf_Data structure. 1794 */ 1795 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1796 return (S_ERROR); 1797 data->d_type = ELF_T_BYTE; 1798 data->d_size = size; 1799 data->d_align = M_WORD_ALIGN; 1800 data->d_version = ofl->ofl_dehdr->e_version; 1801 1802 /* 1803 * Allocate and initialize the Shdr structure. 1804 */ 1805 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1806 return (S_ERROR); 1807 shdr->sh_type = (Word)SHT_SUNW_verneed; 1808 shdr->sh_flags = SHF_ALLOC; 1809 shdr->sh_size = (Xword)size; 1810 shdr->sh_addralign = M_WORD_ALIGN; 1811 1812 /* 1813 * Allocate and initialize the Is_desc structure. 1814 */ 1815 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 1816 return (S_ERROR); 1817 isec->is_name = MSG_ORIG(MSG_SCN_SUNWVERSION); 1818 isec->is_shdr = shdr; 1819 isec->is_indata = data; 1820 1821 ofl->ofl_osverneed = ld_place_section(ofl, isec, M_ID_VERSION, 0); 1822 return ((uintptr_t)ofl->ofl_osverneed); 1823 } 1824 1825 /* 1826 * Generate a version definition section. 1827 * 1828 * o the SHT_SUNW_verdef section defines the versions that exist within this 1829 * image. 1830 */ 1831 static uintptr_t 1832 make_verdef(Ofl_desc *ofl) 1833 { 1834 Shdr *shdr; 1835 Elf_Data *data; 1836 Is_desc *isec; 1837 Ver_desc *vdp; 1838 size_t size; 1839 1840 /* 1841 * Reserve a string table entry for the base version dependency (other 1842 * dependencies have symbol representations, which will already be 1843 * accounted for during symbol processing). 1844 */ 1845 vdp = (Ver_desc *)ofl->ofl_verdesc.head->data; 1846 size = strlen(vdp->vd_name) + 1; 1847 1848 if (ofl->ofl_flags & FLG_OF_DYNAMIC) { 1849 if (st_insert(ofl->ofl_dynstrtab, vdp->vd_name) == -1) 1850 return (S_ERROR); 1851 } else { 1852 if (st_insert(ofl->ofl_strtab, vdp->vd_name) == -1) 1853 return (S_ERROR); 1854 } 1855 1856 /* 1857 * During version processing we calculated the total number of entries. 1858 * Allocate and initialize the Elf_Data structure. 1859 */ 1860 size = ofl->ofl_verdefsz; 1861 1862 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1863 return (S_ERROR); 1864 data->d_type = ELF_T_BYTE; 1865 data->d_size = size; 1866 data->d_align = M_WORD_ALIGN; 1867 data->d_version = ofl->ofl_dehdr->e_version; 1868 1869 /* 1870 * Allocate and initialize the Shdr structure. 1871 */ 1872 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1873 return (S_ERROR); 1874 shdr->sh_type = (Word)SHT_SUNW_verdef; 1875 shdr->sh_flags = SHF_ALLOC; 1876 shdr->sh_size = (Xword)size; 1877 shdr->sh_addralign = M_WORD_ALIGN; 1878 1879 /* 1880 * Allocate and initialize the Is_desc structure. 1881 */ 1882 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 1883 return (S_ERROR); 1884 isec->is_name = MSG_ORIG(MSG_SCN_SUNWVERSION); 1885 isec->is_shdr = shdr; 1886 isec->is_indata = data; 1887 1888 ofl->ofl_osverdef = ld_place_section(ofl, isec, M_ID_VERSION, 0); 1889 return ((uintptr_t)ofl->ofl_osverdef); 1890 } 1891 1892 /* 1893 * Common function used to build both the SHT_SUNW_versym 1894 * section and the SHT_SUNW_syminfo section. Each of these sections 1895 * provides additional symbol information. 1896 */ 1897 static Os_desc * 1898 make_sym_sec(Ofl_desc *ofl, const char *sectname, Word entsize, 1899 Word stype, int ident) 1900 { 1901 Shdr *shdr; 1902 Elf_Data *data; 1903 Is_desc *isec; 1904 1905 /* 1906 * Allocate and initialize the Elf_Data structures for the symbol index 1907 * array. 1908 */ 1909 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1910 return ((Os_desc *)S_ERROR); 1911 data->d_type = ELF_T_BYTE; 1912 data->d_align = M_WORD_ALIGN; 1913 data->d_version = ofl->ofl_dehdr->e_version; 1914 1915 /* 1916 * Allocate and initialize the Shdr structure. 1917 */ 1918 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1919 return ((Os_desc *)S_ERROR); 1920 shdr->sh_type = (Word)stype; 1921 shdr->sh_flags = SHF_ALLOC; 1922 shdr->sh_addralign = M_WORD_ALIGN; 1923 shdr->sh_entsize = entsize; 1924 1925 if (stype == SHT_SUNW_syminfo) { 1926 /* 1927 * The sh_info field of the SHT_*_syminfo section points 1928 * to the header index of the associated .dynamic section. 1929 */ 1930 shdr->sh_flags |= SHF_INFO_LINK; 1931 } 1932 1933 /* 1934 * Allocate and initialize the Is_desc structure. 1935 */ 1936 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 1937 return ((Os_desc *)S_ERROR); 1938 isec->is_name = sectname; 1939 isec->is_shdr = shdr; 1940 isec->is_indata = data; 1941 1942 return (ld_place_section(ofl, isec, ident, 0)); 1943 } 1944 1945 /* 1946 * Build a .sunwbss section for allocation of tentative definitions. 1947 */ 1948 uintptr_t 1949 ld_make_sunwbss(Ofl_desc *ofl, size_t size, Xword align) 1950 { 1951 Shdr *shdr; 1952 Elf_Data *data; 1953 Is_desc *isec; 1954 1955 /* 1956 * Allocate and initialize the Elf_Data structure. 1957 */ 1958 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1959 return (S_ERROR); 1960 data->d_type = ELF_T_BYTE; 1961 data->d_size = size; 1962 data->d_align = align; 1963 data->d_version = ofl->ofl_dehdr->e_version; 1964 1965 /* 1966 * Allocate and initialize the Shdr structure. 1967 */ 1968 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1969 return (S_ERROR); 1970 shdr->sh_type = SHT_NOBITS; 1971 shdr->sh_flags = SHF_ALLOC | SHF_WRITE; 1972 shdr->sh_size = (Xword)size; 1973 shdr->sh_addralign = align; 1974 1975 /* 1976 * Allocate and initialize the Is_desc structure. 1977 */ 1978 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 1979 return (S_ERROR); 1980 isec->is_name = MSG_ORIG(MSG_SCN_SUNWBSS); 1981 isec->is_shdr = shdr; 1982 isec->is_indata = data; 1983 1984 /* 1985 * Retain this .sunwbss input section as this will be where global 1986 * symbol references are added. 1987 */ 1988 ofl->ofl_issunwbss = isec; 1989 if (ld_place_section(ofl, isec, 0, 0) == (Os_desc *)S_ERROR) 1990 return (S_ERROR); 1991 1992 return (1); 1993 } 1994 1995 /* 1996 * This routine is called when -z nopartial is in effect. 1997 */ 1998 uintptr_t 1999 ld_make_sunwdata(Ofl_desc *ofl, size_t size, Xword align) 2000 { 2001 Shdr *shdr; 2002 Elf_Data *data; 2003 Is_desc *isec; 2004 Os_desc *osp; 2005 2006 /* 2007 * Allocate and initialize the Elf_Data structure. 2008 */ 2009 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 2010 return (S_ERROR); 2011 data->d_type = ELF_T_BYTE; 2012 data->d_size = size; 2013 if ((data->d_buf = libld_calloc(size, 1)) == 0) 2014 return (S_ERROR); 2015 data->d_align = (size_t)M_WORD_ALIGN; 2016 data->d_version = ofl->ofl_dehdr->e_version; 2017 2018 /* 2019 * Allocate and initialize the Shdr structure. 2020 */ 2021 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 2022 return (S_ERROR); 2023 shdr->sh_type = SHT_PROGBITS; 2024 shdr->sh_flags = SHF_ALLOC | SHF_WRITE; 2025 shdr->sh_size = (Xword)size; 2026 if (align == 0) 2027 shdr->sh_addralign = M_WORD_ALIGN; 2028 else 2029 shdr->sh_addralign = align; 2030 2031 /* 2032 * Allocate and initialize the Is_desc structure. 2033 */ 2034 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 2035 return (S_ERROR); 2036 isec->is_name = MSG_ORIG(MSG_SCN_SUNWDATA1); 2037 isec->is_shdr = shdr; 2038 isec->is_indata = data; 2039 2040 /* 2041 * Retain this .sunwdata1 input section as this will 2042 * be where global 2043 * symbol references are added. 2044 */ 2045 ofl->ofl_issunwdata1 = isec; 2046 if ((osp = ld_place_section(ofl, isec, M_ID_DATA, 0)) == 2047 (Os_desc *)S_ERROR) 2048 return (S_ERROR); 2049 2050 if (!(osp->os_flags & FLG_OS_OUTREL)) { 2051 ofl->ofl_dynshdrcnt++; 2052 osp->os_flags |= FLG_OS_OUTREL; 2053 } 2054 return (1); 2055 } 2056 2057 /* 2058 * Make .sunwmove section 2059 */ 2060 uintptr_t 2061 ld_make_sunwmove(Ofl_desc *ofl, int mv_nums) 2062 { 2063 Shdr *shdr; 2064 Elf_Data *data; 2065 Is_desc *isec; 2066 size_t size; 2067 Listnode *lnp1; 2068 Psym_info *psym; 2069 int cnt = 1; 2070 2071 /* 2072 * Generate the move input sections and output sections 2073 */ 2074 size = mv_nums * sizeof (Move); 2075 2076 /* 2077 * Allocate and initialize the Elf_Data structure. 2078 */ 2079 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 2080 return (S_ERROR); 2081 data->d_type = ELF_T_BYTE; 2082 if ((data->d_buf = libld_calloc(size, 1)) == 0) 2083 return (S_ERROR); 2084 data->d_size = size; 2085 data->d_align = sizeof (Lword); 2086 data->d_version = ofl->ofl_dehdr->e_version; 2087 2088 /* 2089 * Allocate and initialize the Shdr structure. 2090 */ 2091 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 2092 return (S_ERROR); 2093 shdr->sh_link = 0; 2094 shdr->sh_info = 0; 2095 shdr->sh_type = SHT_SUNW_move; 2096 shdr->sh_size = (Xword)size; 2097 shdr->sh_flags = SHF_ALLOC | SHF_WRITE; 2098 shdr->sh_addralign = sizeof (Lword); 2099 shdr->sh_entsize = sizeof (Move); 2100 2101 /* 2102 * Allocate and initialize the Is_desc structure. 2103 */ 2104 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 2105 return (S_ERROR); 2106 isec->is_name = MSG_ORIG(MSG_SCN_SUNWMOVE); 2107 isec->is_shdr = shdr; 2108 isec->is_indata = data; 2109 isec->is_file = 0; 2110 2111 /* 2112 * Copy move entries 2113 */ 2114 for (LIST_TRAVERSE(&ofl->ofl_parsym, lnp1, psym)) { 2115 Listnode * lnp2; 2116 Mv_itm * mvitm; 2117 2118 if (psym->psym_symd->sd_flags & FLG_SY_PAREXPN) 2119 continue; 2120 for (LIST_TRAVERSE(&(psym->psym_mvs), lnp2, mvitm)) { 2121 if ((mvitm->mv_flag & FLG_MV_OUTSECT) == 0) 2122 continue; 2123 mvitm->mv_oidx = cnt; 2124 cnt++; 2125 } 2126 } 2127 if ((ofl->ofl_osmove = ld_place_section(ofl, isec, 0, 0)) == 2128 (Os_desc *)S_ERROR) 2129 return (S_ERROR); 2130 2131 return (1); 2132 } 2133 2134 2135 /* 2136 * The following sections are built after all input file processing and symbol 2137 * validation has been carried out. The order is important (because the 2138 * addition of a section adds a new symbol there is a chicken and egg problem 2139 * of maintaining the appropriate counts). By maintaining a known order the 2140 * individual routines can compensate for later, known, additions. 2141 */ 2142 uintptr_t 2143 ld_make_sections(Ofl_desc *ofl) 2144 { 2145 Word flags = ofl->ofl_flags; 2146 Listnode *lnp1; 2147 Sg_desc *sgp; 2148 2149 /* 2150 * Generate any special sections. 2151 */ 2152 if (flags & FLG_OF_ADDVERS) 2153 if (make_comment(ofl) == S_ERROR) 2154 return (S_ERROR); 2155 2156 if (make_interp(ofl) == S_ERROR) 2157 return (S_ERROR); 2158 2159 if (make_cap(ofl) == S_ERROR) 2160 return (S_ERROR); 2161 2162 if (make_array(ofl, SHT_INIT_ARRAY, MSG_ORIG(MSG_SCN_INITARRAY), 2163 &ofl->ofl_initarray) == S_ERROR) 2164 return (S_ERROR); 2165 2166 if (make_array(ofl, SHT_FINI_ARRAY, MSG_ORIG(MSG_SCN_FINIARRAY), 2167 &ofl->ofl_finiarray) == S_ERROR) 2168 return (S_ERROR); 2169 2170 if (make_array(ofl, SHT_PREINIT_ARRAY, MSG_ORIG(MSG_SCN_PREINITARRAY), 2171 &ofl->ofl_preiarray) == S_ERROR) 2172 return (S_ERROR); 2173 2174 /* 2175 * Make the .plt section. This occurs after any other relocation 2176 * sections are generated (see reloc_init()) to ensure that the 2177 * associated relocation section is after all the other relocation 2178 * sections. 2179 */ 2180 if ((ofl->ofl_pltcnt) || (ofl->ofl_pltpad)) 2181 if (make_plt(ofl) == S_ERROR) 2182 return (S_ERROR); 2183 2184 /* 2185 * Determine whether any sections or files are not referenced. Under 2186 * -Dunused a diagnostic for any unused components is generated, under 2187 * -zignore the component is removed from the final output. 2188 */ 2189 if (DBG_ENABLED || (ofl->ofl_flags1 & FLG_OF1_IGNPRC)) { 2190 if (ignore_section_processing(ofl) == S_ERROR) 2191 return (S_ERROR); 2192 } 2193 2194 /* 2195 * Add any necessary versioning information. 2196 */ 2197 if ((flags & (FLG_OF_VERNEED | FLG_OF_NOVERSEC)) == FLG_OF_VERNEED) { 2198 if (make_verneed(ofl) == S_ERROR) 2199 return (S_ERROR); 2200 } 2201 if ((flags & (FLG_OF_VERDEF | FLG_OF_NOVERSEC)) == FLG_OF_VERDEF) { 2202 if (make_verdef(ofl) == S_ERROR) 2203 return (S_ERROR); 2204 if ((ofl->ofl_osversym = make_sym_sec(ofl, 2205 MSG_ORIG(MSG_SCN_SUNWVERSYM), sizeof (Versym), 2206 SHT_SUNW_versym, M_ID_VERSION)) == (Os_desc*)S_ERROR) 2207 return (S_ERROR); 2208 } 2209 2210 /* 2211 * Create a syminfo section is necessary. 2212 */ 2213 if (ofl->ofl_flags & FLG_OF_SYMINFO) { 2214 if ((ofl->ofl_ossyminfo = make_sym_sec(ofl, 2215 MSG_ORIG(MSG_SCN_SUNWSYMINFO), sizeof (Syminfo), 2216 SHT_SUNW_syminfo, M_ID_SYMINFO)) == (Os_desc *)S_ERROR) 2217 return (S_ERROR); 2218 } 2219 2220 if (ofl->ofl_flags1 & FLG_OF1_RELCNT) { 2221 /* 2222 * If -zcombreloc is enabled then all relocations (except for 2223 * the PLT's) are coalesced into a single relocation section. 2224 */ 2225 if (ofl->ofl_reloccnt) { 2226 if (make_reloc(ofl, NULL) == S_ERROR) 2227 return (S_ERROR); 2228 } 2229 } else { 2230 /* 2231 * Create the required output relocation sections. Note, new 2232 * sections may be added to the section list that is being 2233 * traversed. These insertions can move the elements of the 2234 * Alist such that a section descriptor is re-read. Recursion 2235 * is prevented by maintaining a previous section pointer and 2236 * insuring that this pointer isn't re-examined. 2237 */ 2238 for (LIST_TRAVERSE(&ofl->ofl_segs, lnp1, sgp)) { 2239 Os_desc **ospp, *posp = 0; 2240 Aliste off; 2241 2242 for (ALIST_TRAVERSE(sgp->sg_osdescs, off, ospp)) { 2243 Os_desc *osp = *ospp; 2244 2245 if ((osp != posp) && osp->os_szoutrels && 2246 (osp != ofl->ofl_osplt)) { 2247 if (make_reloc(ofl, osp) == S_ERROR) 2248 return (S_ERROR); 2249 } 2250 posp = osp; 2251 } 2252 } 2253 2254 /* 2255 * If we're not building a combined relocation section, then 2256 * build a .rel[a] section as required. 2257 */ 2258 if (ofl->ofl_relocrelsz) { 2259 if (make_reloc(ofl, NULL) == S_ERROR) 2260 return (S_ERROR); 2261 } 2262 } 2263 2264 /* 2265 * The PLT relocations are always in their own section, and we try to 2266 * keep them at the end of the PLT table. We do this to keep the hot 2267 * "data" PLT's at the head of the table nearer the .dynsym & .hash. 2268 */ 2269 if (ofl->ofl_osplt && ofl->ofl_relocpltsz) { 2270 if (make_reloc(ofl, ofl->ofl_osplt) == S_ERROR) 2271 return (S_ERROR); 2272 } 2273 2274 /* 2275 * Finally build the symbol and section header sections. 2276 */ 2277 if (flags & FLG_OF_DYNAMIC) { 2278 if (make_dynamic(ofl) == S_ERROR) 2279 return (S_ERROR); 2280 if (make_dynstr(ofl) == S_ERROR) 2281 return (S_ERROR); 2282 /* 2283 * There is no use for .hash and .dynsym sections in a 2284 * relocatable object. 2285 */ 2286 if (!(flags & FLG_OF_RELOBJ)) { 2287 if (make_hash(ofl) == S_ERROR) 2288 return (S_ERROR); 2289 if (make_dynsym(ofl) == S_ERROR) 2290 return (S_ERROR); 2291 #if (defined(__i386) || defined(__amd64)) && defined(_ELF64) 2292 if (make_amd64_unwindhdr(ofl) == S_ERROR) 2293 return (S_ERROR); 2294 #endif 2295 } 2296 } 2297 2298 if (!(flags & FLG_OF_STRIP) || (flags & FLG_OF_RELOBJ) || 2299 ((flags & FLG_OF_STATIC) && ofl->ofl_osversym)) { 2300 /* 2301 * Do we need to make a SHT_SYMTAB_SHNDX section 2302 * for the dynsym. If so - do it now. 2303 */ 2304 if (ofl->ofl_osdynsym && 2305 ((ofl->ofl_shdrcnt + 3) >= SHN_LORESERVE)) { 2306 if (make_dynsym_shndx(ofl) == S_ERROR) 2307 return (S_ERROR); 2308 } 2309 2310 if (make_strtab(ofl) == S_ERROR) 2311 return (S_ERROR); 2312 if (make_symtab(ofl) == S_ERROR) 2313 return (S_ERROR); 2314 } else { 2315 /* 2316 * Do we need to make a SHT_SYMTAB_SHNDX section 2317 * for the dynsym. If so - do it now. 2318 */ 2319 if (ofl->ofl_osdynsym && 2320 ((ofl->ofl_shdrcnt + 1) >= SHN_LORESERVE)) { 2321 if (make_dynsym_shndx(ofl) == S_ERROR) 2322 return (S_ERROR); 2323 } 2324 } 2325 2326 if (make_shstrtab(ofl) == S_ERROR) 2327 return (S_ERROR); 2328 2329 /* 2330 * Now that we've created all of our sections adjust the size 2331 * of SHT_SUNW_versym & SHT_SUNW_syminfo which are dependent on 2332 * the symbol table sizes. 2333 */ 2334 if (ofl->ofl_osversym || ofl->ofl_ossyminfo) { 2335 Shdr * shdr; 2336 Is_desc * isec; 2337 Elf_Data * data; 2338 size_t size; 2339 ulong_t cnt; 2340 2341 if ((flags & FLG_OF_RELOBJ) || (flags & FLG_OF_STATIC)) 2342 isec = (Is_desc *)ofl->ofl_ossymtab-> 2343 os_isdescs.head->data; 2344 else 2345 isec = (Is_desc *)ofl->ofl_osdynsym-> 2346 os_isdescs.head->data; 2347 cnt = isec->is_shdr->sh_size / isec->is_shdr->sh_entsize; 2348 2349 if (ofl->ofl_osversym) { 2350 isec = (Is_desc *)ofl->ofl_osversym->os_isdescs. 2351 head->data; 2352 data = isec->is_indata; 2353 shdr = ofl->ofl_osversym->os_shdr; 2354 size = cnt * shdr->sh_entsize; 2355 shdr->sh_size = (Xword)size; 2356 data->d_size = size; 2357 } 2358 if (ofl->ofl_ossyminfo) { 2359 isec = (Is_desc *)ofl->ofl_ossyminfo->os_isdescs. 2360 head->data; 2361 data = isec->is_indata; 2362 shdr = ofl->ofl_ossyminfo->os_shdr; 2363 size = cnt * shdr->sh_entsize; 2364 shdr->sh_size = (Xword)size; 2365 data->d_size = size; 2366 } 2367 } 2368 2369 return (1); 2370 } 2371