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 data->d_size = size; 1485 shdr->sh_size = (Xword)size; 1486 1487 return (1); 1488 } 1489 1490 /* 1491 * Build a string section for the standard symbol table. 1492 */ 1493 static uintptr_t 1494 make_strtab(Ofl_desc *ofl) 1495 { 1496 Shdr *shdr; 1497 Elf_Data *data; 1498 Is_desc *isec; 1499 size_t size; 1500 1501 /* 1502 * This string table consists of all the global and local symbols. 1503 * Account for null bytes at end of the file name and the beginning 1504 * of section. 1505 */ 1506 if (st_insert(ofl->ofl_strtab, ofl->ofl_name) == -1) 1507 return (S_ERROR); 1508 1509 size = st_getstrtab_sz(ofl->ofl_strtab); 1510 assert(size > 0); 1511 1512 /* 1513 * Allocate the Elf_Data structure. 1514 */ 1515 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1516 return (S_ERROR); 1517 data->d_size = size; 1518 data->d_type = ELF_T_BYTE; 1519 data->d_align = 1; 1520 data->d_version = ofl->ofl_dehdr->e_version; 1521 1522 /* 1523 * Allocate the Shdr structure. 1524 */ 1525 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1526 return (S_ERROR); 1527 shdr->sh_size = (Xword)size; 1528 shdr->sh_addralign = 1; 1529 shdr->sh_type = SHT_STRTAB; 1530 shdr->sh_flags |= SHF_STRINGS; 1531 1532 /* 1533 * Allocate and initialize the Is_desc structure. 1534 */ 1535 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 1536 return (S_ERROR); 1537 isec->is_name = MSG_ORIG(MSG_SCN_STRTAB); 1538 isec->is_shdr = shdr; 1539 isec->is_indata = data; 1540 1541 ofl->ofl_osstrtab = ld_place_section(ofl, isec, M_ID_STRTAB, 0); 1542 return ((uintptr_t)ofl->ofl_osstrtab); 1543 } 1544 1545 /* 1546 * Build a string table for the dynamic symbol table. 1547 */ 1548 static uintptr_t 1549 make_dynstr(Ofl_desc *ofl) 1550 { 1551 Shdr *shdr; 1552 Elf_Data *data; 1553 Is_desc *isec; 1554 size_t size; 1555 1556 /* 1557 * Account for any local, named register symbols. These locals are 1558 * required for reference from DT_REGISTER .dynamic entries. 1559 */ 1560 if (ofl->ofl_regsyms) { 1561 int ndx; 1562 1563 for (ndx = 0; ndx < ofl->ofl_regsymsno; ndx++) { 1564 Sym_desc * sdp; 1565 1566 if ((sdp = ofl->ofl_regsyms[ndx]) == 0) 1567 continue; 1568 1569 if (((sdp->sd_flags1 & FLG_SY1_LOCL) == 0) && 1570 (ELF_ST_BIND(sdp->sd_sym->st_info) != STB_LOCAL)) 1571 continue; 1572 1573 if (sdp->sd_sym->st_name == 0) 1574 continue; 1575 1576 if (st_insert(ofl->ofl_dynstrtab, sdp->sd_name) == -1) 1577 return (S_ERROR); 1578 } 1579 } 1580 1581 /* 1582 * Reserve entries for any per-symbol auxiliary/filter strings. 1583 */ 1584 if (ofl->ofl_dtsfltrs) { 1585 Dfltr_desc * dftp; 1586 Aliste off; 1587 1588 for (ALIST_TRAVERSE(ofl->ofl_dtsfltrs, off, dftp)) 1589 if (st_insert(ofl->ofl_dynstrtab, dftp->dft_str) == -1) 1590 return (S_ERROR); 1591 } 1592 1593 size = st_getstrtab_sz(ofl->ofl_dynstrtab); 1594 assert(size > 0); 1595 1596 /* 1597 * Allocate the Elf_Data structure. 1598 */ 1599 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1600 return (S_ERROR); 1601 data->d_type = ELF_T_BYTE; 1602 data->d_size = size; 1603 data->d_align = 1; 1604 data->d_version = ofl->ofl_dehdr->e_version; 1605 1606 /* 1607 * Allocate the Shdr structure. 1608 */ 1609 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1610 return (S_ERROR); 1611 if (!(ofl->ofl_flags & FLG_OF_RELOBJ)) 1612 shdr->sh_flags = SHF_ALLOC; 1613 1614 shdr->sh_type = SHT_STRTAB; 1615 shdr->sh_flags |= SHF_STRINGS; 1616 shdr->sh_size = (Xword)size; 1617 shdr->sh_addralign = 1; 1618 1619 /* 1620 * Allocate and initialize the Is_desc structure. 1621 */ 1622 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 1623 return (S_ERROR); 1624 isec->is_name = MSG_ORIG(MSG_SCN_DYNSTR); 1625 isec->is_shdr = shdr; 1626 isec->is_indata = data; 1627 1628 ofl->ofl_osdynstr = ld_place_section(ofl, isec, M_ID_DYNSTR, 0); 1629 return ((uintptr_t)ofl->ofl_osdynstr); 1630 } 1631 1632 /* 1633 * Generate an output relocation section which will contain the relocation 1634 * information to be applied to the `osp' section. 1635 * 1636 * If (osp == NULL) then we are creating the coalesced relocation section 1637 * for an executable and/or a shared object. 1638 */ 1639 static uintptr_t 1640 make_reloc(Ofl_desc *ofl, Os_desc *osp) 1641 { 1642 Shdr *shdr; 1643 Elf_Data *data; 1644 Is_desc *isec; 1645 size_t size; 1646 Xword sh_flags; 1647 char *sectname; 1648 Os_desc *rosp; 1649 Word relsize; 1650 const char *rel_prefix; 1651 1652 /* LINTED */ 1653 if (M_REL_SHT_TYPE == SHT_REL) { 1654 /* REL */ 1655 relsize = sizeof (Rel); 1656 rel_prefix = MSG_ORIG(MSG_SCN_REL); 1657 } else { 1658 /* RELA */ 1659 relsize = sizeof (Rela); 1660 rel_prefix = MSG_ORIG(MSG_SCN_RELA); 1661 } 1662 1663 if (osp) { 1664 size = osp->os_szoutrels; 1665 sh_flags = osp->os_shdr->sh_flags; 1666 if ((sectname = libld_malloc(strlen(rel_prefix) + 1667 strlen(osp->os_name) + 1)) == 0) 1668 return (S_ERROR); 1669 (void) strcpy(sectname, rel_prefix); 1670 (void) strcat(sectname, osp->os_name); 1671 } else if (ofl->ofl_flags1 & FLG_OF1_RELCNT) { 1672 size = (ofl->ofl_reloccnt - ofl->ofl_reloccntsub) * relsize; 1673 sh_flags = SHF_ALLOC; 1674 sectname = (char *)MSG_ORIG(MSG_SCN_SUNWRELOC); 1675 } else { 1676 size = ofl->ofl_relocrelsz; 1677 sh_flags = SHF_ALLOC; 1678 sectname = (char *)rel_prefix; 1679 } 1680 1681 /* 1682 * Keep track of total size of 'output relocations' (to be stored 1683 * in .dynamic) 1684 */ 1685 /* LINTED */ 1686 ofl->ofl_relocsz += (Xword)size; 1687 1688 /* 1689 * Allocate and initialize the Elf_Data structure. 1690 */ 1691 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1692 return (S_ERROR); 1693 data->d_type = M_REL_ELF_TYPE; 1694 data->d_size = size; 1695 data->d_align = M_WORD_ALIGN; 1696 data->d_version = ofl->ofl_dehdr->e_version; 1697 1698 /* 1699 * Allocate and initialize the Shdr structure. 1700 */ 1701 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1702 return (S_ERROR); 1703 shdr->sh_type = M_REL_SHT_TYPE; 1704 shdr->sh_size = (Xword)size; 1705 shdr->sh_addralign = M_WORD_ALIGN; 1706 shdr->sh_entsize = relsize; 1707 1708 if ((ofl->ofl_flags & FLG_OF_DYNAMIC) && 1709 !(ofl->ofl_flags & FLG_OF_RELOBJ) && 1710 (sh_flags & SHF_ALLOC)) 1711 shdr->sh_flags = SHF_ALLOC; 1712 1713 if (osp) { 1714 /* 1715 * The sh_info field of the SHT_REL* sections points to the 1716 * section the relocations are to be applied to. 1717 */ 1718 shdr->sh_flags |= SHF_INFO_LINK; 1719 } 1720 1721 1722 /* 1723 * Allocate and initialize the Is_desc structure. 1724 */ 1725 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 1726 return (S_ERROR); 1727 isec->is_shdr = shdr; 1728 isec->is_indata = data; 1729 isec->is_name = sectname; 1730 1731 1732 /* 1733 * Associate this relocation section to the section its going to 1734 * relocate. 1735 */ 1736 if ((rosp = ld_place_section(ofl, isec, M_ID_REL, 0)) == 1737 (Os_desc *)S_ERROR) 1738 return (S_ERROR); 1739 1740 if (osp) { 1741 Listnode *lnp; 1742 Is_desc *risp; 1743 1744 /* 1745 * We associate the input relocation sections - with 1746 * the newly created output relocation section. 1747 * 1748 * This is used primarily so that we can update 1749 * SHT_GROUP[sect_no] entries to point to the 1750 * created output relocation sections. 1751 */ 1752 for (LIST_TRAVERSE(&(osp->os_relisdescs), lnp, risp)) { 1753 risp->is_osdesc = rosp; 1754 1755 /* 1756 * If the input relocation section had the SHF_GROUP 1757 * flag set - propogate it to the output relocation 1758 * section. 1759 */ 1760 if (risp->is_shdr->sh_flags & SHF_GROUP) { 1761 rosp->os_shdr->sh_flags |= SHF_GROUP; 1762 break; 1763 } 1764 } 1765 osp->os_relosdesc = rosp; 1766 } else 1767 ofl->ofl_osrel = rosp; 1768 1769 /* 1770 * If this is the first relocation section we've encountered save it 1771 * so that the .dynamic entry can be initialized accordingly. 1772 */ 1773 if (ofl->ofl_osrelhead == (Os_desc *)0) 1774 ofl->ofl_osrelhead = rosp; 1775 1776 return (1); 1777 } 1778 1779 /* 1780 * Generate version needed section. 1781 */ 1782 static uintptr_t 1783 make_verneed(Ofl_desc *ofl) 1784 { 1785 Shdr *shdr; 1786 Elf_Data *data; 1787 Is_desc *isec; 1788 size_t size = ofl->ofl_verneedsz; 1789 1790 /* 1791 * Allocate and initialize the Elf_Data structure. 1792 */ 1793 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1794 return (S_ERROR); 1795 data->d_type = ELF_T_BYTE; 1796 data->d_size = size; 1797 data->d_align = M_WORD_ALIGN; 1798 data->d_version = ofl->ofl_dehdr->e_version; 1799 1800 /* 1801 * Allocate and initialize the Shdr structure. 1802 */ 1803 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1804 return (S_ERROR); 1805 shdr->sh_type = (Word)SHT_SUNW_verneed; 1806 shdr->sh_flags = SHF_ALLOC; 1807 shdr->sh_size = (Xword)size; 1808 shdr->sh_addralign = M_WORD_ALIGN; 1809 1810 /* 1811 * Allocate and initialize the Is_desc structure. 1812 */ 1813 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 1814 return (S_ERROR); 1815 isec->is_name = MSG_ORIG(MSG_SCN_SUNWVERSION); 1816 isec->is_shdr = shdr; 1817 isec->is_indata = data; 1818 1819 ofl->ofl_osverneed = ld_place_section(ofl, isec, M_ID_VERSION, 0); 1820 return ((uintptr_t)ofl->ofl_osverneed); 1821 } 1822 1823 /* 1824 * Generate a version definition section. 1825 * 1826 * o the SHT_SUNW_verdef section defines the versions that exist within this 1827 * image. 1828 */ 1829 static uintptr_t 1830 make_verdef(Ofl_desc *ofl) 1831 { 1832 Shdr *shdr; 1833 Elf_Data *data; 1834 Is_desc *isec; 1835 Ver_desc *vdp; 1836 size_t size; 1837 1838 /* 1839 * Reserve a string table entry for the base version dependency (other 1840 * dependencies have symbol representations, which will already be 1841 * accounted for during symbol processing). 1842 */ 1843 vdp = (Ver_desc *)ofl->ofl_verdesc.head->data; 1844 size = strlen(vdp->vd_name) + 1; 1845 1846 if (ofl->ofl_flags & FLG_OF_DYNAMIC) { 1847 if (st_insert(ofl->ofl_dynstrtab, vdp->vd_name) == -1) 1848 return (S_ERROR); 1849 } else { 1850 if (st_insert(ofl->ofl_strtab, vdp->vd_name) == -1) 1851 return (S_ERROR); 1852 } 1853 1854 /* 1855 * During version processing we calculated the total number of entries. 1856 * Allocate and initialize the Elf_Data structure. 1857 */ 1858 size = ofl->ofl_verdefsz; 1859 1860 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1861 return (S_ERROR); 1862 data->d_type = ELF_T_BYTE; 1863 data->d_size = size; 1864 data->d_align = M_WORD_ALIGN; 1865 data->d_version = ofl->ofl_dehdr->e_version; 1866 1867 /* 1868 * Allocate and initialize the Shdr structure. 1869 */ 1870 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1871 return (S_ERROR); 1872 shdr->sh_type = (Word)SHT_SUNW_verdef; 1873 shdr->sh_flags = SHF_ALLOC; 1874 shdr->sh_size = (Xword)size; 1875 shdr->sh_addralign = M_WORD_ALIGN; 1876 1877 /* 1878 * Allocate and initialize the Is_desc structure. 1879 */ 1880 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 1881 return (S_ERROR); 1882 isec->is_name = MSG_ORIG(MSG_SCN_SUNWVERSION); 1883 isec->is_shdr = shdr; 1884 isec->is_indata = data; 1885 1886 ofl->ofl_osverdef = ld_place_section(ofl, isec, M_ID_VERSION, 0); 1887 return ((uintptr_t)ofl->ofl_osverdef); 1888 } 1889 1890 /* 1891 * Common function used to build both the SHT_SUNW_versym 1892 * section and the SHT_SUNW_syminfo section. Each of these sections 1893 * provides additional symbol information. 1894 */ 1895 static Os_desc * 1896 make_sym_sec(Ofl_desc *ofl, const char *sectname, Word entsize, 1897 Word stype, int ident) 1898 { 1899 Shdr *shdr; 1900 Elf_Data *data; 1901 Is_desc *isec; 1902 1903 /* 1904 * Allocate and initialize the Elf_Data structures for the symbol index 1905 * array. 1906 */ 1907 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1908 return ((Os_desc *)S_ERROR); 1909 data->d_type = ELF_T_BYTE; 1910 data->d_align = M_WORD_ALIGN; 1911 data->d_version = ofl->ofl_dehdr->e_version; 1912 1913 /* 1914 * Allocate and initialize the Shdr structure. 1915 */ 1916 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1917 return ((Os_desc *)S_ERROR); 1918 shdr->sh_type = (Word)stype; 1919 shdr->sh_flags = SHF_ALLOC; 1920 shdr->sh_addralign = M_WORD_ALIGN; 1921 shdr->sh_entsize = entsize; 1922 1923 if (stype == SHT_SUNW_syminfo) { 1924 /* 1925 * The sh_info field of the SHT_*_syminfo section points 1926 * to the header index of the associated .dynamic section. 1927 */ 1928 shdr->sh_flags |= SHF_INFO_LINK; 1929 } 1930 1931 /* 1932 * Allocate and initialize the Is_desc structure. 1933 */ 1934 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 1935 return ((Os_desc *)S_ERROR); 1936 isec->is_name = sectname; 1937 isec->is_shdr = shdr; 1938 isec->is_indata = data; 1939 1940 return (ld_place_section(ofl, isec, ident, 0)); 1941 } 1942 1943 /* 1944 * Build a .sunwbss section for allocation of tentative definitions. 1945 */ 1946 uintptr_t 1947 ld_make_sunwbss(Ofl_desc *ofl, size_t size, Xword align) 1948 { 1949 Shdr *shdr; 1950 Elf_Data *data; 1951 Is_desc *isec; 1952 1953 /* 1954 * Allocate and initialize the Elf_Data structure. 1955 */ 1956 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 1957 return (S_ERROR); 1958 data->d_type = ELF_T_BYTE; 1959 data->d_size = size; 1960 data->d_align = align; 1961 data->d_version = ofl->ofl_dehdr->e_version; 1962 1963 /* 1964 * Allocate and initialize the Shdr structure. 1965 */ 1966 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 1967 return (S_ERROR); 1968 shdr->sh_type = SHT_NOBITS; 1969 shdr->sh_flags = SHF_ALLOC | SHF_WRITE; 1970 shdr->sh_size = (Xword)size; 1971 shdr->sh_addralign = align; 1972 1973 /* 1974 * Allocate and initialize the Is_desc structure. 1975 */ 1976 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 1977 return (S_ERROR); 1978 isec->is_name = MSG_ORIG(MSG_SCN_SUNWBSS); 1979 isec->is_shdr = shdr; 1980 isec->is_indata = data; 1981 1982 /* 1983 * Retain this .sunwbss input section as this will be where global 1984 * symbol references are added. 1985 */ 1986 ofl->ofl_issunwbss = isec; 1987 if (ld_place_section(ofl, isec, 0, 0) == (Os_desc *)S_ERROR) 1988 return (S_ERROR); 1989 1990 return (1); 1991 } 1992 1993 /* 1994 * This routine is called when -z nopartial is in effect. 1995 */ 1996 uintptr_t 1997 ld_make_sunwdata(Ofl_desc *ofl, size_t size, Xword align) 1998 { 1999 Shdr *shdr; 2000 Elf_Data *data; 2001 Is_desc *isec; 2002 Os_desc *osp; 2003 2004 /* 2005 * Allocate and initialize the Elf_Data structure. 2006 */ 2007 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 2008 return (S_ERROR); 2009 data->d_type = ELF_T_BYTE; 2010 data->d_size = size; 2011 if ((data->d_buf = libld_calloc(size, 1)) == 0) 2012 return (S_ERROR); 2013 data->d_align = (size_t)M_WORD_ALIGN; 2014 data->d_version = ofl->ofl_dehdr->e_version; 2015 2016 /* 2017 * Allocate and initialize the Shdr structure. 2018 */ 2019 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 2020 return (S_ERROR); 2021 shdr->sh_type = SHT_PROGBITS; 2022 shdr->sh_flags = SHF_ALLOC | SHF_WRITE; 2023 shdr->sh_size = (Xword)size; 2024 if (align == 0) 2025 shdr->sh_addralign = M_WORD_ALIGN; 2026 else 2027 shdr->sh_addralign = align; 2028 2029 /* 2030 * Allocate and initialize the Is_desc structure. 2031 */ 2032 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 2033 return (S_ERROR); 2034 isec->is_name = MSG_ORIG(MSG_SCN_SUNWDATA1); 2035 isec->is_shdr = shdr; 2036 isec->is_indata = data; 2037 2038 /* 2039 * Retain this .sunwdata1 input section as this will 2040 * be where global 2041 * symbol references are added. 2042 */ 2043 ofl->ofl_issunwdata1 = isec; 2044 if ((osp = ld_place_section(ofl, isec, M_ID_DATA, 0)) == 2045 (Os_desc *)S_ERROR) 2046 return (S_ERROR); 2047 2048 if (!(osp->os_flags & FLG_OS_OUTREL)) { 2049 ofl->ofl_dynshdrcnt++; 2050 osp->os_flags |= FLG_OS_OUTREL; 2051 } 2052 return (1); 2053 } 2054 2055 /* 2056 * Make .sunwmove section 2057 */ 2058 uintptr_t 2059 ld_make_sunwmove(Ofl_desc *ofl, int mv_nums) 2060 { 2061 Shdr *shdr; 2062 Elf_Data *data; 2063 Is_desc *isec; 2064 size_t size; 2065 Listnode *lnp1; 2066 Psym_info *psym; 2067 int cnt = 1; 2068 2069 /* 2070 * Generate the move input sections and output sections 2071 */ 2072 size = mv_nums * sizeof (Move); 2073 2074 /* 2075 * Allocate and initialize the Elf_Data structure. 2076 */ 2077 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 2078 return (S_ERROR); 2079 data->d_type = ELF_T_BYTE; 2080 if ((data->d_buf = libld_calloc(size, 1)) == 0) 2081 return (S_ERROR); 2082 data->d_size = size; 2083 data->d_align = sizeof (Lword); 2084 data->d_version = ofl->ofl_dehdr->e_version; 2085 2086 /* 2087 * Allocate and initialize the Shdr structure. 2088 */ 2089 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 2090 return (S_ERROR); 2091 shdr->sh_link = 0; 2092 shdr->sh_info = 0; 2093 shdr->sh_type = SHT_SUNW_move; 2094 shdr->sh_size = (Xword)size; 2095 shdr->sh_flags = SHF_ALLOC | SHF_WRITE; 2096 shdr->sh_addralign = sizeof (Lword); 2097 shdr->sh_entsize = sizeof (Move); 2098 2099 /* 2100 * Allocate and initialize the Is_desc structure. 2101 */ 2102 if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0) 2103 return (S_ERROR); 2104 isec->is_name = MSG_ORIG(MSG_SCN_SUNWMOVE); 2105 isec->is_shdr = shdr; 2106 isec->is_indata = data; 2107 isec->is_file = 0; 2108 2109 /* 2110 * Copy move entries 2111 */ 2112 for (LIST_TRAVERSE(&ofl->ofl_parsym, lnp1, psym)) { 2113 Listnode * lnp2; 2114 Mv_itm * mvitm; 2115 2116 if (psym->psym_symd->sd_flags & FLG_SY_PAREXPN) 2117 continue; 2118 for (LIST_TRAVERSE(&(psym->psym_mvs), lnp2, mvitm)) { 2119 if ((mvitm->mv_flag & FLG_MV_OUTSECT) == 0) 2120 continue; 2121 mvitm->mv_oidx = cnt; 2122 cnt++; 2123 } 2124 } 2125 if ((ofl->ofl_osmove = ld_place_section(ofl, isec, 0, 0)) == 2126 (Os_desc *)S_ERROR) 2127 return (S_ERROR); 2128 2129 return (1); 2130 } 2131 2132 2133 /* 2134 * The following sections are built after all input file processing and symbol 2135 * validation has been carried out. The order is important (because the 2136 * addition of a section adds a new symbol there is a chicken and egg problem 2137 * of maintaining the appropriate counts). By maintaining a known order the 2138 * individual routines can compensate for later, known, additions. 2139 */ 2140 uintptr_t 2141 ld_make_sections(Ofl_desc *ofl) 2142 { 2143 Word flags = ofl->ofl_flags; 2144 Listnode *lnp1; 2145 Sg_desc *sgp; 2146 2147 /* 2148 * Generate any special sections. 2149 */ 2150 if (flags & FLG_OF_ADDVERS) 2151 if (make_comment(ofl) == S_ERROR) 2152 return (S_ERROR); 2153 2154 if (make_interp(ofl) == S_ERROR) 2155 return (S_ERROR); 2156 2157 if (make_cap(ofl) == S_ERROR) 2158 return (S_ERROR); 2159 2160 if (make_array(ofl, SHT_INIT_ARRAY, MSG_ORIG(MSG_SCN_INITARRAY), 2161 &ofl->ofl_initarray) == S_ERROR) 2162 return (S_ERROR); 2163 2164 if (make_array(ofl, SHT_FINI_ARRAY, MSG_ORIG(MSG_SCN_FINIARRAY), 2165 &ofl->ofl_finiarray) == S_ERROR) 2166 return (S_ERROR); 2167 2168 if (make_array(ofl, SHT_PREINIT_ARRAY, MSG_ORIG(MSG_SCN_PREINITARRAY), 2169 &ofl->ofl_preiarray) == S_ERROR) 2170 return (S_ERROR); 2171 2172 /* 2173 * Make the .plt section. This occurs after any other relocation 2174 * sections are generated (see reloc_init()) to ensure that the 2175 * associated relocation section is after all the other relocation 2176 * sections. 2177 */ 2178 if ((ofl->ofl_pltcnt) || (ofl->ofl_pltpad)) 2179 if (make_plt(ofl) == S_ERROR) 2180 return (S_ERROR); 2181 2182 /* 2183 * Determine whether any sections or files are not referenced. Under 2184 * -Dunused a diagnostic for any unused components is generated, under 2185 * -zignore the component is removed from the final output. 2186 */ 2187 if (DBG_ENABLED || (ofl->ofl_flags1 & FLG_OF1_IGNPRC)) { 2188 if (ignore_section_processing(ofl) == S_ERROR) 2189 return (S_ERROR); 2190 } 2191 2192 /* 2193 * Add any necessary versioning information. 2194 */ 2195 if ((flags & (FLG_OF_VERNEED | FLG_OF_NOVERSEC)) == FLG_OF_VERNEED) { 2196 if (make_verneed(ofl) == S_ERROR) 2197 return (S_ERROR); 2198 } 2199 if ((flags & (FLG_OF_VERDEF | FLG_OF_NOVERSEC)) == FLG_OF_VERDEF) { 2200 if (make_verdef(ofl) == S_ERROR) 2201 return (S_ERROR); 2202 if ((ofl->ofl_osversym = make_sym_sec(ofl, 2203 MSG_ORIG(MSG_SCN_SUNWVERSYM), sizeof (Versym), 2204 SHT_SUNW_versym, M_ID_VERSION)) == (Os_desc*)S_ERROR) 2205 return (S_ERROR); 2206 } 2207 2208 /* 2209 * Create a syminfo section is necessary. 2210 */ 2211 if (ofl->ofl_flags & FLG_OF_SYMINFO) { 2212 if ((ofl->ofl_ossyminfo = make_sym_sec(ofl, 2213 MSG_ORIG(MSG_SCN_SUNWSYMINFO), sizeof (Syminfo), 2214 SHT_SUNW_syminfo, M_ID_SYMINFO)) == (Os_desc *)S_ERROR) 2215 return (S_ERROR); 2216 } 2217 2218 if (ofl->ofl_flags1 & FLG_OF1_RELCNT) { 2219 /* 2220 * If -zcombreloc is enabled then all relocations (except for 2221 * the PLT's) are coalesced into a single relocation section. 2222 */ 2223 if (ofl->ofl_reloccnt) { 2224 if (make_reloc(ofl, NULL) == S_ERROR) 2225 return (S_ERROR); 2226 } 2227 } else { 2228 /* 2229 * Create the required output relocation sections. Note, new 2230 * sections may be added to the section list that is being 2231 * traversed. These insertions can move the elements of the 2232 * Alist such that a section descriptor is re-read. Recursion 2233 * is prevented by maintaining a previous section pointer and 2234 * insuring that this pointer isn't re-examined. 2235 */ 2236 for (LIST_TRAVERSE(&ofl->ofl_segs, lnp1, sgp)) { 2237 Os_desc **ospp, *posp = 0; 2238 Aliste off; 2239 2240 for (ALIST_TRAVERSE(sgp->sg_osdescs, off, ospp)) { 2241 Os_desc *osp = *ospp; 2242 2243 if ((osp != posp) && osp->os_szoutrels && 2244 (osp != ofl->ofl_osplt)) { 2245 if (make_reloc(ofl, osp) == S_ERROR) 2246 return (S_ERROR); 2247 } 2248 posp = osp; 2249 } 2250 } 2251 2252 /* 2253 * If we're not building a combined relocation section, then 2254 * build a .rel[a] section as required. 2255 */ 2256 if (ofl->ofl_relocrelsz) { 2257 if (make_reloc(ofl, NULL) == S_ERROR) 2258 return (S_ERROR); 2259 } 2260 } 2261 2262 /* 2263 * The PLT relocations are always in their own section, and we try to 2264 * keep them at the end of the PLT table. We do this to keep the hot 2265 * "data" PLT's at the head of the table nearer the .dynsym & .hash. 2266 */ 2267 if (ofl->ofl_osplt && ofl->ofl_relocpltsz) { 2268 if (make_reloc(ofl, ofl->ofl_osplt) == S_ERROR) 2269 return (S_ERROR); 2270 } 2271 2272 /* 2273 * Finally build the symbol and section header sections. 2274 */ 2275 if (flags & FLG_OF_DYNAMIC) { 2276 if (make_dynamic(ofl) == S_ERROR) 2277 return (S_ERROR); 2278 if (make_dynstr(ofl) == S_ERROR) 2279 return (S_ERROR); 2280 /* 2281 * There is no use for .hash and .dynsym sections in a 2282 * relocatable object. 2283 */ 2284 if (!(flags & FLG_OF_RELOBJ)) { 2285 if (make_hash(ofl) == S_ERROR) 2286 return (S_ERROR); 2287 if (make_dynsym(ofl) == S_ERROR) 2288 return (S_ERROR); 2289 #if (defined(__i386) || defined(__amd64)) && defined(_ELF64) 2290 if (make_amd64_unwindhdr(ofl) == S_ERROR) 2291 return (S_ERROR); 2292 #endif 2293 } 2294 } 2295 2296 if (!(flags & FLG_OF_STRIP) || (flags & FLG_OF_RELOBJ) || 2297 ((flags & FLG_OF_STATIC) && ofl->ofl_osversym)) { 2298 /* 2299 * Do we need to make a SHT_SYMTAB_SHNDX section 2300 * for the dynsym. If so - do it now. 2301 */ 2302 if (ofl->ofl_osdynsym && 2303 ((ofl->ofl_shdrcnt + 3) >= SHN_LORESERVE)) { 2304 if (make_dynsym_shndx(ofl) == S_ERROR) 2305 return (S_ERROR); 2306 } 2307 2308 if (make_strtab(ofl) == S_ERROR) 2309 return (S_ERROR); 2310 if (make_symtab(ofl) == S_ERROR) 2311 return (S_ERROR); 2312 } else { 2313 /* 2314 * Do we need to make a SHT_SYMTAB_SHNDX section 2315 * for the dynsym. If so - do it now. 2316 */ 2317 if (ofl->ofl_osdynsym && 2318 ((ofl->ofl_shdrcnt + 1) >= SHN_LORESERVE)) { 2319 if (make_dynsym_shndx(ofl) == S_ERROR) 2320 return (S_ERROR); 2321 } 2322 } 2323 2324 if (make_shstrtab(ofl) == S_ERROR) 2325 return (S_ERROR); 2326 2327 /* 2328 * Now that we've created all of our sections adjust the size 2329 * of SHT_SUNW_versym & SHT_SUNW_syminfo which are dependent on 2330 * the symbol table sizes. 2331 */ 2332 if (ofl->ofl_osversym || ofl->ofl_ossyminfo) { 2333 Shdr * shdr; 2334 Is_desc * isec; 2335 Elf_Data * data; 2336 size_t size; 2337 ulong_t cnt; 2338 2339 if ((flags & FLG_OF_RELOBJ) || (flags & FLG_OF_STATIC)) 2340 isec = (Is_desc *)ofl->ofl_ossymtab-> 2341 os_isdescs.head->data; 2342 else 2343 isec = (Is_desc *)ofl->ofl_osdynsym-> 2344 os_isdescs.head->data; 2345 cnt = isec->is_shdr->sh_size / isec->is_shdr->sh_entsize; 2346 2347 if (ofl->ofl_osversym) { 2348 isec = (Is_desc *)ofl->ofl_osversym->os_isdescs. 2349 head->data; 2350 data = isec->is_indata; 2351 shdr = ofl->ofl_osversym->os_shdr; 2352 size = cnt * shdr->sh_entsize; 2353 shdr->sh_size = (Xword)size; 2354 data->d_size = size; 2355 } 2356 if (ofl->ofl_ossyminfo) { 2357 isec = (Is_desc *)ofl->ofl_ossyminfo->os_isdescs. 2358 head->data; 2359 data = isec->is_indata; 2360 shdr = ofl->ofl_ossyminfo->os_shdr; 2361 size = cnt * shdr->sh_entsize; 2362 shdr->sh_size = (Xword)size; 2363 data->d_size = size; 2364 } 2365 } 2366 2367 return (1); 2368 } 2369 2370 /* 2371 * Build an additional data section - used to back OBJT symbol definitions 2372 * added with a mapfile. 2373 */ 2374 Is_desc * 2375 ld_make_data(Ofl_desc *ofl, size_t size) 2376 { 2377 Shdr *shdr; 2378 Elf_Data *data; 2379 Is_desc *isec; 2380 2381 /* 2382 * Allocate and initialize the Elf_Data structure. 2383 */ 2384 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) 2385 return ((Is_desc *)S_ERROR); 2386 data->d_type = ELF_T_BYTE; 2387 data->d_size = size; 2388 data->d_align = M_WORD_ALIGN; 2389 data->d_version = ofl->ofl_dehdr->e_version; 2390 2391 /* 2392 * Allocate and initialize the Shdr structure. 2393 */ 2394 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 2395 return ((Is_desc *)S_ERROR); 2396 shdr->sh_type = SHT_PROGBITS; 2397 shdr->sh_flags = SHF_ALLOC | SHF_WRITE; 2398 shdr->sh_size = (Xword)size; 2399 shdr->sh_addralign = M_WORD_ALIGN; 2400 2401 /* 2402 * Allocate and initialize the Is_desc structure. 2403 */ 2404 if ((isec = libld_calloc(1, sizeof (Is_desc))) == (Is_desc *)0) 2405 return ((Is_desc *)S_ERROR); 2406 isec->is_name = MSG_ORIG(MSG_SCN_DATA); 2407 isec->is_shdr = shdr; 2408 isec->is_indata = data; 2409 2410 if (ld_place_section(ofl, isec, M_ID_DATA, 0) == (Os_desc *)S_ERROR) 2411 return ((Is_desc *)S_ERROR); 2412 2413 return (isec); 2414 } 2415 2416 static const uchar_t ret_template[] = { 2417 #if defined(i386) 2418 /* 0x00 */ 0xc3 /* ret */ 2419 #elif defined(__amd64) 2420 /* 0x00 */ 0x55, /* pushq %rbp */ 2421 /* 0x01 */ 0x48, 0x8b, 0xec, /* movq %rsp,%rbp */ 2422 /* 0x04 */ 0x48, 0x8b, 0xe5, /* movq %rbp,%rsp */ 2423 /* 0x07 */ 0x5d, /* popq %rbp */ 2424 /* 0x08 */ 0xc3 /* ret */ 2425 #elif defined(sparc) || defined(__sparcv9) 2426 /* 0x00 */ 0x81, 0xc3, 0xe0, 0x08, /* retl */ 2427 /* 0x04 */ 0x01, 0x00, 0x00, 0x00 /* nop */ 2428 #else 2429 #error unsupported architecture! 2430 #endif 2431 }; 2432 2433 /* 2434 * Build an additional text section - used to back FUNC symbol definitions 2435 * added with a mapfile. 2436 */ 2437 Is_desc * 2438 ld_make_text(Ofl_desc *ofl, size_t size) 2439 { 2440 Shdr *shdr; 2441 Elf_Data *data; 2442 Is_desc *isec; 2443 2444 /* 2445 * Insure the size is sufficient to contain the minimum return 2446 * instruction. 2447 */ 2448 if (size < sizeof (ret_template)) 2449 size = sizeof (ret_template); 2450 2451 /* 2452 * Allocate and initialize the Elf_Data structure. Fill the buffer 2453 * with the appropriate return instruction. 2454 */ 2455 if (((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) || 2456 ((data->d_buf = libld_calloc(size, 1)) == 0)) 2457 return ((Is_desc *)S_ERROR); 2458 data->d_type = ELF_T_BYTE; 2459 data->d_size = size; 2460 data->d_align = M_WORD_ALIGN; 2461 data->d_version = ofl->ofl_dehdr->e_version; 2462 2463 (void) memcpy(data->d_buf, ret_template, sizeof (ret_template)); 2464 2465 /* 2466 * Allocate and initialize the Shdr structure. 2467 */ 2468 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0) 2469 return ((Is_desc *)S_ERROR); 2470 shdr->sh_type = SHT_PROGBITS; 2471 shdr->sh_flags = SHF_ALLOC | SHF_EXECINSTR; 2472 shdr->sh_size = (Xword)size; 2473 shdr->sh_addralign = M_WORD_ALIGN; 2474 2475 /* 2476 * Allocate and initialize the Is_desc structure. 2477 */ 2478 if ((isec = libld_calloc(1, sizeof (Is_desc))) == (Is_desc *)0) 2479 return ((Is_desc *)S_ERROR); 2480 isec->is_name = MSG_ORIG(MSG_SCN_TEXT); 2481 isec->is_shdr = shdr; 2482 isec->is_indata = data; 2483 2484 if (ld_place_section(ofl, isec, M_ID_TEXT, 0) == (Os_desc *)S_ERROR) 2485 return ((Is_desc *)S_ERROR); 2486 2487 return (isec); 2488 } 2489