1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright (c) 1988 AT&T 24 * All Rights Reserved 25 * 26 * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved. 27 */ 28 29 /* 30 * Update the new output file image, perform virtual address, offset and 31 * displacement calculations on the program headers and sections headers, 32 * and generate any new output section information. 33 */ 34 35 #define ELF_TARGET_AMD64 36 37 #include <stdio.h> 38 #include <string.h> 39 #include <unistd.h> 40 #include <debug.h> 41 #include "msg.h" 42 #include "_libld.h" 43 44 /* 45 * Comparison routine used by qsort() for sorting of the global symbol list 46 * based off of the hashbuckets the symbol will eventually be deposited in. 47 */ 48 static int 49 sym_hash_compare(Sym_s_list * s1, Sym_s_list * s2) 50 { 51 return (s1->sl_hval - s2->sl_hval); 52 } 53 54 /* 55 * Comparison routine used by qsort() for sorting of dyn[sym|tls]sort section 56 * indices based on the address of the symbols they reference. The 57 * use of the global dynsort_compare_syms variable is needed because 58 * we need to examine the symbols the indices reference. It is safe, because 59 * the linker is single threaded. 60 */ 61 static Sym *dynsort_compare_syms; 62 63 static int 64 dynsort_compare(const void *idx1, const void *idx2) 65 { 66 Sym *s1 = dynsort_compare_syms + *((const Word *) idx1); 67 Sym *s2 = dynsort_compare_syms + *((const Word *) idx2); 68 69 /* 70 * Note: the logical computation for this is 71 * (st_value1 - st_value2) 72 * However, that is only correct if the address type is smaller 73 * than a pointer. Writing it this way makes it immune to the 74 * class (32 or 64-bit) of the linker. 75 */ 76 return ((s1->st_value < s2->st_value) ? -1 : 77 (s1->st_value > s2->st_value)); 78 } 79 80 /* 81 * Scan the sorted symbols, and issue warnings if there are any duplicate 82 * values in the list. We only do this if -zverbose is set, or we are 83 * running with LD_DEBUG defined 84 * 85 * entry: 86 * ofl - Output file descriptor 87 * ldynsym - Pointer to start of .SUNW_ldynsym section that the 88 * sort section indexes reference. 89 * symsort - Pointer to start of .SUNW_dynsymsort or .SUNW_dyntlssort 90 * section. 91 * n - # of indices in symsort array 92 * secname - Name of the symsort section. 93 * 94 * exit: 95 * If the symsort section contains indexes to more than one 96 * symbol with the same address value, a warning is issued. 97 */ 98 static void 99 dynsort_dupwarn(Ofl_desc *ofl, Sym *ldynsym, const char *str, 100 Word *symsort, Word n, const char *secname) 101 { 102 int zverbose = (ofl->ofl_flags & FLG_OF_VERBOSE) != 0; 103 Word ndx, cmp_ndx; 104 Addr addr, cmp_addr; 105 106 /* Nothing to do if -zverbose or LD_DEBUG are not active */ 107 if (!(zverbose || DBG_ENABLED)) 108 return; 109 110 cmp_ndx = 0; 111 cmp_addr = ldynsym[symsort[cmp_ndx]].st_value; 112 for (ndx = 1; ndx < n; ndx++) { 113 addr = ldynsym[symsort[ndx]].st_value; 114 if (cmp_addr == addr) { 115 if (zverbose) 116 ld_eprintf(ofl, ERR_WARNING, 117 MSG_INTL(MSG_SYM_DUPSORTADDR), secname, 118 str + ldynsym[symsort[cmp_ndx]].st_name, 119 str + ldynsym[symsort[ndx]].st_name, 120 EC_ADDR(addr)); 121 DBG_CALL(Dbg_syms_dup_sort_addr(ofl->ofl_lml, secname, 122 str + ldynsym[symsort[cmp_ndx]].st_name, 123 str + ldynsym[symsort[ndx]].st_name, 124 EC_ADDR(addr))); 125 } else { /* Not a dup. Move reference up */ 126 cmp_ndx = ndx; 127 cmp_addr = addr; 128 } 129 } 130 } 131 132 static inline Boolean 133 ass_enabled(Ass_desc *ma, uint_t ass) 134 { 135 return ((ma->ass_enabled & ass) != 0); 136 } 137 138 /* 139 * Build and update any output symbol tables. Here we work on all the symbol 140 * tables at once to reduce the duplication of symbol and string manipulation. 141 * Symbols and their associated strings are copied from the read-only input 142 * file images to the output image and their values and index's updated in the 143 * output image. 144 */ 145 static Addr 146 update_osym(Ofl_desc *ofl) 147 { 148 /* 149 * There are several places in this function where we wish 150 * to insert a symbol index to the combined .SUNW_ldynsym/.dynsym 151 * symbol table into one of the two sort sections (.SUNW_dynsymsort 152 * or .SUNW_dyntlssort), if that symbol has the right attributes. 153 * This macro is used to generate the necessary code from a single 154 * specification. 155 * 156 * entry: 157 * _sdp, _sym, _type - As per DYNSORT_COUNT. See _libld.h 158 * _sym_ndx - Index that _sym will have in the combined 159 * .SUNW_ldynsym/.dynsym symbol table. 160 */ 161 #define ADD_TO_DYNSORT(_sdp, _sym, _type, _sym_ndx) \ 162 { \ 163 Word *_dynsort_arr, *_dynsort_ndx; \ 164 \ 165 if (dynsymsort_symtype[_type]) { \ 166 _dynsort_arr = dynsymsort; \ 167 _dynsort_ndx = &dynsymsort_ndx; \ 168 } else if (_type == STT_TLS) { \ 169 _dynsort_arr = dyntlssort; \ 170 _dynsort_ndx = &dyntlssort_ndx; \ 171 } else { \ 172 _dynsort_arr = NULL; \ 173 } \ 174 if ((_dynsort_arr != NULL) && DYNSORT_TEST_ATTR(_sdp, _sym)) \ 175 _dynsort_arr[(*_dynsort_ndx)++] = _sym_ndx; \ 176 } 177 178 Sym_desc *sdp; 179 Sym_avlnode *sav; 180 Sg_desc *sgp, *tsgp = NULL, *dsgp = NULL, *esgp = NULL; 181 Os_desc *osp, *iosp = NULL, *fosp = NULL; 182 Is_desc *isc; 183 Ifl_desc *ifl; 184 Word bssndx, etext_ndx, edata_ndx = 0, end_ndx, start_ndx; 185 Word end_abs = 0, etext_abs = 0, edata_abs; 186 Word tlsbssndx = 0, parexpnndx; 187 #if defined(_ELF64) 188 Word lbssndx = 0; 189 Addr lbssaddr = 0; 190 #endif 191 Addr bssaddr, etext = 0, edata = 0, end = 0, start = 0; 192 Addr tlsbssaddr = 0; 193 Addr parexpnbase, parexpnaddr; 194 int start_set = 0; 195 Sym _sym = {0}, *sym, *symtab = NULL; 196 Sym *dynsym = NULL, *ldynsym = NULL; 197 Word symtab_ndx = 0; /* index into .symtab */ 198 Word symtab_gbl_bndx; /* .symtab ndx 1st global */ 199 Word ldynsym_ndx = 0; /* index into .SUNW_ldynsym */ 200 Word dynsym_ndx = 0; /* index into .dynsym */ 201 Word scopesym_ndx = 0; /* index into scoped symbols */ 202 Word scopesym_bndx = 0; /* .symtab ndx 1st scoped sym */ 203 Word ldynscopesym_ndx = 0; /* index to ldynsym scoped */ 204 /* symbols */ 205 Word *dynsymsort = NULL; /* SUNW_dynsymsort index */ 206 /* vector */ 207 Word *dyntlssort = NULL; /* SUNW_dyntlssort index */ 208 /* vector */ 209 Word dynsymsort_ndx; /* index dynsymsort array */ 210 Word dyntlssort_ndx; /* index dyntlssort array */ 211 Word *symndx; /* symbol index (for */ 212 /* relocation use) */ 213 Word *symshndx = NULL; /* .symtab_shndx table */ 214 Word *dynshndx = NULL; /* .dynsym_shndx table */ 215 Word *ldynshndx = NULL; /* .SUNW_ldynsym_shndx table */ 216 Word ldynsym_cnt = 0; /* number of items in */ 217 /* .SUNW_ldynsym */ 218 Str_tbl *shstrtab; 219 Str_tbl *strtab; 220 Str_tbl *dynstr; 221 Word *hashtab; /* hash table pointer */ 222 Word *hashbkt; /* hash table bucket pointer */ 223 Word *hashchain; /* hash table chain pointer */ 224 Wk_desc *wkp; 225 Alist *weak = NULL; 226 ofl_flag_t flags = ofl->ofl_flags; 227 Versym *versym; 228 Gottable *gottable; /* used for display got debugging */ 229 /* information */ 230 Syminfo *syminfo; 231 Sym_s_list *sorted_syms; /* table to hold sorted symbols */ 232 Word ssndx; /* global index into sorted_syms */ 233 Word scndx; /* scoped index into sorted_syms */ 234 size_t stoff; /* string offset */ 235 Aliste idx1; 236 237 /* 238 * Initialize pointers to the symbol table entries and the symbol 239 * table strings. Skip the first symbol entry and the first string 240 * table byte. Note that if we are not generating any output symbol 241 * tables we must still generate and update internal copies so 242 * that the relocation phase has the correct information. 243 */ 244 if (!(flags & FLG_OF_STRIP) || (flags & FLG_OF_RELOBJ) || 245 ((flags & FLG_OF_STATIC) && ofl->ofl_osversym)) { 246 symtab = (Sym *)ofl->ofl_ossymtab->os_outdata->d_buf; 247 symtab[symtab_ndx++] = _sym; 248 if (ofl->ofl_ossymshndx) 249 symshndx = 250 (Word *)ofl->ofl_ossymshndx->os_outdata->d_buf; 251 } 252 if (OFL_ALLOW_DYNSYM(ofl)) { 253 dynsym = (Sym *)ofl->ofl_osdynsym->os_outdata->d_buf; 254 dynsym[dynsym_ndx++] = _sym; 255 /* 256 * If we are also constructing a .SUNW_ldynsym section 257 * to contain local function symbols, then set it up too. 258 */ 259 if (ofl->ofl_osldynsym) { 260 ldynsym = (Sym *)ofl->ofl_osldynsym->os_outdata->d_buf; 261 ldynsym[ldynsym_ndx++] = _sym; 262 ldynsym_cnt = 1 + ofl->ofl_dynlocscnt + 263 ofl->ofl_dynscopecnt; 264 265 /* 266 * If there is a SUNW_ldynsym, then there may also 267 * be a .SUNW_dynsymsort and/or .SUNW_dyntlssort 268 * sections, used to collect indices of function 269 * and data symbols sorted by address order. 270 */ 271 if (ofl->ofl_osdynsymsort) { /* .SUNW_dynsymsort */ 272 dynsymsort = (Word *) 273 ofl->ofl_osdynsymsort->os_outdata->d_buf; 274 dynsymsort_ndx = 0; 275 } 276 if (ofl->ofl_osdyntlssort) { /* .SUNW_dyntlssort */ 277 dyntlssort = (Word *) 278 ofl->ofl_osdyntlssort->os_outdata->d_buf; 279 dyntlssort_ndx = 0; 280 } 281 } 282 283 /* 284 * Initialize the hash table. 285 */ 286 hashtab = (Word *)(ofl->ofl_oshash->os_outdata->d_buf); 287 hashbkt = &hashtab[2]; 288 hashchain = &hashtab[2 + ofl->ofl_hashbkts]; 289 hashtab[0] = ofl->ofl_hashbkts; 290 hashtab[1] = DYNSYM_ALL_CNT(ofl); 291 if (ofl->ofl_osdynshndx) 292 dynshndx = 293 (Word *)ofl->ofl_osdynshndx->os_outdata->d_buf; 294 if (ofl->ofl_osldynshndx) 295 ldynshndx = 296 (Word *)ofl->ofl_osldynshndx->os_outdata->d_buf; 297 } 298 299 /* 300 * symndx is the symbol index to be used for relocation processing. It 301 * points to the relevant symtab's (.dynsym or .symtab) symbol ndx. 302 */ 303 if (dynsym) 304 symndx = &dynsym_ndx; 305 else 306 symndx = &symtab_ndx; 307 308 /* 309 * If we have version definitions initialize the version symbol index 310 * table. There is one entry for each symbol which contains the symbols 311 * version index. 312 */ 313 if (!(flags & FLG_OF_NOVERSEC) && 314 (flags & (FLG_OF_VERNEED | FLG_OF_VERDEF))) { 315 versym = (Versym *)ofl->ofl_osversym->os_outdata->d_buf; 316 versym[0] = 0; 317 } else 318 versym = NULL; 319 320 /* 321 * If syminfo section exists be prepared to fill it in. 322 */ 323 if (ofl->ofl_ossyminfo) { 324 syminfo = ofl->ofl_ossyminfo->os_outdata->d_buf; 325 syminfo[0].si_flags = SYMINFO_CURRENT; 326 } else 327 syminfo = NULL; 328 329 /* 330 * Setup our string tables. 331 */ 332 shstrtab = ofl->ofl_shdrsttab; 333 strtab = ofl->ofl_strtab; 334 dynstr = ofl->ofl_dynstrtab; 335 336 DBG_CALL(Dbg_syms_sec_title(ofl->ofl_lml)); 337 338 /* 339 * Put output file name to the first .symtab and .SUNW_ldynsym symbol. 340 */ 341 if (symtab) { 342 (void) st_setstring(strtab, ofl->ofl_name, &stoff); 343 sym = &symtab[symtab_ndx++]; 344 /* LINTED */ 345 sym->st_name = stoff; 346 sym->st_value = 0; 347 sym->st_size = 0; 348 sym->st_info = ELF_ST_INFO(STB_LOCAL, STT_FILE); 349 sym->st_other = 0; 350 sym->st_shndx = SHN_ABS; 351 352 if (versym && !dynsym) 353 versym[1] = 0; 354 } 355 if (ldynsym) { 356 (void) st_setstring(dynstr, ofl->ofl_name, &stoff); 357 sym = &ldynsym[ldynsym_ndx]; 358 /* LINTED */ 359 sym->st_name = stoff; 360 sym->st_value = 0; 361 sym->st_size = 0; 362 sym->st_info = ELF_ST_INFO(STB_LOCAL, STT_FILE); 363 sym->st_other = 0; 364 sym->st_shndx = SHN_ABS; 365 366 /* Scoped symbols get filled in global loop below */ 367 ldynscopesym_ndx = ldynsym_ndx + 1; 368 ldynsym_ndx += ofl->ofl_dynscopecnt; 369 } 370 371 /* 372 * If we are to display GOT summary information, then allocate 373 * the buffer to 'cache' the GOT symbols into now. 374 */ 375 if (DBG_ENABLED) { 376 if ((ofl->ofl_gottable = gottable = 377 libld_calloc(ofl->ofl_gotcnt, sizeof (Gottable))) == NULL) 378 return ((Addr)S_ERROR); 379 } 380 381 /* 382 * Traverse the program headers. Determine the last executable segment 383 * and the last data segment so that we can update etext and edata. If 384 * we have empty segments (reservations) record them for setting _end. 385 */ 386 for (APLIST_TRAVERSE(ofl->ofl_segs, idx1, sgp)) { 387 Phdr *phd = &(sgp->sg_phdr); 388 Os_desc *osp; 389 Aliste idx2; 390 391 if (phd->p_type == PT_LOAD) { 392 if (aplist_nitems(sgp->sg_osdescs) != 0) { 393 Word _flags = phd->p_flags & (PF_W | PF_R); 394 395 if (_flags == PF_R) 396 tsgp = sgp; 397 else if (_flags == (PF_W | PF_R)) 398 dsgp = sgp; 399 } else if (sgp->sg_flags & FLG_SG_EMPTY) 400 esgp = sgp; 401 } 402 403 /* 404 * Generate a section symbol for each output section. 405 */ 406 for (APLIST_TRAVERSE(sgp->sg_osdescs, idx2, osp)) { 407 Word sectndx; 408 409 sym = &_sym; 410 sym->st_value = osp->os_shdr->sh_addr; 411 sym->st_info = ELF_ST_INFO(STB_LOCAL, STT_SECTION); 412 /* LINTED */ 413 sectndx = elf_ndxscn(osp->os_scn); 414 415 if (symtab) { 416 if (sectndx >= SHN_LORESERVE) { 417 symshndx[symtab_ndx] = sectndx; 418 sym->st_shndx = SHN_XINDEX; 419 } else { 420 /* LINTED */ 421 sym->st_shndx = (Half)sectndx; 422 } 423 symtab[symtab_ndx++] = *sym; 424 } 425 426 if (dynsym && (osp->os_flags & FLG_OS_OUTREL)) 427 dynsym[dynsym_ndx++] = *sym; 428 429 if ((dynsym == NULL) || 430 (osp->os_flags & FLG_OS_OUTREL)) { 431 if (versym) 432 versym[*symndx - 1] = 0; 433 osp->os_identndx = *symndx - 1; 434 DBG_CALL(Dbg_syms_sec_entry(ofl->ofl_lml, 435 osp->os_identndx, sgp, osp)); 436 } 437 438 /* 439 * Generate the .shstrtab for this section. 440 */ 441 (void) st_setstring(shstrtab, osp->os_name, &stoff); 442 osp->os_shdr->sh_name = (Word)stoff; 443 444 /* 445 * Find the section index for our special symbols. 446 */ 447 if (sgp == tsgp) { 448 /* LINTED */ 449 etext_ndx = elf_ndxscn(osp->os_scn); 450 } else if (dsgp == sgp) { 451 if (osp->os_shdr->sh_type != SHT_NOBITS) { 452 /* LINTED */ 453 edata_ndx = elf_ndxscn(osp->os_scn); 454 } 455 } 456 457 if (start_set == 0) { 458 start = sgp->sg_phdr.p_vaddr; 459 /* LINTED */ 460 start_ndx = elf_ndxscn(osp->os_scn); 461 start_set++; 462 } 463 464 /* 465 * While we're here, determine whether a .init or .fini 466 * section exist. 467 */ 468 if ((iosp == NULL) && (strcmp(osp->os_name, 469 MSG_ORIG(MSG_SCN_INIT)) == 0)) 470 iosp = osp; 471 if ((fosp == NULL) && (strcmp(osp->os_name, 472 MSG_ORIG(MSG_SCN_FINI)) == 0)) 473 fosp = osp; 474 } 475 } 476 477 /* 478 * Add local register symbols to the .dynsym. These are required as 479 * DT_REGISTER .dynamic entries must have a symbol to reference. 480 */ 481 if (ofl->ofl_regsyms && dynsym) { 482 int ndx; 483 484 for (ndx = 0; ndx < ofl->ofl_regsymsno; ndx++) { 485 Sym_desc *rsdp; 486 487 if ((rsdp = ofl->ofl_regsyms[ndx]) == NULL) 488 continue; 489 490 if (!SYM_IS_HIDDEN(rsdp) && 491 (ELF_ST_BIND(rsdp->sd_sym->st_info) != STB_LOCAL)) 492 continue; 493 494 dynsym[dynsym_ndx] = *(rsdp->sd_sym); 495 rsdp->sd_symndx = *symndx; 496 497 if (dynsym[dynsym_ndx].st_name) { 498 (void) st_setstring(dynstr, rsdp->sd_name, 499 &stoff); 500 dynsym[dynsym_ndx].st_name = stoff; 501 } 502 dynsym_ndx++; 503 } 504 } 505 506 /* 507 * Having traversed all the output segments, warn the user if the 508 * traditional text or data segments don't exist. Otherwise from these 509 * segments establish the values for `etext', `edata', `end', `END', 510 * and `START'. 511 */ 512 if (!(flags & FLG_OF_RELOBJ)) { 513 Sg_desc *sgp; 514 515 if (tsgp) 516 etext = tsgp->sg_phdr.p_vaddr + tsgp->sg_phdr.p_filesz; 517 else { 518 etext = (Addr)0; 519 etext_ndx = SHN_ABS; 520 etext_abs = 1; 521 if (flags & FLG_OF_VERBOSE) 522 ld_eprintf(ofl, ERR_WARNING, 523 MSG_INTL(MSG_UPD_NOREADSEG)); 524 } 525 if (dsgp) { 526 edata = dsgp->sg_phdr.p_vaddr + dsgp->sg_phdr.p_filesz; 527 } else { 528 edata = (Addr)0; 529 edata_ndx = SHN_ABS; 530 edata_abs = 1; 531 if (flags & FLG_OF_VERBOSE) 532 ld_eprintf(ofl, ERR_WARNING, 533 MSG_INTL(MSG_UPD_NORDWRSEG)); 534 } 535 536 if (dsgp == NULL) { 537 if (tsgp) 538 sgp = tsgp; 539 else 540 sgp = 0; 541 } else if (tsgp == NULL) 542 sgp = dsgp; 543 else if (dsgp->sg_phdr.p_vaddr > tsgp->sg_phdr.p_vaddr) 544 sgp = dsgp; 545 else if (dsgp->sg_phdr.p_vaddr < tsgp->sg_phdr.p_vaddr) 546 sgp = tsgp; 547 else { 548 /* 549 * One of the segments must be of zero size. 550 */ 551 if (tsgp->sg_phdr.p_memsz) 552 sgp = tsgp; 553 else 554 sgp = dsgp; 555 } 556 557 if (esgp && (esgp->sg_phdr.p_vaddr > sgp->sg_phdr.p_vaddr)) 558 sgp = esgp; 559 560 if (sgp) { 561 end = sgp->sg_phdr.p_vaddr + sgp->sg_phdr.p_memsz; 562 563 /* 564 * If the last loadable segment is a read-only segment, 565 * then the application which uses the symbol _end to 566 * find the beginning of writable heap area may cause 567 * segmentation violation. We adjust the value of the 568 * _end to skip to the next page boundary. 569 * 570 * 6401812 System interface which returs beginning 571 * heap would be nice. 572 * When the above RFE is implemented, the changes below 573 * could be changed in a better way. 574 */ 575 if ((sgp->sg_phdr.p_flags & PF_W) == 0) 576 end = (Addr)S_ROUND(end, sysconf(_SC_PAGESIZE)); 577 578 /* 579 * If we're dealing with a memory reservation there are 580 * no sections to establish an index for _end, so assign 581 * it as an absolute. 582 */ 583 if (aplist_nitems(sgp->sg_osdescs) != 0) { 584 /* 585 * Determine the last section for this segment. 586 */ 587 Os_desc *osp = sgp->sg_osdescs->apl_data 588 [sgp->sg_osdescs->apl_nitems - 1]; 589 590 /* LINTED */ 591 end_ndx = elf_ndxscn(osp->os_scn); 592 } else { 593 end_ndx = SHN_ABS; 594 end_abs = 1; 595 } 596 } else { 597 end = (Addr) 0; 598 end_ndx = SHN_ABS; 599 end_abs = 1; 600 ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_UPD_NOSEG)); 601 } 602 } 603 604 /* 605 * Initialize the scoped symbol table entry point. This is for all 606 * the global symbols that have been scoped to locals and will be 607 * filled in during global symbol processing so that we don't have 608 * to traverse the globals symbol hash array more than once. 609 */ 610 if (symtab) { 611 scopesym_bndx = symtab_ndx; 612 scopesym_ndx = scopesym_bndx; 613 symtab_ndx += ofl->ofl_scopecnt; 614 } 615 616 /* 617 * If expanding partially expanded symbols under '-z nopartial', 618 * prepare to do that. 619 */ 620 if (ofl->ofl_isparexpn) { 621 osp = ofl->ofl_isparexpn->is_osdesc; 622 parexpnbase = parexpnaddr = (Addr)(osp->os_shdr->sh_addr + 623 ofl->ofl_isparexpn->is_indata->d_off); 624 /* LINTED */ 625 parexpnndx = elf_ndxscn(osp->os_scn); 626 ofl->ofl_parexpnndx = osp->os_identndx; 627 } 628 629 /* 630 * If we are generating a .symtab collect all the local symbols, 631 * assigning a new virtual address or displacement (value). 632 */ 633 for (APLIST_TRAVERSE(ofl->ofl_objs, idx1, ifl)) { 634 Xword lndx, local = ifl->ifl_locscnt; 635 Cap_desc *cdp = ifl->ifl_caps; 636 637 for (lndx = 1; lndx < local; lndx++) { 638 Gotndx *gnp; 639 uchar_t type; 640 Word *_symshndx; 641 int enter_in_symtab, enter_in_ldynsym; 642 int update_done; 643 644 sdp = ifl->ifl_oldndx[lndx]; 645 sym = sdp->sd_sym; 646 647 /* 648 * Assign a got offset if necessary. 649 */ 650 if ((ld_targ.t_mr.mr_assign_got != NULL) && 651 (*ld_targ.t_mr.mr_assign_got)(ofl, sdp) == S_ERROR) 652 return ((Addr)S_ERROR); 653 654 if (DBG_ENABLED) { 655 Aliste idx2; 656 657 for (ALIST_TRAVERSE(sdp->sd_GOTndxs, 658 idx2, gnp)) { 659 gottable->gt_sym = sdp; 660 gottable->gt_gndx.gn_gotndx = 661 gnp->gn_gotndx; 662 gottable->gt_gndx.gn_addend = 663 gnp->gn_addend; 664 gottable++; 665 } 666 } 667 668 if ((type = ELF_ST_TYPE(sym->st_info)) == STT_SECTION) 669 continue; 670 671 /* 672 * Ignore any symbols that have been marked as invalid 673 * during input processing. Providing these aren't used 674 * for relocation they'll just be dropped from the 675 * output image. 676 */ 677 if (sdp->sd_flags & FLG_SY_INVALID) 678 continue; 679 680 /* 681 * If the section that this symbol was associated 682 * with has been discarded - then we discard 683 * the local symbol along with it. 684 */ 685 if (sdp->sd_flags & FLG_SY_ISDISC) 686 continue; 687 688 /* 689 * If this symbol is from a different file 690 * than the input descriptor we are processing, 691 * treat it as if it has FLG_SY_ISDISC set. 692 * This happens when sloppy_comdat_reloc() 693 * replaces a symbol to a discarded comdat section 694 * with an equivalent symbol from a different 695 * file. We only want to enter such a symbol 696 * once --- as part of the file that actually 697 * supplies it. 698 */ 699 if (ifl != sdp->sd_file) 700 continue; 701 702 /* 703 * Generate an output symbol to represent this input 704 * symbol. Even if the symbol table is to be stripped 705 * we still need to update any local symbols that are 706 * used during relocation. 707 */ 708 enter_in_symtab = symtab && 709 (!(ofl->ofl_flags & FLG_OF_REDLSYM) || 710 sdp->sd_move); 711 enter_in_ldynsym = ldynsym && 712 ((sym->st_name != 0) || (type == STT_FILE)) && 713 ldynsym_symtype[type] && 714 !(ofl->ofl_flags & FLG_OF_REDLSYM); 715 716 _symshndx = NULL; 717 718 if (enter_in_symtab) { 719 if (!dynsym) 720 sdp->sd_symndx = *symndx; 721 symtab[symtab_ndx] = *sym; 722 723 /* 724 * Provided this isn't an unnamed register 725 * symbol, update its name. 726 */ 727 if (((sdp->sd_flags & FLG_SY_REGSYM) == 0) || 728 symtab[symtab_ndx].st_name) { 729 (void) st_setstring(strtab, 730 sdp->sd_name, &stoff); 731 symtab[symtab_ndx].st_name = stoff; 732 } 733 sdp->sd_flags &= ~FLG_SY_CLEAN; 734 if (symshndx) 735 _symshndx = &symshndx[symtab_ndx]; 736 sdp->sd_sym = sym = &symtab[symtab_ndx++]; 737 738 if ((sdp->sd_flags & FLG_SY_SPECSEC) && 739 (sym->st_shndx == SHN_ABS) && 740 !enter_in_ldynsym) 741 continue; 742 } else if (enter_in_ldynsym) { 743 /* 744 * Not using symtab, but we do have ldynsym 745 * available. 746 */ 747 ldynsym[ldynsym_ndx] = *sym; 748 (void) st_setstring(dynstr, sdp->sd_name, 749 &stoff); 750 ldynsym[ldynsym_ndx].st_name = stoff; 751 752 sdp->sd_flags &= ~FLG_SY_CLEAN; 753 if (ldynshndx) 754 _symshndx = &ldynshndx[ldynsym_ndx]; 755 sdp->sd_sym = sym = &ldynsym[ldynsym_ndx]; 756 /* Add it to sort section if it qualifies */ 757 ADD_TO_DYNSORT(sdp, sym, type, ldynsym_ndx); 758 ldynsym_ndx++; 759 } else { /* Not using symtab or ldynsym */ 760 /* 761 * If this symbol requires modifying to provide 762 * for a relocation or move table update, make 763 * a copy of it. 764 */ 765 if (!(sdp->sd_flags & FLG_SY_UPREQD) && 766 !(sdp->sd_move)) 767 continue; 768 if ((sdp->sd_flags & FLG_SY_SPECSEC) && 769 (sym->st_shndx == SHN_ABS)) 770 continue; 771 772 if (ld_sym_copy(sdp) == S_ERROR) 773 return ((Addr)S_ERROR); 774 sym = sdp->sd_sym; 775 } 776 777 /* 778 * Update the symbols contents if necessary. 779 */ 780 update_done = 0; 781 if (type == STT_FILE) { 782 sdp->sd_shndx = sym->st_shndx = SHN_ABS; 783 sdp->sd_flags |= FLG_SY_SPECSEC; 784 update_done = 1; 785 } 786 787 /* 788 * If we are expanding the locally bound partially 789 * initialized symbols, then update the address here. 790 */ 791 if (ofl->ofl_isparexpn && 792 (sdp->sd_flags & FLG_SY_PAREXPN) && !update_done) { 793 sym->st_shndx = parexpnndx; 794 sdp->sd_isc = ofl->ofl_isparexpn; 795 sym->st_value = parexpnaddr; 796 parexpnaddr += sym->st_size; 797 if ((flags & FLG_OF_RELOBJ) == 0) 798 sym->st_value -= parexpnbase; 799 } 800 801 /* 802 * If this isn't an UNDEF symbol (ie. an input section 803 * is associated), update the symbols value and index. 804 */ 805 if (((isc = sdp->sd_isc) != NULL) && !update_done) { 806 Word sectndx; 807 808 osp = isc->is_osdesc; 809 /* LINTED */ 810 sym->st_value += 811 (Off)_elf_getxoff(isc->is_indata); 812 if ((flags & FLG_OF_RELOBJ) == 0) { 813 sym->st_value += osp->os_shdr->sh_addr; 814 /* 815 * TLS symbols are relative to 816 * the TLS segment. 817 */ 818 if ((type == STT_TLS) && 819 (ofl->ofl_tlsphdr)) { 820 sym->st_value -= 821 ofl->ofl_tlsphdr->p_vaddr; 822 } 823 } 824 /* LINTED */ 825 if ((sdp->sd_shndx = sectndx = 826 elf_ndxscn(osp->os_scn)) >= SHN_LORESERVE) { 827 if (_symshndx) { 828 *_symshndx = sectndx; 829 } 830 sym->st_shndx = SHN_XINDEX; 831 } else { 832 /* LINTED */ 833 sym->st_shndx = sectndx; 834 } 835 } 836 837 /* 838 * If entering the symbol in both the symtab and the 839 * ldynsym, then the one in symtab needs to be 840 * copied to ldynsym. If it is only in the ldynsym, 841 * then the code above already set it up and we have 842 * nothing more to do here. 843 */ 844 if (enter_in_symtab && enter_in_ldynsym) { 845 ldynsym[ldynsym_ndx] = *sym; 846 (void) st_setstring(dynstr, sdp->sd_name, 847 &stoff); 848 ldynsym[ldynsym_ndx].st_name = stoff; 849 850 if (_symshndx && ldynshndx) 851 ldynshndx[ldynsym_ndx] = *_symshndx; 852 853 /* Add it to sort section if it qualifies */ 854 ADD_TO_DYNSORT(sdp, sym, type, ldynsym_ndx); 855 856 ldynsym_ndx++; 857 } 858 } 859 860 /* 861 * If this input file has undergone object to symbol 862 * capabilities conversion, supply any new capabilities symbols. 863 * These symbols are copies of the original global symbols, and 864 * follow the existing local symbols that are supplied from this 865 * input file (which are identified with a preceding STT_FILE). 866 */ 867 if (symtab && cdp && cdp->ca_syms) { 868 Aliste idx2; 869 Cap_sym *csp; 870 871 for (APLIST_TRAVERSE(cdp->ca_syms, idx2, csp)) { 872 Is_desc *isp; 873 874 sdp = csp->cs_sdp; 875 sym = sdp->sd_sym; 876 877 if ((isp = sdp->sd_isc) != NULL) { 878 Os_desc *osp = isp->is_osdesc; 879 880 /* 881 * Update the symbols value. 882 */ 883 /* LINTED */ 884 sym->st_value += 885 (Off)_elf_getxoff(isp->is_indata); 886 if ((flags & FLG_OF_RELOBJ) == 0) 887 sym->st_value += 888 osp->os_shdr->sh_addr; 889 890 /* 891 * Update the symbols section index. 892 */ 893 sdp->sd_shndx = sym->st_shndx = 894 elf_ndxscn(osp->os_scn); 895 } 896 897 symtab[symtab_ndx] = *sym; 898 (void) st_setstring(strtab, sdp->sd_name, 899 &stoff); 900 symtab[symtab_ndx].st_name = stoff; 901 sdp->sd_symndx = symtab_ndx++; 902 } 903 } 904 } 905 906 symtab_gbl_bndx = symtab_ndx; /* .symtab index of 1st global entry */ 907 908 /* 909 * Two special symbols are `_init' and `_fini'. If these are supplied 910 * by crti.o then they are used to represent the total concatenation of 911 * the `.init' and `.fini' sections. 912 * 913 * Determine whether any .init or .fini sections exist. If these 914 * sections exist and a dynamic object is being built, but no `_init' 915 * or `_fini' symbols are found, then the user is probably building 916 * this object directly from ld(1) rather than using a compiler driver 917 * that provides the symbols via crt's. 918 * 919 * If the .init or .fini section exist, and their associated symbols, 920 * determine the size of the sections and updated the symbols value 921 * accordingly. 922 */ 923 if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_INIT_U), SYM_NOHASH, 0, 924 ofl)) != NULL) && (sdp->sd_ref == REF_REL_NEED) && sdp->sd_isc && 925 (sdp->sd_isc->is_osdesc == iosp)) { 926 if (ld_sym_copy(sdp) == S_ERROR) 927 return ((Addr)S_ERROR); 928 sdp->sd_sym->st_size = sdp->sd_isc->is_osdesc->os_shdr->sh_size; 929 930 } else if (iosp && !(flags & FLG_OF_RELOBJ)) { 931 ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_SYM_NOCRT), 932 MSG_ORIG(MSG_SYM_INIT_U), MSG_ORIG(MSG_SCN_INIT)); 933 } 934 935 if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_FINI_U), SYM_NOHASH, 0, 936 ofl)) != NULL) && (sdp->sd_ref == REF_REL_NEED) && sdp->sd_isc && 937 (sdp->sd_isc->is_osdesc == fosp)) { 938 if (ld_sym_copy(sdp) == S_ERROR) 939 return ((Addr)S_ERROR); 940 sdp->sd_sym->st_size = sdp->sd_isc->is_osdesc->os_shdr->sh_size; 941 942 } else if (fosp && !(flags & FLG_OF_RELOBJ)) { 943 ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_SYM_NOCRT), 944 MSG_ORIG(MSG_SYM_FINI_U), MSG_ORIG(MSG_SCN_FINI)); 945 } 946 947 /* 948 * Assign .bss information for use with updating COMMON symbols. 949 */ 950 if (ofl->ofl_isbss) { 951 isc = ofl->ofl_isbss; 952 osp = isc->is_osdesc; 953 954 bssaddr = osp->os_shdr->sh_addr + 955 (Off)_elf_getxoff(isc->is_indata); 956 /* LINTED */ 957 bssndx = elf_ndxscn(osp->os_scn); 958 } 959 960 #if defined(_ELF64) 961 /* 962 * For amd64 target, assign .lbss information for use 963 * with updating LCOMMON symbols. 964 */ 965 if ((ld_targ.t_m.m_mach == EM_AMD64) && ofl->ofl_islbss) { 966 osp = ofl->ofl_islbss->is_osdesc; 967 968 lbssaddr = osp->os_shdr->sh_addr + 969 (Off)_elf_getxoff(ofl->ofl_islbss->is_indata); 970 /* LINTED */ 971 lbssndx = elf_ndxscn(osp->os_scn); 972 } 973 #endif 974 /* 975 * Assign .tlsbss information for use with updating COMMON symbols. 976 */ 977 if (ofl->ofl_istlsbss) { 978 osp = ofl->ofl_istlsbss->is_osdesc; 979 tlsbssaddr = osp->os_shdr->sh_addr + 980 (Off)_elf_getxoff(ofl->ofl_istlsbss->is_indata); 981 /* LINTED */ 982 tlsbssndx = elf_ndxscn(osp->os_scn); 983 } 984 985 if ((sorted_syms = libld_calloc(ofl->ofl_globcnt + 986 ofl->ofl_elimcnt + ofl->ofl_scopecnt, 987 sizeof (*sorted_syms))) == NULL) 988 return ((Addr)S_ERROR); 989 990 scndx = 0; 991 ssndx = ofl->ofl_scopecnt + ofl->ofl_elimcnt; 992 993 DBG_CALL(Dbg_syms_up_title(ofl->ofl_lml)); 994 995 /* 996 * Traverse the internal symbol table updating global symbol information 997 * and allocating common. 998 */ 999 for (sav = avl_first(&ofl->ofl_symavl); sav; 1000 sav = AVL_NEXT(&ofl->ofl_symavl, sav)) { 1001 Sym *symptr; 1002 int local; 1003 int restore; 1004 1005 sdp = sav->sav_sdp; 1006 1007 /* 1008 * Ignore any symbols that have been marked as invalid during 1009 * input processing. Providing these aren't used for 1010 * relocation, they will be dropped from the output image. 1011 */ 1012 if (sdp->sd_flags & FLG_SY_INVALID) { 1013 DBG_CALL(Dbg_syms_old(ofl, sdp)); 1014 DBG_CALL(Dbg_syms_ignore(ofl, sdp)); 1015 continue; 1016 } 1017 1018 /* 1019 * Only needed symbols are copied to the output symbol table. 1020 */ 1021 if (sdp->sd_ref == REF_DYN_SEEN) 1022 continue; 1023 1024 if (ld_sym_reducable(ofl, sdp)) 1025 local = 1; 1026 else 1027 local = 0; 1028 1029 if (local || (ofl->ofl_hashbkts == 0)) { 1030 sorted_syms[scndx++].sl_sdp = sdp; 1031 } else { 1032 sorted_syms[ssndx].sl_hval = sdp->sd_aux->sa_hash % 1033 ofl->ofl_hashbkts; 1034 sorted_syms[ssndx].sl_sdp = sdp; 1035 ssndx++; 1036 } 1037 1038 /* 1039 * Note - expand the COMMON symbols here because an address 1040 * must be assigned to them in the same order that space was 1041 * calculated in sym_validate(). If this ordering isn't 1042 * followed differing alignment requirements can throw us all 1043 * out of whack. 1044 * 1045 * The expanded .bss global symbol is handled here as well. 1046 * 1047 * The actual adding entries into the symbol table still occurs 1048 * below in hashbucket order. 1049 */ 1050 symptr = sdp->sd_sym; 1051 restore = 0; 1052 if ((sdp->sd_flags & FLG_SY_PAREXPN) || 1053 ((sdp->sd_flags & FLG_SY_SPECSEC) && 1054 (sdp->sd_shndx = symptr->st_shndx) == SHN_COMMON)) { 1055 1056 /* 1057 * An expanded symbol goes to a special .data section 1058 * prepared for that purpose (ofl->ofl_isparexpn). 1059 * Assign COMMON allocations to .bss. 1060 * Otherwise leave it as is. 1061 */ 1062 if (sdp->sd_flags & FLG_SY_PAREXPN) { 1063 restore = 1; 1064 sdp->sd_shndx = parexpnndx; 1065 sdp->sd_flags &= ~FLG_SY_SPECSEC; 1066 symptr->st_value = (Xword) S_ROUND( 1067 parexpnaddr, symptr->st_value); 1068 parexpnaddr = symptr->st_value + 1069 symptr->st_size; 1070 sdp->sd_isc = ofl->ofl_isparexpn; 1071 sdp->sd_flags |= FLG_SY_COMMEXP; 1072 1073 } else if (ELF_ST_TYPE(symptr->st_info) != STT_TLS && 1074 (local || !(flags & FLG_OF_RELOBJ))) { 1075 restore = 1; 1076 sdp->sd_shndx = bssndx; 1077 sdp->sd_flags &= ~FLG_SY_SPECSEC; 1078 symptr->st_value = (Xword)S_ROUND(bssaddr, 1079 symptr->st_value); 1080 bssaddr = symptr->st_value + symptr->st_size; 1081 sdp->sd_isc = ofl->ofl_isbss; 1082 sdp->sd_flags |= FLG_SY_COMMEXP; 1083 1084 } else if (ELF_ST_TYPE(symptr->st_info) == STT_TLS && 1085 (local || !(flags & FLG_OF_RELOBJ))) { 1086 restore = 1; 1087 sdp->sd_shndx = tlsbssndx; 1088 sdp->sd_flags &= ~FLG_SY_SPECSEC; 1089 symptr->st_value = (Xword)S_ROUND(tlsbssaddr, 1090 symptr->st_value); 1091 tlsbssaddr = symptr->st_value + symptr->st_size; 1092 sdp->sd_isc = ofl->ofl_istlsbss; 1093 sdp->sd_flags |= FLG_SY_COMMEXP; 1094 /* 1095 * TLS symbols are relative to the TLS segment. 1096 */ 1097 symptr->st_value -= ofl->ofl_tlsphdr->p_vaddr; 1098 } 1099 #if defined(_ELF64) 1100 } else if ((ld_targ.t_m.m_mach == EM_AMD64) && 1101 (sdp->sd_flags & FLG_SY_SPECSEC) && 1102 ((sdp->sd_shndx = symptr->st_shndx) == 1103 SHN_X86_64_LCOMMON) && 1104 ((local || !(flags & FLG_OF_RELOBJ)))) { 1105 restore = 1; 1106 sdp->sd_shndx = lbssndx; 1107 sdp->sd_flags &= ~FLG_SY_SPECSEC; 1108 symptr->st_value = (Xword)S_ROUND(lbssaddr, 1109 symptr->st_value); 1110 lbssaddr = symptr->st_value + symptr->st_size; 1111 sdp->sd_isc = ofl->ofl_islbss; 1112 sdp->sd_flags |= FLG_SY_COMMEXP; 1113 #endif 1114 } 1115 1116 if (restore != 0) { 1117 uchar_t type, bind; 1118 1119 /* 1120 * Make sure this COMMON symbol is returned to the same 1121 * binding as was defined in the original relocatable 1122 * object reference. 1123 */ 1124 type = ELF_ST_TYPE(symptr->st_info); 1125 if (sdp->sd_flags & FLG_SY_GLOBREF) 1126 bind = STB_GLOBAL; 1127 else 1128 bind = STB_WEAK; 1129 1130 symptr->st_info = ELF_ST_INFO(bind, type); 1131 } 1132 1133 #define IS_DATA_SYMBOL(x) ((ELF_ST_TYPE(x->st_info) == STT_OBJECT) || \ 1134 (ELF_ST_TYPE(x->st_info) == STT_COMMON) || \ 1135 (ELF_ST_TYPE(x->st_info) == STT_TLS)) 1136 1137 /* 1138 * Filter symbols, special symbols, and those that will be reduced aren't 1139 * worth guidance 1140 */ 1141 #define IS_BORING_SYMBOL(x) (x->sd_flags & (FLG_SY_REDUCED|FLG_SY_STDFLTR| \ 1142 FLG_SY_SPECSEC|FLG_SY_HIDDEN|FLG_SY_ELIM|FLG_SY_IGNORE)) 1143 1144 /* Local symbols and unresolved weaks aren't useful to guide on */ 1145 #define IS_BORING_SCOPE(x) ((ELF_ST_BIND(x->st_info) == STB_LOCAL) || \ 1146 ((ELF_ST_BIND(x->st_info) == STB_WEAK) && \ 1147 (x->st_shndx == SHN_UNDEF))) 1148 1149 /* Symbol has the assertions recommended for global data */ 1150 #define HAS_NEEDED_ASSERTS(x) ((x->sd_ass != NULL) && \ 1151 (ass_enabled(x->sd_ass, SYM_ASSERT_SIZE) || \ 1152 ass_enabled(x->sd_ass, SYM_ASSERT_ALIAS))) 1153 1154 /* 1155 * If we're building a shared object and a mapfile is 1156 * specified, issue guidance if any symbol mentioned in the 1157 * mapfile is a global data symbol with no asserted size. 1158 * 1159 * This is somewhat heuristic to maximize the chance of 1160 * -zguidance users seeing our good advice without us being 1161 * annoying (eg. we don't guide when things like 1162 * mapfile.noex* are the only mapfiles) 1163 */ 1164 if (OFL_GUIDANCE(ofl, FLG_OFG_NO_ASSERTS) && 1165 (aplist_nitems(ofl->ofl_maps) > 0) && /* mapfile used */ 1166 (ofl->ofl_flags & FLG_OF_SHAROBJ) && /* building .so */ 1167 (ofl->ofl_flags & FLG_OF_VERDEF) && /* versions/reduce */ 1168 (sdp->sd_ref == REF_REL_NEED) && /* symbol in .o */ 1169 IS_DATA_SYMBOL(sdp->sd_sym) && 1170 !IS_BORING_SCOPE(sdp->sd_sym) && 1171 !IS_BORING_SYMBOL(sdp) && 1172 !HAS_NEEDED_ASSERTS(sdp)) { 1173 ld_eprintf(ofl, ERR_GUIDANCE, 1174 MSG_INTL(MSG_GUIDE_ASSERT_SIZE), 1175 sdp->sd_name, (Lword)sdp->sd_sym->st_size); 1176 } 1177 } 1178 1179 /* 1180 * If this is a dynamic object then add any local capabilities symbols. 1181 */ 1182 if (dynsym && ofl->ofl_capfamilies) { 1183 Cap_avlnode *cav; 1184 1185 for (cav = avl_first(ofl->ofl_capfamilies); cav; 1186 cav = AVL_NEXT(ofl->ofl_capfamilies, cav)) { 1187 Cap_sym *csp; 1188 Aliste idx; 1189 1190 for (APLIST_TRAVERSE(cav->cn_members, idx, csp)) { 1191 sdp = csp->cs_sdp; 1192 1193 DBG_CALL(Dbg_syms_created(ofl->ofl_lml, 1194 sdp->sd_name)); 1195 DBG_CALL(Dbg_syms_entered(ofl, sdp->sd_sym, 1196 sdp)); 1197 1198 dynsym[dynsym_ndx] = *sdp->sd_sym; 1199 1200 (void) st_setstring(dynstr, sdp->sd_name, 1201 &stoff); 1202 dynsym[dynsym_ndx].st_name = stoff; 1203 1204 sdp->sd_sym = &dynsym[dynsym_ndx]; 1205 sdp->sd_symndx = dynsym_ndx; 1206 1207 /* 1208 * Indicate that this is a capabilities symbol. 1209 * Note, that this identification only provides 1210 * information regarding the symbol that is 1211 * visible from elfdump(1) -y. The association 1212 * of a symbol to its capabilities is derived 1213 * from a .SUNW_capinfo entry. 1214 */ 1215 if (syminfo) { 1216 syminfo[dynsym_ndx].si_flags |= 1217 SYMINFO_FLG_CAP; 1218 } 1219 1220 dynsym_ndx++; 1221 } 1222 } 1223 } 1224 1225 if (ofl->ofl_hashbkts) { 1226 qsort(sorted_syms + ofl->ofl_scopecnt + ofl->ofl_elimcnt, 1227 ofl->ofl_globcnt, sizeof (Sym_s_list), 1228 (int (*)(const void *, const void *))sym_hash_compare); 1229 } 1230 1231 for (ssndx = 0; ssndx < (ofl->ofl_elimcnt + ofl->ofl_scopecnt + 1232 ofl->ofl_globcnt); ssndx++) { 1233 const char *name; 1234 Sym *sym; 1235 Sym_aux *sap; 1236 Half spec; 1237 int local = 0, dynlocal = 0, enter_in_symtab; 1238 Gotndx *gnp; 1239 Word sectndx; 1240 1241 sdp = sorted_syms[ssndx].sl_sdp; 1242 sectndx = 0; 1243 1244 if (symtab) 1245 enter_in_symtab = 1; 1246 else 1247 enter_in_symtab = 0; 1248 1249 /* 1250 * Assign a got offset if necessary. 1251 */ 1252 if ((ld_targ.t_mr.mr_assign_got != NULL) && 1253 (*ld_targ.t_mr.mr_assign_got)(ofl, sdp) == S_ERROR) 1254 return ((Addr)S_ERROR); 1255 1256 if (DBG_ENABLED) { 1257 Aliste idx2; 1258 1259 for (ALIST_TRAVERSE(sdp->sd_GOTndxs, idx2, gnp)) { 1260 gottable->gt_sym = sdp; 1261 gottable->gt_gndx.gn_gotndx = gnp->gn_gotndx; 1262 gottable->gt_gndx.gn_addend = gnp->gn_addend; 1263 gottable++; 1264 } 1265 1266 if (sdp->sd_aux && sdp->sd_aux->sa_PLTGOTndx) { 1267 gottable->gt_sym = sdp; 1268 gottable->gt_gndx.gn_gotndx = 1269 sdp->sd_aux->sa_PLTGOTndx; 1270 gottable++; 1271 } 1272 } 1273 1274 /* 1275 * If this symbol has been marked as being reduced to local 1276 * scope then it will have to be placed in the scoped portion 1277 * of the .symtab. Retain the appropriate index for use in 1278 * version symbol indexing and relocation. 1279 */ 1280 if (ld_sym_reducable(ofl, sdp)) { 1281 local = 1; 1282 if (!(sdp->sd_flags & FLG_SY_ELIM) && !dynsym) 1283 sdp->sd_symndx = scopesym_ndx; 1284 else 1285 sdp->sd_symndx = 0; 1286 1287 if (sdp->sd_flags & FLG_SY_ELIM) { 1288 enter_in_symtab = 0; 1289 } else if (ldynsym && sdp->sd_sym->st_name && 1290 ldynsym_symtype[ 1291 ELF_ST_TYPE(sdp->sd_sym->st_info)]) { 1292 dynlocal = 1; 1293 } 1294 } else { 1295 sdp->sd_symndx = *symndx; 1296 } 1297 1298 /* 1299 * Copy basic symbol and string information. 1300 */ 1301 name = sdp->sd_name; 1302 sap = sdp->sd_aux; 1303 1304 /* 1305 * If we require to record version symbol indexes, update the 1306 * associated version symbol information for all defined 1307 * symbols. If a version definition is required any zero value 1308 * symbol indexes would have been flagged as undefined symbol 1309 * errors, however if we're just scoping these need to fall into 1310 * the base of global symbols. 1311 */ 1312 if (sdp->sd_symndx && versym) { 1313 Half vndx = 0; 1314 1315 if (sdp->sd_flags & FLG_SY_MVTOCOMM) { 1316 vndx = VER_NDX_GLOBAL; 1317 } else if (sdp->sd_ref == REF_REL_NEED) { 1318 vndx = sap->sa_overndx; 1319 1320 if ((vndx == 0) && 1321 (sdp->sd_sym->st_shndx != SHN_UNDEF)) { 1322 if (SYM_IS_HIDDEN(sdp)) 1323 vndx = VER_NDX_LOCAL; 1324 else 1325 vndx = VER_NDX_GLOBAL; 1326 } 1327 } else if ((sdp->sd_ref == REF_DYN_NEED) && 1328 (sap->sa_dverndx > 0) && 1329 (sap->sa_dverndx <= sdp->sd_file->ifl_vercnt) && 1330 (sdp->sd_file->ifl_verndx != NULL)) { 1331 /* Use index of verneed record */ 1332 vndx = sdp->sd_file->ifl_verndx 1333 [sap->sa_dverndx].vi_overndx; 1334 } 1335 versym[sdp->sd_symndx] = vndx; 1336 } 1337 1338 /* 1339 * If we are creating the .syminfo section then set per symbol 1340 * flags here. 1341 */ 1342 if (sdp->sd_symndx && syminfo && 1343 !(sdp->sd_flags & FLG_SY_NOTAVAIL)) { 1344 int ndx = sdp->sd_symndx; 1345 APlist **alpp = &(ofl->ofl_symdtent); 1346 1347 if (sdp->sd_flags & FLG_SY_MVTOCOMM) 1348 /* 1349 * Identify a copy relocation symbol. 1350 */ 1351 syminfo[ndx].si_flags |= SYMINFO_FLG_COPY; 1352 1353 if (sdp->sd_ref == REF_DYN_NEED) { 1354 /* 1355 * A reference is bound to a needed dependency. 1356 * Save the syminfo entry, so that when the 1357 * .dynamic section has been updated, a 1358 * DT_NEEDED entry can be associated 1359 * (see update_osyminfo()). 1360 */ 1361 if (aplist_append(alpp, sdp, 1362 AL_CNT_OFL_SYMINFOSYMS) == NULL) 1363 return (0); 1364 1365 /* 1366 * Flag that the symbol has a direct association 1367 * with the external reference (this is an old 1368 * tagging, that has no real effect by itself). 1369 */ 1370 syminfo[ndx].si_flags |= SYMINFO_FLG_DIRECT; 1371 1372 /* 1373 * Flag any lazy or deferred reference. 1374 */ 1375 if (sdp->sd_flags & FLG_SY_LAZYLD) 1376 syminfo[ndx].si_flags |= 1377 SYMINFO_FLG_LAZYLOAD; 1378 if (sdp->sd_flags & FLG_SY_DEFERRED) 1379 syminfo[ndx].si_flags |= 1380 SYMINFO_FLG_DEFERRED; 1381 1382 /* 1383 * Enable direct symbol bindings if: 1384 * 1385 * - Symbol was identified with the DIRECT 1386 * keyword in a mapfile. 1387 * 1388 * - Symbol reference has been bound to a 1389 * dependency which was specified as 1390 * requiring direct bindings with -zdirect. 1391 * 1392 * - All symbol references are required to 1393 * use direct bindings via -Bdirect. 1394 */ 1395 if (sdp->sd_flags & FLG_SY_DIR) 1396 syminfo[ndx].si_flags |= 1397 SYMINFO_FLG_DIRECTBIND; 1398 1399 } else if ((sdp->sd_flags & FLG_SY_EXTERN) && 1400 (sdp->sd_sym->st_shndx == SHN_UNDEF)) { 1401 /* 1402 * If this symbol has been explicitly defined 1403 * as external, and remains unresolved, mark 1404 * it as external. 1405 */ 1406 syminfo[ndx].si_boundto = SYMINFO_BT_EXTERN; 1407 1408 } else if ((sdp->sd_flags & FLG_SY_PARENT) && 1409 (sdp->sd_sym->st_shndx == SHN_UNDEF)) { 1410 /* 1411 * If this symbol has been explicitly defined 1412 * to be a reference to a parent object, 1413 * indicate whether a direct binding should be 1414 * established. 1415 */ 1416 syminfo[ndx].si_flags |= SYMINFO_FLG_DIRECT; 1417 syminfo[ndx].si_boundto = SYMINFO_BT_PARENT; 1418 if (sdp->sd_flags & FLG_SY_DIR) 1419 syminfo[ndx].si_flags |= 1420 SYMINFO_FLG_DIRECTBIND; 1421 1422 } else if (sdp->sd_flags & FLG_SY_STDFLTR) { 1423 /* 1424 * A filter definition. Although this symbol 1425 * can only be a stub, it might be necessary to 1426 * prevent external direct bindings. 1427 */ 1428 syminfo[ndx].si_flags |= SYMINFO_FLG_FILTER; 1429 if (sdp->sd_flags & FLG_SY_NDIR) 1430 syminfo[ndx].si_flags |= 1431 SYMINFO_FLG_NOEXTDIRECT; 1432 1433 } else if (sdp->sd_flags & FLG_SY_AUXFLTR) { 1434 /* 1435 * An auxiliary filter definition. By nature, 1436 * this definition is direct, in that should the 1437 * filtee lookup fail, we'll fall back to this 1438 * object. It may still be necessary to 1439 * prevent external direct bindings. 1440 */ 1441 syminfo[ndx].si_flags |= SYMINFO_FLG_AUXILIARY; 1442 if (sdp->sd_flags & FLG_SY_NDIR) 1443 syminfo[ndx].si_flags |= 1444 SYMINFO_FLG_NOEXTDIRECT; 1445 1446 } else if ((sdp->sd_ref == REF_REL_NEED) && 1447 (sdp->sd_sym->st_shndx != SHN_UNDEF)) { 1448 /* 1449 * This definition exists within the object 1450 * being created. Provide a default boundto 1451 * definition, which may be overridden later. 1452 */ 1453 syminfo[ndx].si_boundto = SYMINFO_BT_NONE; 1454 1455 /* 1456 * Indicate whether it is necessary to prevent 1457 * external direct bindings. 1458 */ 1459 if (sdp->sd_flags & FLG_SY_NDIR) { 1460 syminfo[ndx].si_flags |= 1461 SYMINFO_FLG_NOEXTDIRECT; 1462 } 1463 1464 /* 1465 * Indicate that this symbol is acting as an 1466 * individual interposer. 1467 */ 1468 if (sdp->sd_flags & FLG_SY_INTPOSE) { 1469 syminfo[ndx].si_flags |= 1470 SYMINFO_FLG_INTERPOSE; 1471 } 1472 1473 /* 1474 * Indicate that this symbol is deferred, and 1475 * hence should not be bound to during BIND_NOW 1476 * relocations. 1477 */ 1478 if (sdp->sd_flags & FLG_SY_DEFERRED) { 1479 syminfo[ndx].si_flags |= 1480 SYMINFO_FLG_DEFERRED; 1481 } 1482 1483 /* 1484 * If external bindings are allowed, indicate 1485 * the binding, and a direct binding if 1486 * necessary. 1487 */ 1488 if ((sdp->sd_flags & FLG_SY_NDIR) == 0) { 1489 syminfo[ndx].si_flags |= 1490 SYMINFO_FLG_DIRECT; 1491 1492 if (sdp->sd_flags & FLG_SY_DIR) 1493 syminfo[ndx].si_flags |= 1494 SYMINFO_FLG_DIRECTBIND; 1495 1496 /* 1497 * Provide a default boundto definition, 1498 * which may be overridden later. 1499 */ 1500 syminfo[ndx].si_boundto = 1501 SYMINFO_BT_SELF; 1502 } 1503 1504 /* 1505 * Indicate that this is a capabilities symbol. 1506 * Note, that this identification only provides 1507 * information regarding the symbol that is 1508 * visible from elfdump(1) -y. The association 1509 * of a symbol to its capabilities is derived 1510 * from a .SUNW_capinfo entry. 1511 */ 1512 if ((sdp->sd_flags & FLG_SY_CAP) && 1513 ofl->ofl_oscapinfo) { 1514 syminfo[ndx].si_flags |= 1515 SYMINFO_FLG_CAP; 1516 } 1517 } 1518 } 1519 1520 /* 1521 * Note that the `sym' value is reset to be one of the new 1522 * symbol table entries. This symbol will be updated further 1523 * depending on the type of the symbol. Process the .symtab 1524 * first, followed by the .dynsym, thus the `sym' value will 1525 * remain as the .dynsym value when the .dynsym is present. 1526 * This ensures that any versioning symbols st_name value will 1527 * be appropriate for the string table used by version 1528 * entries. 1529 */ 1530 if (enter_in_symtab) { 1531 Word _symndx; 1532 1533 if (local) 1534 _symndx = scopesym_ndx; 1535 else 1536 _symndx = symtab_ndx; 1537 1538 symtab[_symndx] = *sdp->sd_sym; 1539 sdp->sd_sym = sym = &symtab[_symndx]; 1540 (void) st_setstring(strtab, name, &stoff); 1541 sym->st_name = stoff; 1542 } 1543 if (dynlocal) { 1544 ldynsym[ldynscopesym_ndx] = *sdp->sd_sym; 1545 sdp->sd_sym = sym = &ldynsym[ldynscopesym_ndx]; 1546 (void) st_setstring(dynstr, name, &stoff); 1547 ldynsym[ldynscopesym_ndx].st_name = stoff; 1548 /* Add it to sort section if it qualifies */ 1549 ADD_TO_DYNSORT(sdp, sym, ELF_ST_TYPE(sym->st_info), 1550 ldynscopesym_ndx); 1551 } 1552 1553 if (dynsym && !local) { 1554 dynsym[dynsym_ndx] = *sdp->sd_sym; 1555 1556 /* 1557 * Provided this isn't an unnamed register symbol, 1558 * update the symbols name and hash value. 1559 */ 1560 if (((sdp->sd_flags & FLG_SY_REGSYM) == 0) || 1561 dynsym[dynsym_ndx].st_name) { 1562 (void) st_setstring(dynstr, name, &stoff); 1563 dynsym[dynsym_ndx].st_name = stoff; 1564 1565 if (stoff) { 1566 Word hashval, _hashndx; 1567 1568 hashval = 1569 sap->sa_hash % ofl->ofl_hashbkts; 1570 1571 /* LINTED */ 1572 if (_hashndx = hashbkt[hashval]) { 1573 while (hashchain[_hashndx]) { 1574 _hashndx = 1575 hashchain[_hashndx]; 1576 } 1577 hashchain[_hashndx] = 1578 sdp->sd_symndx; 1579 } else { 1580 hashbkt[hashval] = 1581 sdp->sd_symndx; 1582 } 1583 } 1584 } 1585 sdp->sd_sym = sym = &dynsym[dynsym_ndx]; 1586 1587 /* 1588 * Add it to sort section if it qualifies. 1589 * The indexes in that section are relative to the 1590 * the adjacent SUNW_ldynsym/dymsym pair, so we 1591 * add the number of items in SUNW_ldynsym to the 1592 * dynsym index. 1593 */ 1594 ADD_TO_DYNSORT(sdp, sym, ELF_ST_TYPE(sym->st_info), 1595 ldynsym_cnt + dynsym_ndx); 1596 } 1597 1598 if (!enter_in_symtab && (!dynsym || (local && !dynlocal))) { 1599 if (!(sdp->sd_flags & FLG_SY_UPREQD)) 1600 continue; 1601 sym = sdp->sd_sym; 1602 } else 1603 sdp->sd_flags &= ~FLG_SY_CLEAN; 1604 1605 /* 1606 * If we have a weak data symbol for which we need the real 1607 * symbol also, save this processing until later. 1608 * 1609 * The exception to this is if the weak/strong have PLT's 1610 * assigned to them. In that case we don't do the post-weak 1611 * processing because the PLT's must be maintained so that we 1612 * can do 'interpositioning' on both of the symbols. 1613 */ 1614 if ((sap->sa_linkndx) && 1615 (ELF_ST_BIND(sym->st_info) == STB_WEAK) && 1616 (!sap->sa_PLTndx)) { 1617 Sym_desc *_sdp; 1618 1619 _sdp = sdp->sd_file->ifl_oldndx[sap->sa_linkndx]; 1620 1621 if (_sdp->sd_ref != REF_DYN_SEEN) { 1622 Wk_desc wk; 1623 1624 if (enter_in_symtab) { 1625 if (local) { 1626 wk.wk_symtab = 1627 &symtab[scopesym_ndx]; 1628 scopesym_ndx++; 1629 } else { 1630 wk.wk_symtab = 1631 &symtab[symtab_ndx]; 1632 symtab_ndx++; 1633 } 1634 } else { 1635 wk.wk_symtab = NULL; 1636 } 1637 if (dynsym) { 1638 if (!local) { 1639 wk.wk_dynsym = 1640 &dynsym[dynsym_ndx]; 1641 dynsym_ndx++; 1642 } else if (dynlocal) { 1643 wk.wk_dynsym = 1644 &ldynsym[ldynscopesym_ndx]; 1645 ldynscopesym_ndx++; 1646 } 1647 } else { 1648 wk.wk_dynsym = NULL; 1649 } 1650 wk.wk_weak = sdp; 1651 wk.wk_alias = _sdp; 1652 1653 if (alist_append(&weak, &wk, 1654 sizeof (Wk_desc), AL_CNT_WEAK) == NULL) 1655 return ((Addr)S_ERROR); 1656 1657 continue; 1658 } 1659 } 1660 1661 DBG_CALL(Dbg_syms_old(ofl, sdp)); 1662 1663 spec = 0; 1664 /* 1665 * assign new symbol value. 1666 */ 1667 sectndx = sdp->sd_shndx; 1668 if (sectndx == SHN_UNDEF) { 1669 if (((sdp->sd_flags & FLG_SY_REGSYM) == 0) && 1670 (sym->st_value != 0)) { 1671 ld_eprintf(ofl, ERR_WARNING, 1672 MSG_INTL(MSG_SYM_NOTNULL), 1673 demangle(name), sdp->sd_file->ifl_name); 1674 } 1675 1676 /* 1677 * Undefined weak global, if we are generating a static 1678 * executable, output as an absolute zero. Otherwise 1679 * leave it as is, ld.so.1 will skip symbols of this 1680 * type (this technique allows applications and 1681 * libraries to test for the existence of a symbol as an 1682 * indication of the presence or absence of certain 1683 * functionality). 1684 */ 1685 if (OFL_IS_STATIC_EXEC(ofl) && 1686 (ELF_ST_BIND(sym->st_info) == STB_WEAK)) { 1687 sdp->sd_flags |= FLG_SY_SPECSEC; 1688 sdp->sd_shndx = sectndx = SHN_ABS; 1689 } 1690 } else if ((sdp->sd_flags & FLG_SY_SPECSEC) && 1691 (sectndx == SHN_COMMON)) { 1692 /* COMMONs have already been processed */ 1693 /* EMPTY */ 1694 ; 1695 } else { 1696 if ((sdp->sd_flags & FLG_SY_SPECSEC) && 1697 (sectndx == SHN_ABS)) 1698 spec = sdp->sd_aux->sa_symspec; 1699 1700 /* LINTED */ 1701 if (sdp->sd_flags & FLG_SY_COMMEXP) { 1702 /* 1703 * This is (or was) a COMMON symbol which was 1704 * processed above - no processing 1705 * required here. 1706 */ 1707 ; 1708 } else if (sdp->sd_ref == REF_DYN_NEED) { 1709 uchar_t type, bind; 1710 1711 sectndx = SHN_UNDEF; 1712 sym->st_value = 0; 1713 sym->st_size = 0; 1714 1715 /* 1716 * Make sure this undefined symbol is returned 1717 * to the same binding as was defined in the 1718 * original relocatable object reference. 1719 */ 1720 type = ELF_ST_TYPE(sym-> st_info); 1721 if (sdp->sd_flags & FLG_SY_GLOBREF) 1722 bind = STB_GLOBAL; 1723 else 1724 bind = STB_WEAK; 1725 1726 sym->st_info = ELF_ST_INFO(bind, type); 1727 1728 } else if (((sdp->sd_flags & FLG_SY_SPECSEC) == 0) && 1729 (sdp->sd_ref == REF_REL_NEED)) { 1730 osp = sdp->sd_isc->is_osdesc; 1731 /* LINTED */ 1732 sectndx = elf_ndxscn(osp->os_scn); 1733 1734 /* 1735 * In an executable, the new symbol value is the 1736 * old value (offset into defining section) plus 1737 * virtual address of defining section. In a 1738 * relocatable, the new value is the old value 1739 * plus the displacement of the section within 1740 * the file. 1741 */ 1742 /* LINTED */ 1743 sym->st_value += 1744 (Off)_elf_getxoff(sdp->sd_isc->is_indata); 1745 1746 if (!(flags & FLG_OF_RELOBJ)) { 1747 sym->st_value += osp->os_shdr->sh_addr; 1748 /* 1749 * TLS symbols are relative to 1750 * the TLS segment. 1751 */ 1752 if ((ELF_ST_TYPE(sym->st_info) == 1753 STT_TLS) && (ofl->ofl_tlsphdr)) 1754 sym->st_value -= 1755 ofl->ofl_tlsphdr->p_vaddr; 1756 } 1757 } 1758 } 1759 1760 if (spec) { 1761 switch (spec) { 1762 case SDAUX_ID_ETEXT: 1763 sym->st_value = etext; 1764 sectndx = etext_ndx; 1765 if (etext_abs) 1766 sdp->sd_flags |= FLG_SY_SPECSEC; 1767 else 1768 sdp->sd_flags &= ~FLG_SY_SPECSEC; 1769 break; 1770 case SDAUX_ID_EDATA: 1771 sym->st_value = edata; 1772 sectndx = edata_ndx; 1773 if (edata_abs) 1774 sdp->sd_flags |= FLG_SY_SPECSEC; 1775 else 1776 sdp->sd_flags &= ~FLG_SY_SPECSEC; 1777 break; 1778 case SDAUX_ID_END: 1779 sym->st_value = end; 1780 sectndx = end_ndx; 1781 if (end_abs) 1782 sdp->sd_flags |= FLG_SY_SPECSEC; 1783 else 1784 sdp->sd_flags &= ~FLG_SY_SPECSEC; 1785 break; 1786 case SDAUX_ID_START: 1787 sym->st_value = start; 1788 sectndx = start_ndx; 1789 sdp->sd_flags &= ~FLG_SY_SPECSEC; 1790 break; 1791 case SDAUX_ID_DYN: 1792 if (flags & FLG_OF_DYNAMIC) { 1793 sym->st_value = ofl-> 1794 ofl_osdynamic->os_shdr->sh_addr; 1795 /* LINTED */ 1796 sectndx = elf_ndxscn( 1797 ofl->ofl_osdynamic->os_scn); 1798 sdp->sd_flags &= ~FLG_SY_SPECSEC; 1799 } 1800 break; 1801 case SDAUX_ID_PLT: 1802 if (ofl->ofl_osplt) { 1803 sym->st_value = ofl-> 1804 ofl_osplt->os_shdr->sh_addr; 1805 /* LINTED */ 1806 sectndx = elf_ndxscn( 1807 ofl->ofl_osplt->os_scn); 1808 sdp->sd_flags &= ~FLG_SY_SPECSEC; 1809 } 1810 break; 1811 case SDAUX_ID_GOT: 1812 /* 1813 * Symbol bias for negative growing tables is 1814 * stored in symbol's value during 1815 * allocate_got(). 1816 */ 1817 sym->st_value += ofl-> 1818 ofl_osgot->os_shdr->sh_addr; 1819 /* LINTED */ 1820 sectndx = elf_ndxscn(ofl-> 1821 ofl_osgot->os_scn); 1822 sdp->sd_flags &= ~FLG_SY_SPECSEC; 1823 break; 1824 case SDAUX_ID_SECBOUND_START: 1825 sym->st_value = sap->sa_boundsec-> 1826 os_shdr->sh_addr; 1827 sectndx = elf_ndxscn(sap->sa_boundsec->os_scn); 1828 sdp->sd_flags &= ~FLG_SY_SPECSEC; 1829 break; 1830 case SDAUX_ID_SECBOUND_STOP: 1831 sym->st_value = sap->sa_boundsec-> 1832 os_shdr->sh_addr + 1833 sap->sa_boundsec->os_shdr->sh_size; 1834 sectndx = elf_ndxscn(sap->sa_boundsec->os_scn); 1835 sdp->sd_flags &= ~FLG_SY_SPECSEC; 1836 break; 1837 default: 1838 /* NOTHING */ 1839 ; 1840 } 1841 } 1842 1843 /* 1844 * If a plt index has been assigned to an undefined function, 1845 * update the symbols value to the appropriate .plt address. 1846 */ 1847 if ((flags & FLG_OF_DYNAMIC) && (flags & FLG_OF_EXEC) && 1848 (sdp->sd_file) && 1849 (sdp->sd_file->ifl_ehdr->e_type == ET_DYN) && 1850 (ELF_ST_TYPE(sym->st_info) == STT_FUNC) && 1851 !(flags & FLG_OF_BFLAG)) { 1852 if (sap->sa_PLTndx) 1853 sym->st_value = 1854 (*ld_targ.t_mr.mr_calc_plt_addr)(sdp, ofl); 1855 } 1856 1857 /* 1858 * Finish updating the symbols. 1859 */ 1860 1861 /* 1862 * Sym Update: if scoped local - set local binding 1863 */ 1864 if (local) 1865 sym->st_info = ELF_ST_INFO(STB_LOCAL, 1866 ELF_ST_TYPE(sym->st_info)); 1867 1868 /* 1869 * Sym Updated: If both the .symtab and .dynsym 1870 * are present then we've actually updated the information in 1871 * the .dynsym, therefore copy this same information to the 1872 * .symtab entry. 1873 */ 1874 sdp->sd_shndx = sectndx; 1875 if (enter_in_symtab && dynsym && (!local || dynlocal)) { 1876 Word _symndx = dynlocal ? scopesym_ndx : symtab_ndx; 1877 1878 symtab[_symndx].st_value = sym->st_value; 1879 symtab[_symndx].st_size = sym->st_size; 1880 symtab[_symndx].st_info = sym->st_info; 1881 symtab[_symndx].st_other = sym->st_other; 1882 } 1883 1884 if (enter_in_symtab) { 1885 Word _symndx; 1886 1887 if (local) 1888 _symndx = scopesym_ndx++; 1889 else 1890 _symndx = symtab_ndx++; 1891 if (((sdp->sd_flags & FLG_SY_SPECSEC) == 0) && 1892 (sectndx >= SHN_LORESERVE)) { 1893 assert(symshndx != NULL); 1894 symshndx[_symndx] = sectndx; 1895 symtab[_symndx].st_shndx = SHN_XINDEX; 1896 } else { 1897 /* LINTED */ 1898 symtab[_symndx].st_shndx = (Half)sectndx; 1899 } 1900 } 1901 1902 if (dynsym && (!local || dynlocal)) { 1903 /* 1904 * dynsym and ldynsym are distinct tables, so 1905 * we use indirection to access the right one 1906 * and the related extended section index array. 1907 */ 1908 Word _symndx; 1909 Sym *_dynsym; 1910 Word *_dynshndx; 1911 1912 if (!local) { 1913 _symndx = dynsym_ndx++; 1914 _dynsym = dynsym; 1915 _dynshndx = dynshndx; 1916 } else { 1917 _symndx = ldynscopesym_ndx++; 1918 _dynsym = ldynsym; 1919 _dynshndx = ldynshndx; 1920 } 1921 if (((sdp->sd_flags & FLG_SY_SPECSEC) == 0) && 1922 (sectndx >= SHN_LORESERVE)) { 1923 assert(_dynshndx != NULL); 1924 _dynshndx[_symndx] = sectndx; 1925 _dynsym[_symndx].st_shndx = SHN_XINDEX; 1926 } else { 1927 /* LINTED */ 1928 _dynsym[_symndx].st_shndx = (Half)sectndx; 1929 } 1930 } 1931 1932 DBG_CALL(Dbg_syms_new(ofl, sym, sdp)); 1933 } 1934 1935 /* 1936 * Now that all the symbols have been processed update any weak symbols 1937 * information (ie. copy all information except `st_name'). As both 1938 * symbols will be represented in the output, return the weak symbol to 1939 * its correct type. 1940 */ 1941 for (ALIST_TRAVERSE(weak, idx1, wkp)) { 1942 Sym_desc *sdp, *_sdp; 1943 Sym *sym, *_sym, *__sym; 1944 uchar_t bind; 1945 1946 sdp = wkp->wk_weak; 1947 _sdp = wkp->wk_alias; 1948 _sym = __sym = _sdp->sd_sym; 1949 1950 sdp->sd_flags |= FLG_SY_WEAKDEF; 1951 1952 /* 1953 * If the symbol definition has been scoped then assign it to 1954 * be local, otherwise if it's from a shared object then we need 1955 * to maintain the binding of the original reference. 1956 */ 1957 if (SYM_IS_HIDDEN(sdp)) { 1958 if (ld_sym_reducable(ofl, sdp)) 1959 bind = STB_LOCAL; 1960 else 1961 bind = STB_WEAK; 1962 } else if ((sdp->sd_ref == REF_DYN_NEED) && 1963 (sdp->sd_flags & FLG_SY_GLOBREF)) 1964 bind = STB_GLOBAL; 1965 else 1966 bind = STB_WEAK; 1967 1968 DBG_CALL(Dbg_syms_old(ofl, sdp)); 1969 if ((sym = wkp->wk_symtab) != NULL) { 1970 sym->st_value = _sym->st_value; 1971 sym->st_size = _sym->st_size; 1972 sym->st_other = _sym->st_other; 1973 sym->st_shndx = _sym->st_shndx; 1974 sym->st_info = ELF_ST_INFO(bind, 1975 ELF_ST_TYPE(sym->st_info)); 1976 __sym = sym; 1977 } 1978 if ((sym = wkp->wk_dynsym) != NULL) { 1979 sym->st_value = _sym->st_value; 1980 sym->st_size = _sym->st_size; 1981 sym->st_other = _sym->st_other; 1982 sym->st_shndx = _sym->st_shndx; 1983 sym->st_info = ELF_ST_INFO(bind, 1984 ELF_ST_TYPE(sym->st_info)); 1985 __sym = sym; 1986 } 1987 DBG_CALL(Dbg_syms_new(ofl, __sym, sdp)); 1988 } 1989 1990 /* 1991 * Now display GOT debugging information if required. 1992 */ 1993 DBG_CALL(Dbg_got_display(ofl, 0, 0, 1994 ld_targ.t_m.m_got_xnumber, ld_targ.t_m.m_got_entsize)); 1995 1996 /* 1997 * Update the section headers information. sh_info is 1998 * supposed to contain the offset at which the first 1999 * global symbol resides in the symbol table, while 2000 * sh_link contains the section index of the associated 2001 * string table. 2002 */ 2003 if (symtab) { 2004 Shdr *shdr = ofl->ofl_ossymtab->os_shdr; 2005 2006 shdr->sh_info = symtab_gbl_bndx; 2007 /* LINTED */ 2008 shdr->sh_link = (Word)elf_ndxscn(ofl->ofl_osstrtab->os_scn); 2009 if (symshndx) 2010 ofl->ofl_ossymshndx->os_shdr->sh_link = 2011 (Word)elf_ndxscn(ofl->ofl_ossymtab->os_scn); 2012 2013 /* 2014 * Ensure that the expected number of symbols 2015 * were entered into the right spots: 2016 * - Scoped symbols in the right range 2017 * - Globals start at the right spot 2018 * (correct number of locals entered) 2019 * - The table is exactly filled 2020 * (correct number of globals entered) 2021 */ 2022 assert((scopesym_bndx + ofl->ofl_scopecnt) == scopesym_ndx); 2023 assert(shdr->sh_info == SYMTAB_LOC_CNT(ofl)); 2024 assert((shdr->sh_info + ofl->ofl_globcnt) == symtab_ndx); 2025 } 2026 if (dynsym) { 2027 Shdr *shdr = ofl->ofl_osdynsym->os_shdr; 2028 2029 shdr->sh_info = DYNSYM_LOC_CNT(ofl); 2030 /* LINTED */ 2031 shdr->sh_link = (Word)elf_ndxscn(ofl->ofl_osdynstr->os_scn); 2032 2033 ofl->ofl_oshash->os_shdr->sh_link = 2034 /* LINTED */ 2035 (Word)elf_ndxscn(ofl->ofl_osdynsym->os_scn); 2036 if (dynshndx) { 2037 shdr = ofl->ofl_osdynshndx->os_shdr; 2038 shdr->sh_link = 2039 (Word)elf_ndxscn(ofl->ofl_osdynsym->os_scn); 2040 } 2041 } 2042 if (ldynsym) { 2043 Shdr *shdr = ofl->ofl_osldynsym->os_shdr; 2044 2045 /* ldynsym has no globals, so give index one past the end */ 2046 shdr->sh_info = ldynsym_ndx; 2047 2048 /* 2049 * The ldynsym and dynsym must be adjacent. The 2050 * idea is that rtld should be able to start with 2051 * the ldynsym and march straight through the end 2052 * of dynsym, seeing them as a single symbol table, 2053 * despite the fact that they are in distinct sections. 2054 * Ensure that this happened correctly. 2055 * 2056 * Note that I use ldynsym_ndx here instead of the 2057 * computation I used to set the section size 2058 * (found in ldynsym_cnt). The two will agree, unless 2059 * we somehow miscounted symbols or failed to insert them 2060 * all. Using ldynsym_ndx here catches that error in 2061 * addition to checking for adjacency. 2062 */ 2063 assert(dynsym == (ldynsym + ldynsym_ndx)); 2064 2065 2066 /* LINTED */ 2067 shdr->sh_link = (Word)elf_ndxscn(ofl->ofl_osdynstr->os_scn); 2068 2069 if (ldynshndx) { 2070 shdr = ofl->ofl_osldynshndx->os_shdr; 2071 shdr->sh_link = 2072 (Word)elf_ndxscn(ofl->ofl_osldynsym->os_scn); 2073 } 2074 2075 /* 2076 * The presence of .SUNW_ldynsym means that there may be 2077 * associated sort sections, one for regular symbols 2078 * and the other for TLS. Each sort section needs the 2079 * following done: 2080 * - Section header link references .SUNW_ldynsym 2081 * - Should have received the expected # of items 2082 * - Sorted by increasing address 2083 */ 2084 if (ofl->ofl_osdynsymsort) { /* .SUNW_dynsymsort */ 2085 ofl->ofl_osdynsymsort->os_shdr->sh_link = 2086 (Word)elf_ndxscn(ofl->ofl_osldynsym->os_scn); 2087 assert(ofl->ofl_dynsymsortcnt == dynsymsort_ndx); 2088 2089 if (dynsymsort_ndx > 1) { 2090 dynsort_compare_syms = ldynsym; 2091 qsort(dynsymsort, dynsymsort_ndx, 2092 sizeof (*dynsymsort), dynsort_compare); 2093 dynsort_dupwarn(ofl, ldynsym, 2094 st_getstrbuf(dynstr), 2095 dynsymsort, dynsymsort_ndx, 2096 MSG_ORIG(MSG_SCN_DYNSYMSORT)); 2097 } 2098 } 2099 if (ofl->ofl_osdyntlssort) { /* .SUNW_dyntlssort */ 2100 ofl->ofl_osdyntlssort->os_shdr->sh_link = 2101 (Word)elf_ndxscn(ofl->ofl_osldynsym->os_scn); 2102 assert(ofl->ofl_dyntlssortcnt == dyntlssort_ndx); 2103 2104 if (dyntlssort_ndx > 1) { 2105 dynsort_compare_syms = ldynsym; 2106 qsort(dyntlssort, dyntlssort_ndx, 2107 sizeof (*dyntlssort), dynsort_compare); 2108 dynsort_dupwarn(ofl, ldynsym, 2109 st_getstrbuf(dynstr), 2110 dyntlssort, dyntlssort_ndx, 2111 MSG_ORIG(MSG_SCN_DYNTLSSORT)); 2112 } 2113 } 2114 } 2115 2116 /* 2117 * Used by ld.so.1 only. 2118 */ 2119 return (etext); 2120 2121 #undef ADD_TO_DYNSORT 2122 } 2123 2124 /* 2125 * Build the dynamic section. 2126 * 2127 * This routine must be maintained in parallel with make_dynamic() 2128 * in sections.c 2129 */ 2130 static int 2131 update_odynamic(Ofl_desc *ofl) 2132 { 2133 Aliste idx; 2134 Ifl_desc *ifl; 2135 Sym_desc *sdp; 2136 Shdr *shdr; 2137 Dyn *_dyn = (Dyn *)ofl->ofl_osdynamic->os_outdata->d_buf; 2138 Dyn *dyn; 2139 Os_desc *symosp, *strosp; 2140 Str_tbl *strtbl; 2141 size_t stoff; 2142 ofl_flag_t flags = ofl->ofl_flags; 2143 int not_relobj = !(flags & FLG_OF_RELOBJ); 2144 Word cnt; 2145 2146 /* 2147 * Relocatable objects can be built with -r and -dy to trigger the 2148 * creation of a .dynamic section. This model is used to create kernel 2149 * device drivers. The .dynamic section provides a subset of userland 2150 * .dynamic entries, typically entries such as DT_NEEDED and DT_RUNPATH. 2151 * 2152 * Within a dynamic object, any .dynamic string references are to the 2153 * .dynstr table. Within a relocatable object, these strings can reside 2154 * within the .strtab. 2155 */ 2156 if (OFL_IS_STATIC_OBJ(ofl)) { 2157 symosp = ofl->ofl_ossymtab; 2158 strosp = ofl->ofl_osstrtab; 2159 strtbl = ofl->ofl_strtab; 2160 } else { 2161 symosp = ofl->ofl_osdynsym; 2162 strosp = ofl->ofl_osdynstr; 2163 strtbl = ofl->ofl_dynstrtab; 2164 } 2165 2166 /* LINTED */ 2167 ofl->ofl_osdynamic->os_shdr->sh_link = (Word)elf_ndxscn(strosp->os_scn); 2168 2169 dyn = _dyn; 2170 2171 for (APLIST_TRAVERSE(ofl->ofl_sos, idx, ifl)) { 2172 if ((ifl->ifl_flags & 2173 (FLG_IF_IGNORE | FLG_IF_DEPREQD)) == FLG_IF_IGNORE) 2174 continue; 2175 2176 /* 2177 * Create and set up the DT_POSFLAG_1 entry here if required. 2178 */ 2179 if ((ifl->ifl_flags & MSK_IF_POSFLAG1) && 2180 (ifl->ifl_flags & FLG_IF_NEEDED) && not_relobj) { 2181 dyn->d_tag = DT_POSFLAG_1; 2182 if (ifl->ifl_flags & FLG_IF_LAZYLD) 2183 dyn->d_un.d_val = DF_P1_LAZYLOAD; 2184 if (ifl->ifl_flags & FLG_IF_GRPPRM) 2185 dyn->d_un.d_val |= DF_P1_GROUPPERM; 2186 if (ifl->ifl_flags & FLG_IF_DEFERRED) 2187 dyn->d_un.d_val |= DF_P1_DEFERRED; 2188 dyn++; 2189 } 2190 2191 if (ifl->ifl_flags & (FLG_IF_NEEDED | FLG_IF_NEEDSTR)) 2192 dyn->d_tag = DT_NEEDED; 2193 else 2194 continue; 2195 2196 (void) st_setstring(strtbl, ifl->ifl_soname, &stoff); 2197 dyn->d_un.d_val = stoff; 2198 /* LINTED */ 2199 ifl->ifl_neededndx = (Half)(((uintptr_t)dyn - (uintptr_t)_dyn) / 2200 sizeof (Dyn)); 2201 dyn++; 2202 } 2203 2204 if (not_relobj) { 2205 if (ofl->ofl_dtsfltrs != NULL) { 2206 Dfltr_desc *dftp; 2207 2208 for (ALIST_TRAVERSE(ofl->ofl_dtsfltrs, idx, dftp)) { 2209 if (dftp->dft_flag == FLG_SY_AUXFLTR) 2210 dyn->d_tag = DT_SUNW_AUXILIARY; 2211 else 2212 dyn->d_tag = DT_SUNW_FILTER; 2213 2214 (void) st_setstring(strtbl, dftp->dft_str, 2215 &stoff); 2216 dyn->d_un.d_val = stoff; 2217 dftp->dft_ndx = (Half)(((uintptr_t)dyn - 2218 (uintptr_t)_dyn) / sizeof (Dyn)); 2219 dyn++; 2220 } 2221 } 2222 if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_INIT_U), 2223 SYM_NOHASH, 0, ofl)) != NULL) && 2224 (sdp->sd_ref == REF_REL_NEED) && 2225 (sdp->sd_sym->st_shndx != SHN_UNDEF)) { 2226 dyn->d_tag = DT_INIT; 2227 dyn->d_un.d_ptr = sdp->sd_sym->st_value; 2228 dyn++; 2229 } 2230 if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_FINI_U), 2231 SYM_NOHASH, 0, ofl)) != NULL) && 2232 (sdp->sd_ref == REF_REL_NEED) && 2233 (sdp->sd_sym->st_shndx != SHN_UNDEF)) { 2234 dyn->d_tag = DT_FINI; 2235 dyn->d_un.d_ptr = sdp->sd_sym->st_value; 2236 dyn++; 2237 } 2238 if (ofl->ofl_soname) { 2239 dyn->d_tag = DT_SONAME; 2240 (void) st_setstring(strtbl, ofl->ofl_soname, &stoff); 2241 dyn->d_un.d_val = stoff; 2242 dyn++; 2243 } 2244 if (ofl->ofl_filtees) { 2245 if (flags & FLG_OF_AUX) { 2246 dyn->d_tag = DT_AUXILIARY; 2247 } else { 2248 dyn->d_tag = DT_FILTER; 2249 } 2250 (void) st_setstring(strtbl, ofl->ofl_filtees, &stoff); 2251 dyn->d_un.d_val = stoff; 2252 dyn++; 2253 } 2254 } 2255 2256 if (ofl->ofl_rpath) { 2257 (void) st_setstring(strtbl, ofl->ofl_rpath, &stoff); 2258 dyn->d_tag = DT_RUNPATH; 2259 dyn->d_un.d_val = stoff; 2260 dyn++; 2261 dyn->d_tag = DT_RPATH; 2262 dyn->d_un.d_val = stoff; 2263 dyn++; 2264 } 2265 2266 if (not_relobj) { 2267 Aliste idx; 2268 Sg_desc *sgp; 2269 2270 if (ofl->ofl_config) { 2271 dyn->d_tag = DT_CONFIG; 2272 (void) st_setstring(strtbl, ofl->ofl_config, &stoff); 2273 dyn->d_un.d_val = stoff; 2274 dyn++; 2275 } 2276 if (ofl->ofl_depaudit) { 2277 dyn->d_tag = DT_DEPAUDIT; 2278 (void) st_setstring(strtbl, ofl->ofl_depaudit, &stoff); 2279 dyn->d_un.d_val = stoff; 2280 dyn++; 2281 } 2282 if (ofl->ofl_audit) { 2283 dyn->d_tag = DT_AUDIT; 2284 (void) st_setstring(strtbl, ofl->ofl_audit, &stoff); 2285 dyn->d_un.d_val = stoff; 2286 dyn++; 2287 } 2288 2289 dyn->d_tag = DT_HASH; 2290 dyn->d_un.d_ptr = ofl->ofl_oshash->os_shdr->sh_addr; 2291 dyn++; 2292 2293 shdr = strosp->os_shdr; 2294 dyn->d_tag = DT_STRTAB; 2295 dyn->d_un.d_ptr = shdr->sh_addr; 2296 dyn++; 2297 2298 dyn->d_tag = DT_STRSZ; 2299 dyn->d_un.d_ptr = shdr->sh_size; 2300 dyn++; 2301 2302 /* 2303 * Note, the shdr is set and used in the ofl->ofl_osldynsym case 2304 * that follows. 2305 */ 2306 shdr = symosp->os_shdr; 2307 dyn->d_tag = DT_SYMTAB; 2308 dyn->d_un.d_ptr = shdr->sh_addr; 2309 dyn++; 2310 2311 dyn->d_tag = DT_SYMENT; 2312 dyn->d_un.d_ptr = shdr->sh_entsize; 2313 dyn++; 2314 2315 if (ofl->ofl_osldynsym) { 2316 Shdr *lshdr = ofl->ofl_osldynsym->os_shdr; 2317 2318 /* 2319 * We have arranged for the .SUNW_ldynsym data to be 2320 * immediately in front of the .dynsym data. 2321 * This means that you could start at the top 2322 * of .SUNW_ldynsym and see the data for both tables 2323 * without a break. This is the view we want to 2324 * provide for DT_SUNW_SYMTAB, which is why we 2325 * add the lengths together. 2326 */ 2327 dyn->d_tag = DT_SUNW_SYMTAB; 2328 dyn->d_un.d_ptr = lshdr->sh_addr; 2329 dyn++; 2330 2331 dyn->d_tag = DT_SUNW_SYMSZ; 2332 dyn->d_un.d_val = lshdr->sh_size + shdr->sh_size; 2333 dyn++; 2334 } 2335 2336 if (ofl->ofl_osdynsymsort || ofl->ofl_osdyntlssort) { 2337 dyn->d_tag = DT_SUNW_SORTENT; 2338 dyn->d_un.d_val = sizeof (Word); 2339 dyn++; 2340 } 2341 2342 if (ofl->ofl_osdynsymsort) { 2343 shdr = ofl->ofl_osdynsymsort->os_shdr; 2344 2345 dyn->d_tag = DT_SUNW_SYMSORT; 2346 dyn->d_un.d_ptr = shdr->sh_addr; 2347 dyn++; 2348 2349 dyn->d_tag = DT_SUNW_SYMSORTSZ; 2350 dyn->d_un.d_val = shdr->sh_size; 2351 dyn++; 2352 } 2353 2354 if (ofl->ofl_osdyntlssort) { 2355 shdr = ofl->ofl_osdyntlssort->os_shdr; 2356 2357 dyn->d_tag = DT_SUNW_TLSSORT; 2358 dyn->d_un.d_ptr = shdr->sh_addr; 2359 dyn++; 2360 2361 dyn->d_tag = DT_SUNW_TLSSORTSZ; 2362 dyn->d_un.d_val = shdr->sh_size; 2363 dyn++; 2364 } 2365 2366 /* 2367 * Reserve the DT_CHECKSUM entry. Its value will be filled in 2368 * after the complete image is built. 2369 */ 2370 dyn->d_tag = DT_CHECKSUM; 2371 ofl->ofl_checksum = &dyn->d_un.d_val; 2372 dyn++; 2373 2374 /* 2375 * Versioning sections: DT_VERDEF and DT_VERNEED. 2376 * 2377 * The Solaris ld does not produce DT_VERSYM, but the GNU ld 2378 * does, in order to support their style of versioning, which 2379 * differs from ours: 2380 * 2381 * - The top bit of the 16-bit Versym index is 2382 * not part of the version, but is interpreted 2383 * as a "hidden bit". 2384 * 2385 * - External (SHN_UNDEF) symbols can have non-zero 2386 * Versym values, which specify versions in 2387 * referenced objects, via the Verneed section. 2388 * 2389 * - The vna_other field of the Vernaux structures 2390 * found in the Verneed section are not zero as 2391 * with Solaris, but instead contain the version 2392 * index to be used by Versym indices to reference 2393 * the given external version. 2394 * 2395 * The Solaris ld, rtld, and elfdump programs all interpret the 2396 * presence of DT_VERSYM as meaning that GNU versioning rules 2397 * apply to the given file. If DT_VERSYM is not present, 2398 * then Solaris versioning rules apply. If we should ever need 2399 * to change our ld so that it does issue DT_VERSYM, then 2400 * this rule for detecting GNU versioning will no longer work. 2401 * In that case, we will have to invent a way to explicitly 2402 * specify the style of versioning in use, perhaps via a 2403 * new dynamic entry named something like DT_SUNW_VERSIONSTYLE, 2404 * where the d_un.d_val value specifies which style is to be 2405 * used. 2406 */ 2407 if ((flags & (FLG_OF_VERDEF | FLG_OF_NOVERSEC)) == 2408 FLG_OF_VERDEF) { 2409 shdr = ofl->ofl_osverdef->os_shdr; 2410 2411 dyn->d_tag = DT_VERDEF; 2412 dyn->d_un.d_ptr = shdr->sh_addr; 2413 dyn++; 2414 dyn->d_tag = DT_VERDEFNUM; 2415 dyn->d_un.d_ptr = shdr->sh_info; 2416 dyn++; 2417 } 2418 if ((flags & (FLG_OF_VERNEED | FLG_OF_NOVERSEC)) == 2419 FLG_OF_VERNEED) { 2420 shdr = ofl->ofl_osverneed->os_shdr; 2421 2422 dyn->d_tag = DT_VERNEED; 2423 dyn->d_un.d_ptr = shdr->sh_addr; 2424 dyn++; 2425 dyn->d_tag = DT_VERNEEDNUM; 2426 dyn->d_un.d_ptr = shdr->sh_info; 2427 dyn++; 2428 } 2429 2430 if ((flags & FLG_OF_COMREL) && ofl->ofl_relocrelcnt) { 2431 dyn->d_tag = ld_targ.t_m.m_rel_dt_count; 2432 dyn->d_un.d_val = ofl->ofl_relocrelcnt; 2433 dyn++; 2434 } 2435 if (flags & FLG_OF_TEXTREL) { 2436 /* 2437 * Only the presence of this entry is used in this 2438 * implementation, not the value stored. 2439 */ 2440 dyn->d_tag = DT_TEXTREL; 2441 dyn->d_un.d_val = 0; 2442 dyn++; 2443 } 2444 2445 if (ofl->ofl_osfiniarray) { 2446 shdr = ofl->ofl_osfiniarray->os_shdr; 2447 2448 dyn->d_tag = DT_FINI_ARRAY; 2449 dyn->d_un.d_ptr = shdr->sh_addr; 2450 dyn++; 2451 2452 dyn->d_tag = DT_FINI_ARRAYSZ; 2453 dyn->d_un.d_val = shdr->sh_size; 2454 dyn++; 2455 } 2456 2457 if (ofl->ofl_osinitarray) { 2458 shdr = ofl->ofl_osinitarray->os_shdr; 2459 2460 dyn->d_tag = DT_INIT_ARRAY; 2461 dyn->d_un.d_ptr = shdr->sh_addr; 2462 dyn++; 2463 2464 dyn->d_tag = DT_INIT_ARRAYSZ; 2465 dyn->d_un.d_val = shdr->sh_size; 2466 dyn++; 2467 } 2468 2469 if (ofl->ofl_ospreinitarray) { 2470 shdr = ofl->ofl_ospreinitarray->os_shdr; 2471 2472 dyn->d_tag = DT_PREINIT_ARRAY; 2473 dyn->d_un.d_ptr = shdr->sh_addr; 2474 dyn++; 2475 2476 dyn->d_tag = DT_PREINIT_ARRAYSZ; 2477 dyn->d_un.d_val = shdr->sh_size; 2478 dyn++; 2479 } 2480 2481 if (ofl->ofl_pltcnt) { 2482 shdr = ofl->ofl_osplt->os_relosdesc->os_shdr; 2483 2484 dyn->d_tag = DT_PLTRELSZ; 2485 dyn->d_un.d_ptr = shdr->sh_size; 2486 dyn++; 2487 dyn->d_tag = DT_PLTREL; 2488 dyn->d_un.d_ptr = ld_targ.t_m.m_rel_dt_type; 2489 dyn++; 2490 dyn->d_tag = DT_JMPREL; 2491 dyn->d_un.d_ptr = shdr->sh_addr; 2492 dyn++; 2493 } 2494 if (ofl->ofl_pltpad) { 2495 shdr = ofl->ofl_osplt->os_shdr; 2496 2497 dyn->d_tag = DT_PLTPAD; 2498 if (ofl->ofl_pltcnt) { 2499 dyn->d_un.d_ptr = shdr->sh_addr + 2500 ld_targ.t_m.m_plt_reservsz + 2501 ofl->ofl_pltcnt * ld_targ.t_m.m_plt_entsize; 2502 } else 2503 dyn->d_un.d_ptr = shdr->sh_addr; 2504 dyn++; 2505 dyn->d_tag = DT_PLTPADSZ; 2506 dyn->d_un.d_val = ofl->ofl_pltpad * 2507 ld_targ.t_m.m_plt_entsize; 2508 dyn++; 2509 } 2510 if (ofl->ofl_relocsz) { 2511 shdr = ofl->ofl_osrelhead->os_shdr; 2512 2513 dyn->d_tag = ld_targ.t_m.m_rel_dt_type; 2514 dyn->d_un.d_ptr = shdr->sh_addr; 2515 dyn++; 2516 dyn->d_tag = ld_targ.t_m.m_rel_dt_size; 2517 dyn->d_un.d_ptr = ofl->ofl_relocsz; 2518 dyn++; 2519 dyn->d_tag = ld_targ.t_m.m_rel_dt_ent; 2520 if (shdr->sh_type == SHT_REL) 2521 dyn->d_un.d_ptr = sizeof (Rel); 2522 else 2523 dyn->d_un.d_ptr = sizeof (Rela); 2524 dyn++; 2525 } 2526 if (ofl->ofl_ossyminfo) { 2527 shdr = ofl->ofl_ossyminfo->os_shdr; 2528 2529 dyn->d_tag = DT_SYMINFO; 2530 dyn->d_un.d_ptr = shdr->sh_addr; 2531 dyn++; 2532 dyn->d_tag = DT_SYMINSZ; 2533 dyn->d_un.d_val = shdr->sh_size; 2534 dyn++; 2535 dyn->d_tag = DT_SYMINENT; 2536 dyn->d_un.d_val = sizeof (Syminfo); 2537 dyn++; 2538 } 2539 if (ofl->ofl_osmove) { 2540 shdr = ofl->ofl_osmove->os_shdr; 2541 2542 dyn->d_tag = DT_MOVETAB; 2543 dyn->d_un.d_val = shdr->sh_addr; 2544 dyn++; 2545 dyn->d_tag = DT_MOVESZ; 2546 dyn->d_un.d_val = shdr->sh_size; 2547 dyn++; 2548 dyn->d_tag = DT_MOVEENT; 2549 dyn->d_un.d_val = shdr->sh_entsize; 2550 dyn++; 2551 } 2552 if (ofl->ofl_regsymcnt) { 2553 int ndx; 2554 2555 for (ndx = 0; ndx < ofl->ofl_regsymsno; ndx++) { 2556 if ((sdp = ofl->ofl_regsyms[ndx]) == NULL) 2557 continue; 2558 2559 dyn->d_tag = ld_targ.t_m.m_dt_register; 2560 dyn->d_un.d_val = sdp->sd_symndx; 2561 dyn++; 2562 } 2563 } 2564 2565 for (APLIST_TRAVERSE(ofl->ofl_rtldinfo, idx, sdp)) { 2566 dyn->d_tag = DT_SUNW_RTLDINF; 2567 dyn->d_un.d_ptr = sdp->sd_sym->st_value; 2568 dyn++; 2569 } 2570 2571 if (((sgp = ofl->ofl_osdynamic->os_sgdesc) != NULL) && 2572 (sgp->sg_phdr.p_flags & PF_W) && ofl->ofl_osinterp) { 2573 dyn->d_tag = DT_DEBUG; 2574 dyn->d_un.d_ptr = 0; 2575 dyn++; 2576 } 2577 2578 if (ofl->ofl_oscap) { 2579 dyn->d_tag = DT_SUNW_CAP; 2580 dyn->d_un.d_val = ofl->ofl_oscap->os_shdr->sh_addr; 2581 dyn++; 2582 } 2583 if (ofl->ofl_oscapinfo) { 2584 dyn->d_tag = DT_SUNW_CAPINFO; 2585 dyn->d_un.d_val = ofl->ofl_oscapinfo->os_shdr->sh_addr; 2586 dyn++; 2587 } 2588 if (ofl->ofl_oscapchain) { 2589 shdr = ofl->ofl_oscapchain->os_shdr; 2590 2591 dyn->d_tag = DT_SUNW_CAPCHAIN; 2592 dyn->d_un.d_val = shdr->sh_addr; 2593 dyn++; 2594 dyn->d_tag = DT_SUNW_CAPCHAINSZ; 2595 dyn->d_un.d_val = shdr->sh_size; 2596 dyn++; 2597 dyn->d_tag = DT_SUNW_CAPCHAINENT; 2598 dyn->d_un.d_val = shdr->sh_entsize; 2599 dyn++; 2600 } 2601 2602 if (ofl->ofl_aslr != 0) { 2603 dyn->d_tag = DT_SUNW_ASLR; 2604 dyn->d_un.d_val = (ofl->ofl_aslr == 1); 2605 dyn++; 2606 } 2607 2608 if (flags & FLG_OF_SYMBOLIC) { 2609 dyn->d_tag = DT_SYMBOLIC; 2610 dyn->d_un.d_val = 0; 2611 dyn++; 2612 } 2613 } 2614 2615 dyn->d_tag = DT_FLAGS; 2616 dyn->d_un.d_val = ofl->ofl_dtflags; 2617 dyn++; 2618 2619 /* 2620 * If -Bdirect was specified, but some NODIRECT symbols were specified 2621 * via a mapfile, or -znodirect was used on the command line, then 2622 * clear the DF_1_DIRECT flag. The resultant object will use per-symbol 2623 * direct bindings rather than be enabled for global direct bindings. 2624 * 2625 * If any no-direct bindings exist within this object, set the 2626 * DF_1_NODIRECT flag. ld(1) recognizes this flag when processing 2627 * dependencies, and performs extra work to ensure that no direct 2628 * bindings are established to the no-direct symbols that exist 2629 * within these dependencies. 2630 */ 2631 if (ofl->ofl_flags1 & FLG_OF1_NGLBDIR) 2632 ofl->ofl_dtflags_1 &= ~DF_1_DIRECT; 2633 if (ofl->ofl_flags1 & FLG_OF1_NDIRECT) 2634 ofl->ofl_dtflags_1 |= DF_1_NODIRECT; 2635 2636 dyn->d_tag = DT_FLAGS_1; 2637 dyn->d_un.d_val = ofl->ofl_dtflags_1; 2638 dyn++; 2639 2640 dyn->d_tag = DT_SUNW_STRPAD; 2641 dyn->d_un.d_val = DYNSTR_EXTRA_PAD; 2642 dyn++; 2643 2644 dyn->d_tag = DT_SUNW_LDMACH; 2645 dyn->d_un.d_val = ld_sunw_ldmach(); 2646 dyn++; 2647 2648 if (ofl->ofl_flags & FLG_OF_KMOD) { 2649 dyn->d_tag = DT_SUNW_KMOD; 2650 dyn->d_un.d_val = 1; 2651 dyn++; 2652 } 2653 2654 (*ld_targ.t_mr.mr_mach_update_odynamic)(ofl, &dyn); 2655 2656 for (cnt = 1 + DYNAMIC_EXTRA_ELTS; cnt--; dyn++) { 2657 dyn->d_tag = DT_NULL; 2658 dyn->d_un.d_val = 0; 2659 } 2660 2661 /* 2662 * Ensure that we wrote the right number of entries. If not, we either 2663 * miscounted in make_dynamic(), or we did something wrong in this 2664 * function. 2665 */ 2666 assert((ofl->ofl_osdynamic->os_shdr->sh_size / 2667 ofl->ofl_osdynamic->os_shdr->sh_entsize) == 2668 ((uintptr_t)dyn - (uintptr_t)_dyn) / sizeof (*dyn)); 2669 2670 return (1); 2671 } 2672 2673 /* 2674 * Build the version definition section 2675 */ 2676 static int 2677 update_overdef(Ofl_desc *ofl) 2678 { 2679 Aliste idx1; 2680 Ver_desc *vdp, *_vdp; 2681 Verdef *vdf, *_vdf; 2682 int num = 0; 2683 Os_desc *strosp; 2684 Str_tbl *strtbl; 2685 2686 /* 2687 * Determine which string table to use. 2688 */ 2689 if (OFL_IS_STATIC_OBJ(ofl)) { 2690 strtbl = ofl->ofl_strtab; 2691 strosp = ofl->ofl_osstrtab; 2692 } else { 2693 strtbl = ofl->ofl_dynstrtab; 2694 strosp = ofl->ofl_osdynstr; 2695 } 2696 2697 /* 2698 * Traverse the version descriptors and update the version structures 2699 * to point to the dynstr name in preparation for building the version 2700 * section structure. 2701 */ 2702 for (APLIST_TRAVERSE(ofl->ofl_verdesc, idx1, vdp)) { 2703 Sym_desc *sdp; 2704 2705 if (vdp->vd_flags & VER_FLG_BASE) { 2706 const char *name = vdp->vd_name; 2707 size_t stoff; 2708 2709 /* 2710 * Create a new string table entry to represent the base 2711 * version name (there is no corresponding symbol for 2712 * this). 2713 */ 2714 (void) st_setstring(strtbl, name, &stoff); 2715 /* LINTED */ 2716 vdp->vd_name = (const char *)stoff; 2717 } else { 2718 sdp = ld_sym_find(vdp->vd_name, vdp->vd_hash, 0, ofl); 2719 /* LINTED */ 2720 vdp->vd_name = (const char *) 2721 (uintptr_t)sdp->sd_sym->st_name; 2722 } 2723 } 2724 2725 _vdf = vdf = (Verdef *)ofl->ofl_osverdef->os_outdata->d_buf; 2726 2727 /* 2728 * Traverse the version descriptors and update the version section to 2729 * reflect each version and its associated dependencies. 2730 */ 2731 for (APLIST_TRAVERSE(ofl->ofl_verdesc, idx1, vdp)) { 2732 Aliste idx2; 2733 Half cnt = 1; 2734 Verdaux *vdap, *_vdap; 2735 2736 _vdap = vdap = (Verdaux *)(vdf + 1); 2737 2738 vdf->vd_version = VER_DEF_CURRENT; 2739 vdf->vd_flags = vdp->vd_flags & MSK_VER_USER; 2740 vdf->vd_ndx = vdp->vd_ndx; 2741 vdf->vd_hash = vdp->vd_hash; 2742 2743 /* LINTED */ 2744 vdap->vda_name = (uintptr_t)vdp->vd_name; 2745 vdap++; 2746 /* LINTED */ 2747 _vdap->vda_next = (Word)((uintptr_t)vdap - (uintptr_t)_vdap); 2748 2749 /* 2750 * Traverse this versions dependency list generating the 2751 * appropriate version dependency entries. 2752 */ 2753 for (APLIST_TRAVERSE(vdp->vd_deps, idx2, _vdp)) { 2754 /* LINTED */ 2755 vdap->vda_name = (uintptr_t)_vdp->vd_name; 2756 _vdap = vdap; 2757 vdap++, cnt++; 2758 /* LINTED */ 2759 _vdap->vda_next = (Word)((uintptr_t)vdap - 2760 (uintptr_t)_vdap); 2761 } 2762 _vdap->vda_next = 0; 2763 2764 /* 2765 * Record the versions auxiliary array offset and the associated 2766 * dependency count. 2767 */ 2768 /* LINTED */ 2769 vdf->vd_aux = (Word)((uintptr_t)(vdf + 1) - (uintptr_t)vdf); 2770 vdf->vd_cnt = cnt; 2771 2772 /* 2773 * Record the next versions offset and update the version 2774 * pointer. Remember the previous version offset as the very 2775 * last structures next pointer should be null. 2776 */ 2777 _vdf = vdf; 2778 vdf = (Verdef *)vdap, num++; 2779 /* LINTED */ 2780 _vdf->vd_next = (Word)((uintptr_t)vdf - (uintptr_t)_vdf); 2781 } 2782 _vdf->vd_next = 0; 2783 2784 /* 2785 * Record the string table association with the version definition 2786 * section, and the symbol table associated with the version symbol 2787 * table (the actual contents of the version symbol table are filled 2788 * in during symbol update). 2789 */ 2790 /* LINTED */ 2791 ofl->ofl_osverdef->os_shdr->sh_link = (Word)elf_ndxscn(strosp->os_scn); 2792 2793 /* 2794 * The version definition sections `info' field is used to indicate the 2795 * number of entries in this section. 2796 */ 2797 ofl->ofl_osverdef->os_shdr->sh_info = num; 2798 2799 return (1); 2800 } 2801 2802 /* 2803 * Finish the version symbol index section 2804 */ 2805 static void 2806 update_oversym(Ofl_desc *ofl) 2807 { 2808 Os_desc *osp; 2809 2810 /* 2811 * Record the symbol table associated with the version symbol table. 2812 * The contents of the version symbol table are filled in during 2813 * symbol update. 2814 */ 2815 if (OFL_IS_STATIC_OBJ(ofl)) 2816 osp = ofl->ofl_ossymtab; 2817 else 2818 osp = ofl->ofl_osdynsym; 2819 2820 /* LINTED */ 2821 ofl->ofl_osversym->os_shdr->sh_link = (Word)elf_ndxscn(osp->os_scn); 2822 } 2823 2824 /* 2825 * Build the version needed section 2826 */ 2827 static int 2828 update_overneed(Ofl_desc *ofl) 2829 { 2830 Aliste idx1; 2831 Ifl_desc *ifl; 2832 Verneed *vnd, *_vnd; 2833 Os_desc *strosp; 2834 Str_tbl *strtbl; 2835 Word num = 0; 2836 2837 _vnd = vnd = (Verneed *)ofl->ofl_osverneed->os_outdata->d_buf; 2838 2839 /* 2840 * Determine which string table is appropriate. 2841 */ 2842 if (OFL_IS_STATIC_OBJ(ofl)) { 2843 strosp = ofl->ofl_osstrtab; 2844 strtbl = ofl->ofl_strtab; 2845 } else { 2846 strosp = ofl->ofl_osdynstr; 2847 strtbl = ofl->ofl_dynstrtab; 2848 } 2849 2850 /* 2851 * Traverse the shared object list looking for dependencies that have 2852 * versions defined within them. 2853 */ 2854 for (APLIST_TRAVERSE(ofl->ofl_sos, idx1, ifl)) { 2855 Half _cnt; 2856 Word cnt = 0; 2857 Vernaux *_vnap, *vnap; 2858 size_t stoff; 2859 2860 if (!(ifl->ifl_flags & FLG_IF_VERNEED)) 2861 continue; 2862 2863 vnd->vn_version = VER_NEED_CURRENT; 2864 2865 (void) st_setstring(strtbl, ifl->ifl_soname, &stoff); 2866 vnd->vn_file = stoff; 2867 2868 _vnap = vnap = (Vernaux *)(vnd + 1); 2869 2870 /* 2871 * Traverse the version index list recording 2872 * each version as a needed dependency. 2873 */ 2874 for (_cnt = 0; _cnt <= ifl->ifl_vercnt; _cnt++) { 2875 Ver_index *vip = &ifl->ifl_verndx[_cnt]; 2876 2877 if (vip->vi_flags & FLG_VER_REFER) { 2878 (void) st_setstring(strtbl, vip->vi_name, 2879 &stoff); 2880 vnap->vna_name = stoff; 2881 2882 if (vip->vi_desc) { 2883 vnap->vna_hash = vip->vi_desc->vd_hash; 2884 vnap->vna_flags = 2885 vip->vi_desc->vd_flags; 2886 } else { 2887 vnap->vna_hash = 0; 2888 vnap->vna_flags = 0; 2889 } 2890 vnap->vna_other = vip->vi_overndx; 2891 2892 /* 2893 * If version A inherits version B, then 2894 * B is implicit in A. It suffices for ld.so.1 2895 * to verify A at runtime and skip B. The 2896 * version normalization process sets the INFO 2897 * flag for the versions we want ld.so.1 to 2898 * skip. 2899 */ 2900 if (vip->vi_flags & VER_FLG_INFO) 2901 vnap->vna_flags |= VER_FLG_INFO; 2902 2903 _vnap = vnap; 2904 vnap++, cnt++; 2905 _vnap->vna_next = 2906 /* LINTED */ 2907 (Word)((uintptr_t)vnap - (uintptr_t)_vnap); 2908 } 2909 } 2910 2911 _vnap->vna_next = 0; 2912 2913 /* 2914 * Record the versions auxiliary array offset and 2915 * the associated dependency count. 2916 */ 2917 /* LINTED */ 2918 vnd->vn_aux = (Word)((uintptr_t)(vnd + 1) - (uintptr_t)vnd); 2919 /* LINTED */ 2920 vnd->vn_cnt = (Half)cnt; 2921 2922 /* 2923 * Record the next versions offset and update the version 2924 * pointer. Remember the previous version offset as the very 2925 * last structures next pointer should be null. 2926 */ 2927 _vnd = vnd; 2928 vnd = (Verneed *)vnap, num++; 2929 /* LINTED */ 2930 _vnd->vn_next = (Word)((uintptr_t)vnd - (uintptr_t)_vnd); 2931 } 2932 _vnd->vn_next = 0; 2933 2934 /* 2935 * Use sh_link to record the associated string table section, and 2936 * sh_info to indicate the number of entries contained in the section. 2937 */ 2938 /* LINTED */ 2939 ofl->ofl_osverneed->os_shdr->sh_link = (Word)elf_ndxscn(strosp->os_scn); 2940 ofl->ofl_osverneed->os_shdr->sh_info = num; 2941 2942 return (1); 2943 } 2944 2945 /* 2946 * Update syminfo section. 2947 */ 2948 static uintptr_t 2949 update_osyminfo(Ofl_desc *ofl) 2950 { 2951 Os_desc *symosp, *infosp = ofl->ofl_ossyminfo; 2952 Syminfo *sip = infosp->os_outdata->d_buf; 2953 Shdr *shdr = infosp->os_shdr; 2954 char *strtab; 2955 Aliste idx; 2956 Sym_desc *sdp; 2957 Sfltr_desc *sftp; 2958 2959 if (ofl->ofl_flags & FLG_OF_RELOBJ) { 2960 symosp = ofl->ofl_ossymtab; 2961 strtab = ofl->ofl_osstrtab->os_outdata->d_buf; 2962 } else { 2963 symosp = ofl->ofl_osdynsym; 2964 strtab = ofl->ofl_osdynstr->os_outdata->d_buf; 2965 } 2966 2967 /* LINTED */ 2968 infosp->os_shdr->sh_link = (Word)elf_ndxscn(symosp->os_scn); 2969 if (ofl->ofl_osdynamic) 2970 infosp->os_shdr->sh_info = 2971 /* LINTED */ 2972 (Word)elf_ndxscn(ofl->ofl_osdynamic->os_scn); 2973 2974 /* 2975 * Update any references with the index into the dynamic table. 2976 */ 2977 for (APLIST_TRAVERSE(ofl->ofl_symdtent, idx, sdp)) 2978 sip[sdp->sd_symndx].si_boundto = sdp->sd_file->ifl_neededndx; 2979 2980 /* 2981 * Update any filtee references with the index into the dynamic table. 2982 */ 2983 for (ALIST_TRAVERSE(ofl->ofl_symfltrs, idx, sftp)) { 2984 Dfltr_desc *dftp; 2985 2986 dftp = alist_item(ofl->ofl_dtsfltrs, sftp->sft_idx); 2987 sip[sftp->sft_sdp->sd_symndx].si_boundto = dftp->dft_ndx; 2988 } 2989 2990 /* 2991 * Display debugging information about section. 2992 */ 2993 DBG_CALL(Dbg_syminfo_title(ofl->ofl_lml)); 2994 if (DBG_ENABLED) { 2995 Word _cnt, cnt = shdr->sh_size / shdr->sh_entsize; 2996 Sym *symtab = symosp->os_outdata->d_buf; 2997 Dyn *dyn; 2998 2999 if (ofl->ofl_osdynamic) 3000 dyn = ofl->ofl_osdynamic->os_outdata->d_buf; 3001 else 3002 dyn = NULL; 3003 3004 for (_cnt = 1; _cnt < cnt; _cnt++) { 3005 if (sip[_cnt].si_flags || sip[_cnt].si_boundto) 3006 /* LINTED */ 3007 DBG_CALL(Dbg_syminfo_entry(ofl->ofl_lml, _cnt, 3008 &sip[_cnt], &symtab[_cnt], strtab, dyn)); 3009 } 3010 } 3011 return (1); 3012 } 3013 3014 /* 3015 * Build the output elf header. 3016 */ 3017 static uintptr_t 3018 update_oehdr(Ofl_desc * ofl) 3019 { 3020 Ehdr *ehdr = ofl->ofl_nehdr; 3021 3022 /* 3023 * If an entry point symbol has already been established (refer 3024 * sym_validate()) simply update the elf header entry point with the 3025 * symbols value. If no entry point is defined it will have been filled 3026 * with the start address of the first section within the text segment 3027 * (refer update_outfile()). 3028 */ 3029 if (ofl->ofl_entry) 3030 ehdr->e_entry = 3031 ((Sym_desc *)(ofl->ofl_entry))->sd_sym->st_value; 3032 3033 ehdr->e_ident[EI_DATA] = ld_targ.t_m.m_data; 3034 ehdr->e_version = ofl->ofl_dehdr->e_version; 3035 3036 /* 3037 * When generating a relocatable object under -z symbolcap, set the 3038 * e_machine to be generic, and remove any e_flags. Input relocatable 3039 * objects may identify alternative e_machine (m.machplus) and e_flags 3040 * values. However, the functions within the created output object 3041 * are selected at runtime using the capabilities mechanism, which 3042 * supersedes the e-machine and e_flags information. Therefore, 3043 * e_machine and e_flag values are not propagated to the output object, 3044 * as these values might prevent the kernel from loading the object 3045 * before the runtime linker gets control. 3046 */ 3047 if (ofl->ofl_flags & FLG_OF_OTOSCAP) { 3048 ehdr->e_machine = ld_targ.t_m.m_mach; 3049 ehdr->e_flags = 0; 3050 } else { 3051 /* 3052 * Note. it may be necessary to update the e_flags field in the 3053 * machine dependent section. 3054 */ 3055 ehdr->e_machine = ofl->ofl_dehdr->e_machine; 3056 ehdr->e_flags = ofl->ofl_dehdr->e_flags; 3057 3058 if (ehdr->e_machine != ld_targ.t_m.m_mach) { 3059 if (ehdr->e_machine != ld_targ.t_m.m_machplus) 3060 return (S_ERROR); 3061 if ((ehdr->e_flags & ld_targ.t_m.m_flagsplus) == 0) 3062 return (S_ERROR); 3063 } 3064 } 3065 3066 if (ofl->ofl_flags & FLG_OF_SHAROBJ) 3067 ehdr->e_type = ET_DYN; 3068 else if (ofl->ofl_flags & FLG_OF_RELOBJ) 3069 ehdr->e_type = ET_REL; 3070 else 3071 ehdr->e_type = ET_EXEC; 3072 3073 return (1); 3074 } 3075 3076 /* 3077 * Perform move table expansion. 3078 */ 3079 static void 3080 expand_move(Ofl_desc *ofl, Sym_desc *sdp, Move *mvp) 3081 { 3082 Os_desc *osp; 3083 uchar_t *taddr, *taddr0; 3084 Sxword offset; 3085 Half cnt; 3086 uint_t stride; 3087 3088 osp = ofl->ofl_isparexpn->is_osdesc; 3089 offset = sdp->sd_sym->st_value - osp->os_shdr->sh_addr; 3090 3091 taddr0 = taddr = osp->os_outdata->d_buf; 3092 taddr += offset; 3093 taddr = taddr + mvp->m_poffset; 3094 3095 for (cnt = 0; cnt < mvp->m_repeat; cnt++) { 3096 /* LINTED */ 3097 DBG_CALL(Dbg_move_expand(ofl->ofl_lml, mvp, 3098 (Addr)(taddr - taddr0))); 3099 stride = (uint_t)mvp->m_stride + 1; 3100 3101 /* 3102 * Update the target address based upon the move entry size. 3103 * This size was validated in ld_process_move(). 3104 */ 3105 /* LINTED */ 3106 switch (ELF_M_SIZE(mvp->m_info)) { 3107 case 1: 3108 /* LINTED */ 3109 *taddr = (uchar_t)mvp->m_value; 3110 taddr += stride; 3111 break; 3112 case 2: 3113 /* LINTED */ 3114 *((Half *)taddr) = (Half)mvp->m_value; 3115 taddr += 2 * stride; 3116 break; 3117 case 4: 3118 /* LINTED */ 3119 *((Word *)taddr) = (Word)mvp->m_value; 3120 taddr += 4 * stride; 3121 break; 3122 case 8: 3123 /* LINTED */ 3124 *((u_longlong_t *)taddr) = mvp->m_value; 3125 taddr += 8 * stride; 3126 break; 3127 } 3128 } 3129 } 3130 3131 /* 3132 * Update Move sections. 3133 */ 3134 static void 3135 update_move(Ofl_desc *ofl) 3136 { 3137 Word ndx = 0; 3138 ofl_flag_t flags = ofl->ofl_flags; 3139 Move *omvp; 3140 Aliste idx1; 3141 Sym_desc *sdp; 3142 3143 /* 3144 * Determine the index of the symbol table that will be referenced by 3145 * the Move section. 3146 */ 3147 if (OFL_ALLOW_DYNSYM(ofl)) 3148 /* LINTED */ 3149 ndx = (Word) elf_ndxscn(ofl->ofl_osdynsym->os_scn); 3150 else if (!(flags & FLG_OF_STRIP) || (flags & FLG_OF_RELOBJ)) 3151 /* LINTED */ 3152 ndx = (Word) elf_ndxscn(ofl->ofl_ossymtab->os_scn); 3153 3154 /* 3155 * Update sh_link of the Move section, and point to the new Move data. 3156 */ 3157 if (ofl->ofl_osmove) { 3158 ofl->ofl_osmove->os_shdr->sh_link = ndx; 3159 omvp = (Move *)ofl->ofl_osmove->os_outdata->d_buf; 3160 } 3161 3162 /* 3163 * Update symbol entry index 3164 */ 3165 for (APLIST_TRAVERSE(ofl->ofl_parsyms, idx1, sdp)) { 3166 Aliste idx2; 3167 Mv_desc *mdp; 3168 3169 /* 3170 * Expand move table 3171 */ 3172 if (sdp->sd_flags & FLG_SY_PAREXPN) { 3173 const char *str; 3174 3175 if (flags & FLG_OF_STATIC) 3176 str = MSG_INTL(MSG_PSYM_EXPREASON1); 3177 else if (ofl->ofl_flags1 & FLG_OF1_NOPARTI) 3178 str = MSG_INTL(MSG_PSYM_EXPREASON2); 3179 else 3180 str = MSG_INTL(MSG_PSYM_EXPREASON3); 3181 3182 DBG_CALL(Dbg_move_parexpn(ofl->ofl_lml, 3183 sdp->sd_name, str)); 3184 3185 for (ALIST_TRAVERSE(sdp->sd_move, idx2, mdp)) { 3186 DBG_CALL(Dbg_move_entry1(ofl->ofl_lml, 0, 3187 mdp->md_move, sdp)); 3188 expand_move(ofl, sdp, mdp->md_move); 3189 } 3190 continue; 3191 } 3192 3193 /* 3194 * Process move table 3195 */ 3196 DBG_CALL(Dbg_move_outmove(ofl->ofl_lml, sdp->sd_name)); 3197 3198 for (ALIST_TRAVERSE(sdp->sd_move, idx2, mdp)) { 3199 Move *imvp; 3200 int idx = 1; 3201 Sym *sym; 3202 3203 imvp = mdp->md_move; 3204 sym = sdp->sd_sym; 3205 3206 DBG_CALL(Dbg_move_entry1(ofl->ofl_lml, 1, imvp, sdp)); 3207 3208 *omvp = *imvp; 3209 if ((flags & FLG_OF_RELOBJ) == 0) { 3210 if (ELF_ST_BIND(sym->st_info) == STB_LOCAL) { 3211 Os_desc *osp = sdp->sd_isc->is_osdesc; 3212 Word ndx = osp->os_identndx; 3213 3214 omvp->m_info = 3215 /* LINTED */ 3216 ELF_M_INFO(ndx, imvp->m_info); 3217 3218 if (ELF_ST_TYPE(sym->st_info) != 3219 STT_SECTION) { 3220 omvp->m_poffset = 3221 sym->st_value - 3222 osp->os_shdr->sh_addr + 3223 imvp->m_poffset; 3224 } 3225 } else { 3226 omvp->m_info = 3227 /* LINTED */ 3228 ELF_M_INFO(sdp->sd_symndx, 3229 imvp->m_info); 3230 } 3231 } else { 3232 Boolean isredloc = FALSE; 3233 3234 if ((ELF_ST_BIND(sym->st_info) == STB_LOCAL) && 3235 (ofl->ofl_flags & FLG_OF_REDLSYM)) 3236 isredloc = TRUE; 3237 3238 if (isredloc && !(sdp->sd_move)) { 3239 Os_desc *osp = sdp->sd_isc->is_osdesc; 3240 Word ndx = osp->os_identndx; 3241 3242 omvp->m_info = 3243 /* LINTED */ 3244 ELF_M_INFO(ndx, imvp->m_info); 3245 3246 omvp->m_poffset += sym->st_value; 3247 } else { 3248 if (isredloc) 3249 DBG_CALL(Dbg_syms_reduce(ofl, 3250 DBG_SYM_REDUCE_RETAIN, 3251 sdp, idx, 3252 ofl->ofl_osmove->os_name)); 3253 3254 omvp->m_info = 3255 /* LINTED */ 3256 ELF_M_INFO(sdp->sd_symndx, 3257 imvp->m_info); 3258 } 3259 } 3260 3261 DBG_CALL(Dbg_move_entry1(ofl->ofl_lml, 0, omvp, sdp)); 3262 omvp++; 3263 idx++; 3264 } 3265 } 3266 } 3267 3268 /* 3269 * Scan through the SHT_GROUP output sections. Update their sh_link/sh_info 3270 * fields as well as the section contents. 3271 */ 3272 static uintptr_t 3273 update_ogroup(Ofl_desc *ofl) 3274 { 3275 Aliste idx; 3276 Os_desc *osp; 3277 uintptr_t error = 0; 3278 3279 for (APLIST_TRAVERSE(ofl->ofl_osgroups, idx, osp)) { 3280 Is_desc *isp; 3281 Ifl_desc *ifl; 3282 Shdr *shdr = osp->os_shdr; 3283 Sym_desc *sdp; 3284 Xword i, grpcnt; 3285 Word *gdata; 3286 3287 /* 3288 * Since input GROUP sections always create unique 3289 * output GROUP sections - we know there is only one 3290 * item on the list. 3291 */ 3292 isp = ld_os_first_isdesc(osp); 3293 3294 ifl = isp->is_file; 3295 sdp = ifl->ifl_oldndx[isp->is_shdr->sh_info]; 3296 shdr->sh_link = (Word)elf_ndxscn(ofl->ofl_ossymtab->os_scn); 3297 shdr->sh_info = sdp->sd_symndx; 3298 3299 /* 3300 * Scan through the group data section and update 3301 * all of the links to new values. 3302 */ 3303 grpcnt = shdr->sh_size / shdr->sh_entsize; 3304 gdata = (Word *)osp->os_outdata->d_buf; 3305 3306 for (i = 1; i < grpcnt; i++) { 3307 Is_desc *_isp = ifl->ifl_isdesc[gdata[i]]; 3308 Os_desc *_osp = _isp->is_osdesc; 3309 3310 /* 3311 * If a section in the group is not part of the output 3312 * image, something has gone wrong, and corrupted this 3313 * group. 3314 */ 3315 if (_osp == NULL) { 3316 ld_eprintf(ofl, ERR_FATAL, 3317 MSG_INTL(MSG_GRP_MISSINGOUT), 3318 ifl->ifl_name, gdata[i], _isp->is_name, 3319 elf_ndxscn(osp->os_scn), osp->os_name); 3320 error = S_ERROR; 3321 } else { 3322 gdata[i] = (Word)elf_ndxscn(_osp->os_scn); 3323 } 3324 } 3325 } 3326 return (error); 3327 } 3328 3329 static void 3330 update_ostrtab(Os_desc *osp, Str_tbl *stp, uint_t extra) 3331 { 3332 Elf_Data *data; 3333 3334 if (osp == NULL) 3335 return; 3336 3337 data = osp->os_outdata; 3338 assert(data->d_size == (st_getstrtab_sz(stp) + extra)); 3339 (void) st_setstrbuf(stp, data->d_buf, data->d_size - extra); 3340 /* If leaving an extra hole at the end, zero it */ 3341 if (extra > 0) 3342 (void) memset((char *)data->d_buf + data->d_size - extra, 3343 0x0, extra); 3344 } 3345 3346 /* 3347 * Update capabilities information. 3348 * 3349 * If string table capabilities exist, then the associated string must be 3350 * translated into an offset into the string table. 3351 */ 3352 static void 3353 update_oscap(Ofl_desc *ofl) 3354 { 3355 Os_desc *strosp, *cosp; 3356 Cap *cap; 3357 Str_tbl *strtbl; 3358 Capstr *capstr; 3359 size_t stoff; 3360 Aliste idx1; 3361 3362 /* 3363 * Determine which symbol table or string table is appropriate. 3364 */ 3365 if (OFL_IS_STATIC_OBJ(ofl)) { 3366 strosp = ofl->ofl_osstrtab; 3367 strtbl = ofl->ofl_strtab; 3368 } else { 3369 strosp = ofl->ofl_osdynstr; 3370 strtbl = ofl->ofl_dynstrtab; 3371 } 3372 3373 /* 3374 * If symbol capabilities exist, set the sh_link field of the .SUNW_cap 3375 * section to the .SUNW_capinfo section. 3376 */ 3377 if (ofl->ofl_oscapinfo) { 3378 cosp = ofl->ofl_oscap; 3379 cosp->os_shdr->sh_link = 3380 (Word)elf_ndxscn(ofl->ofl_oscapinfo->os_scn); 3381 } 3382 3383 /* 3384 * If there are capability strings to process, set the sh_info 3385 * field of the .SUNW_cap section to the associated string table, and 3386 * proceed to process any CA_SUNW_PLAT entries. 3387 */ 3388 if ((ofl->ofl_flags & FLG_OF_CAPSTRS) == 0) 3389 return; 3390 3391 cosp = ofl->ofl_oscap; 3392 cosp->os_shdr->sh_info = (Word)elf_ndxscn(strosp->os_scn); 3393 3394 cap = ofl->ofl_oscap->os_outdata->d_buf; 3395 3396 /* 3397 * Determine whether an object capability identifier, or object 3398 * machine/platform capabilities exists. 3399 */ 3400 capstr = &ofl->ofl_ocapset.oc_id; 3401 if (capstr->cs_str) { 3402 (void) st_setstring(strtbl, capstr->cs_str, &stoff); 3403 cap[capstr->cs_ndx].c_un.c_ptr = stoff; 3404 } 3405 for (ALIST_TRAVERSE(ofl->ofl_ocapset.oc_plat.cl_val, idx1, capstr)) { 3406 (void) st_setstring(strtbl, capstr->cs_str, &stoff); 3407 cap[capstr->cs_ndx].c_un.c_ptr = stoff; 3408 } 3409 for (ALIST_TRAVERSE(ofl->ofl_ocapset.oc_mach.cl_val, idx1, capstr)) { 3410 (void) st_setstring(strtbl, capstr->cs_str, &stoff); 3411 cap[capstr->cs_ndx].c_un.c_ptr = stoff; 3412 } 3413 3414 /* 3415 * Determine any symbol capability identifiers, or machine/platform 3416 * capabilities. 3417 */ 3418 if (ofl->ofl_capgroups) { 3419 Cap_group *cgp; 3420 3421 for (APLIST_TRAVERSE(ofl->ofl_capgroups, idx1, cgp)) { 3422 Objcapset *ocapset = &cgp->cg_set; 3423 Aliste idx2; 3424 3425 capstr = &ocapset->oc_id; 3426 if (capstr->cs_str) { 3427 (void) st_setstring(strtbl, capstr->cs_str, 3428 &stoff); 3429 cap[capstr->cs_ndx].c_un.c_ptr = stoff; 3430 } 3431 for (ALIST_TRAVERSE(ocapset->oc_plat.cl_val, idx2, 3432 capstr)) { 3433 (void) st_setstring(strtbl, capstr->cs_str, 3434 &stoff); 3435 cap[capstr->cs_ndx].c_un.c_ptr = stoff; 3436 } 3437 for (ALIST_TRAVERSE(ocapset->oc_mach.cl_val, idx2, 3438 capstr)) { 3439 (void) st_setstring(strtbl, capstr->cs_str, 3440 &stoff); 3441 cap[capstr->cs_ndx].c_un.c_ptr = stoff; 3442 } 3443 } 3444 } 3445 } 3446 3447 /* 3448 * Update the .SUNW_capinfo, and possibly the .SUNW_capchain sections. 3449 */ 3450 static void 3451 update_oscapinfo(Ofl_desc *ofl) 3452 { 3453 Os_desc *symosp, *ciosp, *ccosp = NULL; 3454 Capinfo *ocapinfo; 3455 Capchain *ocapchain; 3456 Cap_avlnode *cav; 3457 Word chainndx = 0; 3458 3459 /* 3460 * Determine which symbol table is appropriate. 3461 */ 3462 if (OFL_IS_STATIC_OBJ(ofl)) 3463 symosp = ofl->ofl_ossymtab; 3464 else 3465 symosp = ofl->ofl_osdynsym; 3466 3467 /* 3468 * Update the .SUNW_capinfo sh_link to point to the appropriate symbol 3469 * table section. If we're creating a dynamic object, the 3470 * .SUNW_capinfo sh_info is updated to point to the .SUNW_capchain 3471 * section. 3472 */ 3473 ciosp = ofl->ofl_oscapinfo; 3474 ciosp->os_shdr->sh_link = (Word)elf_ndxscn(symosp->os_scn); 3475 3476 if (OFL_IS_STATIC_OBJ(ofl) == 0) { 3477 ccosp = ofl->ofl_oscapchain; 3478 ciosp->os_shdr->sh_info = (Word)elf_ndxscn(ccosp->os_scn); 3479 } 3480 3481 /* 3482 * Establish the data for each section. The first element of each 3483 * section defines the section's version number. 3484 */ 3485 ocapinfo = ciosp->os_outdata->d_buf; 3486 ocapinfo[0] = CAPINFO_CURRENT; 3487 if (ccosp) { 3488 ocapchain = ccosp->os_outdata->d_buf; 3489 ocapchain[chainndx++] = CAPCHAIN_CURRENT; 3490 } 3491 3492 /* 3493 * Traverse all capabilities families. Each member has a .SUNW_capinfo 3494 * assignment. The .SUNW_capinfo entry differs for relocatable objects 3495 * and dynamic objects. 3496 * 3497 * Relocatable objects: 3498 * ELF_C_GROUP ELF_C_SYM 3499 * 3500 * Family lead: CAPINFO_SUNW_GLOB lead symbol index 3501 * Family lead alias: CAPINFO_SUNW_GLOB lead symbol index 3502 * Family member: .SUNW_cap index lead symbol index 3503 * 3504 * Dynamic objects: 3505 * ELF_C_GROUP ELF_C_SYM 3506 * 3507 * Family lead: CAPINFO_SUNW_GLOB .SUNW_capchain index 3508 * Family lead alias: CAPINFO_SUNW_GLOB .SUNW_capchain index 3509 * Family member: .SUNW_cap index lead symbol index 3510 * 3511 * The ELF_C_GROUP field identifies a capabilities symbol. Lead 3512 * capability symbols, and lead capability aliases are identified by 3513 * a CAPINFO_SUNW_GLOB group identifier. For family members, the 3514 * ELF_C_GROUP provides an index to the associate capabilities group 3515 * (i.e, an index into the SUNW_cap section that defines a group). 3516 * 3517 * For relocatable objects, the ELF_C_SYM field identifies the lead 3518 * capability symbol. For the lead symbol itself, the .SUNW_capinfo 3519 * index is the same as the ELF_C_SYM value. For lead alias symbols, 3520 * the .SUNW_capinfo index differs from the ELF_C_SYM value. This 3521 * differentiation of CAPINFO_SUNW_GLOB symbols allows ld(1) to 3522 * identify, and propagate lead alias symbols. For example, the lead 3523 * capability symbol memcpy() would have the ELF_C_SYM for memcpy(), 3524 * and the lead alias _memcpy() would also have the ELF_C_SYM for 3525 * memcpy(). 3526 * 3527 * For dynamic objects, both a lead capability symbol, and alias symbol 3528 * would have a ELF_C_SYM value that represents the same capability 3529 * chain index. The capability chain allows ld.so.1 to traverse a 3530 * family chain for a given lead symbol, and select the most appropriate 3531 * family member. The .SUNW_capchain array contains a series of symbol 3532 * indexes for each family member: 3533 * 3534 * chaincap[n] chaincap[n + 1] chaincap[n + 2] chaincap[n + x] 3535 * foo() ndx foo%x() ndx foo%y() ndx 0 3536 * 3537 * For family members, the ELF_C_SYM value associates the capability 3538 * members with their family lead symbol. This association, although 3539 * unused within a dynamic object, allows ld(1) to identify, and 3540 * propagate family members when processing relocatable objects. 3541 */ 3542 for (cav = avl_first(ofl->ofl_capfamilies); cav; 3543 cav = AVL_NEXT(ofl->ofl_capfamilies, cav)) { 3544 Cap_sym *csp; 3545 Aliste idx; 3546 Sym_desc *asdp, *lsdp = cav->cn_symavlnode.sav_sdp; 3547 3548 if (ccosp) { 3549 /* 3550 * For a dynamic object, identify this lead symbol, and 3551 * point it to the head of a capability chain. Set the 3552 * head of the capability chain to the same lead symbol. 3553 */ 3554 ocapinfo[lsdp->sd_symndx] = 3555 ELF_C_INFO(chainndx, CAPINFO_SUNW_GLOB); 3556 ocapchain[chainndx] = lsdp->sd_symndx; 3557 } else { 3558 /* 3559 * For a relocatable object, identify this lead symbol, 3560 * and set the lead symbol index to itself. 3561 */ 3562 ocapinfo[lsdp->sd_symndx] = 3563 ELF_C_INFO(lsdp->sd_symndx, CAPINFO_SUNW_GLOB); 3564 } 3565 3566 /* 3567 * Gather any lead symbol aliases. 3568 */ 3569 for (APLIST_TRAVERSE(cav->cn_aliases, idx, asdp)) { 3570 if (ccosp) { 3571 /* 3572 * For a dynamic object, identify this lead 3573 * alias symbol, and point it to the same 3574 * capability chain index as the lead symbol. 3575 */ 3576 ocapinfo[asdp->sd_symndx] = 3577 ELF_C_INFO(chainndx, CAPINFO_SUNW_GLOB); 3578 } else { 3579 /* 3580 * For a relocatable object, identify this lead 3581 * alias symbol, and set the lead symbol index 3582 * to the lead symbol. 3583 */ 3584 ocapinfo[asdp->sd_symndx] = 3585 ELF_C_INFO(lsdp->sd_symndx, 3586 CAPINFO_SUNW_GLOB); 3587 } 3588 } 3589 3590 chainndx++; 3591 3592 /* 3593 * Gather the family members. 3594 */ 3595 for (APLIST_TRAVERSE(cav->cn_members, idx, csp)) { 3596 Sym_desc *msdp = csp->cs_sdp; 3597 3598 /* 3599 * Identify the members capability group, and the lead 3600 * symbol of the family this symbol is a member of. 3601 */ 3602 ocapinfo[msdp->sd_symndx] = 3603 ELF_C_INFO(lsdp->sd_symndx, csp->cs_group->cg_ndx); 3604 if (ccosp) { 3605 /* 3606 * For a dynamic object, set the next capability 3607 * chain to point to this family member. 3608 */ 3609 ocapchain[chainndx++] = msdp->sd_symndx; 3610 } 3611 } 3612 3613 /* 3614 * Any chain of family members is terminated with a 0 element. 3615 */ 3616 if (ccosp) 3617 ocapchain[chainndx++] = 0; 3618 } 3619 } 3620 3621 /* 3622 * Translate the shdr->sh_{link, info} from its input section value to that 3623 * of the corresponding shdr->sh_{link, info} output section value. 3624 */ 3625 static Word 3626 translate_link(Ofl_desc *ofl, Os_desc *osp, Word link, const char *msg) 3627 { 3628 Is_desc *isp; 3629 Ifl_desc *ifl; 3630 3631 /* 3632 * Don't translate the special section numbers. 3633 */ 3634 if (link >= SHN_LORESERVE) 3635 return (link); 3636 3637 /* 3638 * Does this output section translate back to an input file. If not 3639 * then there is no translation to do. In this case we will assume that 3640 * if sh_link has a value, it's the right value. 3641 */ 3642 isp = ld_os_first_isdesc(osp); 3643 if ((ifl = isp->is_file) == NULL) 3644 return (link); 3645 3646 /* 3647 * Sanity check to make sure that the sh_{link, info} value 3648 * is within range for the input file. 3649 */ 3650 if (link >= ifl->ifl_shnum) { 3651 ld_eprintf(ofl, ERR_WARNING, msg, ifl->ifl_name, 3652 EC_WORD(isp->is_scnndx), isp->is_name, EC_XWORD(link)); 3653 return (link); 3654 } 3655 3656 /* 3657 * Follow the link to the input section. 3658 */ 3659 if ((isp = ifl->ifl_isdesc[link]) == NULL) 3660 return (0); 3661 if ((osp = isp->is_osdesc) == NULL) 3662 return (0); 3663 3664 /* LINTED */ 3665 return ((Word)elf_ndxscn(osp->os_scn)); 3666 } 3667 3668 typedef struct { 3669 avl_node_t aav_avl; 3670 Ass_desc *aav_ass; 3671 } Aav_node; 3672 3673 static int 3674 aav_compare(const void *first, const void *second) 3675 { 3676 Sym *fs = ((Aav_node *)first)->aav_ass->ass_sdp->sd_sym; 3677 Sym *ss = ((Aav_node *)second)->aav_ass->ass_sdp->sd_sym; 3678 3679 if (fs->st_value < ss->st_value) 3680 return (-1); 3681 if (fs->st_value > ss->st_value) 3682 return (1); 3683 3684 if (fs->st_size < ss->st_size) 3685 return (-1); 3686 if (fs->st_size > ss->st_size) 3687 return (1); 3688 3689 return (0); 3690 } 3691 3692 3693 /* 3694 * Check any assertions from mapfiles, provide guidance if there is global 3695 * data in a shared object that does not assert its size. 3696 */ 3697 static uintptr_t 3698 check_mapfile_assertions(Ofl_desc *ofl) 3699 { 3700 Ass_desc *ma; 3701 uintptr_t ret = 0; 3702 Aliste idx; 3703 avl_tree_t ass_avl; 3704 3705 avl_create(&ass_avl, &aav_compare, sizeof (Aav_node), 3706 SGSOFFSETOF(Aav_node, aav_avl)); 3707 3708 for (APLIST_TRAVERSE(ofl->ofl_symasserts, idx, ma)) { 3709 Sym_desc *sdp = ma->ass_sdp; 3710 Conv_inv_buf_t inv_buf, inv_buf2; 3711 3712 /* 3713 * Try to insert the assertion into the tree if it's not an 3714 * alias assertion. If it's already present, it means we have 3715 * two non-alias assertions and should complain 3716 */ 3717 if (!ass_enabled(ma, SYM_ASSERT_ALIAS)) { 3718 Aav_node *av = libld_calloc(1, sizeof (Aav_node)); 3719 Aav_node *dup; 3720 avl_index_t where; 3721 3722 if (av == NULL) 3723 return (S_ERROR); 3724 3725 av->aav_ass = ma; 3726 3727 if ((dup = avl_find(&ass_avl, av, &where)) != NULL) { 3728 ld_eprintf(ofl, ERR_FATAL, 3729 MSG_INTL(MSG_ALIAS_NOTALIAS), 3730 ma->ass_file, 3731 EC_LINENO(ma->ass_lineno), 3732 ma->ass_sdp->sd_name, 3733 dup->aav_ass->ass_sdp->sd_name, 3734 dup->aav_ass->ass_file, 3735 EC_LINENO(dup->aav_ass->ass_lineno)); 3736 ret = S_ERROR; 3737 } else { 3738 avl_insert(&ass_avl, av, where); 3739 } 3740 } 3741 3742 /* 3743 * All assertions can assert on binding. Other 3744 * assertion behaviour differs based on whether we're 3745 * asserting specifics, or asserting an ALIAS. In the 3746 * latter case, we just compare all the attributes 3747 * against another symbol. 3748 */ 3749 if (ass_enabled(ma, SYM_ASSERT_BIND) && 3750 (ma->ass_bind != ELF_ST_BIND(sdp->sd_sym->st_info))) { 3751 Sym *sym = sdp->sd_sym; 3752 3753 ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_ASSFAIL_SCOPE), 3754 ma->ass_file, EC_LINENO(ma->ass_lineno), 3755 demangle(sdp->sd_name), 3756 conv_sym_info_bind(ma->ass_bind, CONV_FMT_ALT_CFNP, 3757 &inv_buf), 3758 conv_sym_info_bind(ELF_ST_BIND(sym->st_info), 3759 CONV_FMT_ALT_CFNP, &inv_buf2)); 3760 ret = S_ERROR; 3761 } 3762 3763 if (ass_enabled(ma, SYM_ASSERT_ALIAS)) { 3764 Sym *rsym, *sym; 3765 Sym_desc *asdp; 3766 3767 if ((asdp = ld_sym_find(ma->ass_alias, SYM_NOHASH, 3768 NULL, ofl)) == NULL) { 3769 ld_eprintf(ofl, ERR_FATAL, 3770 MSG_INTL(MSG_ALIAS_BADSYM), 3771 ma->ass_file, EC_LINENO(ma->ass_lineno), 3772 ma->ass_alias); 3773 ret = S_ERROR; 3774 } else { 3775 /* 3776 * We forbid aliases of aliases, preferring 3777 * they all point to the concrete symbol. 3778 * This is unnecessary, but a strong 3779 * preference for maintainability. 3780 * 3781 * This does prevent circular references 3782 * however, and if this check is removed a 3783 * real check for such would need to be added. 3784 */ 3785 if (((asdp->sd_flags & FLG_SY_MAPASSRT) != 0) && 3786 ass_enabled(asdp->sd_ass, 3787 SYM_ASSERT_ALIAS)) { 3788 ld_eprintf(ofl, ERR_FATAL, 3789 MSG_INTL(MSG_ALIAS_TOALIAS), 3790 ma->ass_file, 3791 EC_LINENO(ma->ass_lineno), 3792 ma->ass_alias); 3793 ret = S_ERROR; 3794 } 3795 3796 rsym = asdp->sd_sym; 3797 sym = sdp->sd_sym; 3798 3799 if ((rsym->st_value != sym->st_value) || 3800 (rsym->st_size != sym->st_size) || 3801 (ELF_ST_TYPE(rsym->st_info) != 3802 ELF_ST_TYPE(sym->st_info))) { 3803 ld_eprintf(ofl, ERR_FATAL, 3804 MSG_INTL(MSG_ASSFAIL_ALIAS), 3805 ma->ass_file, 3806 EC_LINENO(ma->ass_lineno), 3807 demangle(sdp->sd_name), 3808 asdp->sd_name); 3809 ret = S_ERROR; 3810 } 3811 } 3812 3813 /* 3814 * If this is an alias, none of our other checks 3815 * matter. 3816 */ 3817 continue; 3818 } 3819 3820 /* 3821 * We only want to assert on the size of a _function_ if it's 3822 * explicitly sized, otherwise skip 3823 */ 3824 if (ass_enabled(ma, SYM_ASSERT_SIZE) && 3825 (ma->ass_size != sdp->sd_sym->st_size)) { 3826 ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_ASSFAIL_SIZE), 3827 ma->ass_file, EC_LINENO(ma->ass_lineno), 3828 demangle(sdp->sd_name), 3829 ma->ass_size, (Lword)sdp->sd_sym->st_size); 3830 ret = S_ERROR; 3831 } 3832 3833 if (ass_enabled(ma, SYM_ASSERT_BITS) && (sdp->sd_isc != NULL)) { 3834 if ((ma->ass_bits == TRUE) && 3835 (sdp->sd_isc->is_shdr->sh_type == SHT_NOBITS)) { 3836 ld_eprintf(ofl, ERR_FATAL, 3837 MSG_INTL(MSG_ASSFAIL_BITS), 3838 ma->ass_file, EC_LINENO(ma->ass_lineno), 3839 demangle(sdp->sd_name)); 3840 ret = S_ERROR; 3841 } 3842 if ((ma->ass_bits == FALSE) && 3843 (sdp->sd_isc->is_shdr->sh_type != SHT_NOBITS)) { 3844 ld_eprintf(ofl, ERR_FATAL, 3845 MSG_INTL(MSG_ASSFAIL_NOBITS), 3846 ma->ass_file, EC_LINENO(ma->ass_lineno), 3847 demangle(sdp->sd_name)); 3848 ret = S_ERROR; 3849 } 3850 } 3851 3852 if (ass_enabled(ma, SYM_ASSERT_TYPE) && 3853 (ma->ass_type != ELF_ST_TYPE(sdp->sd_sym->st_info))) { 3854 Ehdr *ehdr = sdp->sd_file->ifl_ehdr; 3855 3856 ld_eprintf(ofl, ERR_FATAL, 3857 MSG_INTL(MSG_ASSFAIL_TYPE), 3858 ma->ass_file, EC_LINENO(ma->ass_lineno), 3859 demangle(sdp->sd_name), 3860 conv_sym_info_type(ehdr->e_machine, 3861 ma->ass_type, CONV_FMT_ALT_CFNP, &inv_buf), 3862 conv_sym_info_type(ehdr->e_machine, 3863 ELF_ST_TYPE(sdp->sd_sym->st_info), 3864 CONV_FMT_ALT_CFNP, &inv_buf2)); 3865 ret = S_ERROR; 3866 } 3867 } 3868 3869 return (ret); 3870 } 3871 3872 /* 3873 * Use the values from shdr to initialize phdr. 3874 * Used for single-section segments to initialize their phdr. 3875 */ 3876 static void 3877 build_phdr_from_shdr(Phdr *phdr, Shdr *shdr, Word flags) 3878 { 3879 phdr->p_vaddr = shdr->sh_addr; 3880 phdr->p_offset = shdr->sh_offset; 3881 phdr->p_filesz = shdr->sh_size; 3882 phdr->p_memsz = shdr->sh_size; 3883 phdr->p_align = shdr->sh_addralign; 3884 phdr->p_flags = flags; 3885 } 3886 3887 3888 /* 3889 * Having created all of the necessary sections, segments, and associated 3890 * headers, fill in the program headers and update any other data in the 3891 * output image. Some general rules: 3892 * 3893 * - If an interpreter is required always generate a PT_PHDR entry as 3894 * well. It is this entry that triggers the kernel into passing the 3895 * interpreter an aux vector instead of just a file descriptor. 3896 * 3897 * - When generating an image that will be interpreted (ie. a dynamic 3898 * executable, a shared object, or a static executable that has been 3899 * provided with an interpreter - weird, but possible), make the initial 3900 * loadable segment include both the ehdr and phdr[]. Both of these 3901 * tables are used by the interpreter therefore it seems more intuitive 3902 * to explicitly defined them as part of the mapped image rather than 3903 * relying on page rounding by the interpreter to allow their access. 3904 * 3905 * - When generating a static image that does not require an interpreter 3906 * have the first loadable segment indicate the address of the first 3907 * .section as the start address (things like /kernel/unix and ufsboot 3908 * expect this behavior). 3909 */ 3910 uintptr_t 3911 ld_update_outfile(Ofl_desc *ofl) 3912 { 3913 Addr size, etext, vaddr; 3914 Sg_desc *sgp; 3915 Sg_desc *dtracesgp = NULL, *capsgp = NULL, *intpsgp = NULL; 3916 Os_desc *osp; 3917 int phdrndx = 0, segndx = -1, secndx, intppndx, intpsndx; 3918 int dtracepndx, dtracesndx, cappndx, capsndx; 3919 Ehdr *ehdr = ofl->ofl_nehdr; 3920 Shdr *hshdr; 3921 Phdr *_phdr = NULL; 3922 Word phdrsz = (ehdr->e_phnum * ehdr->e_phentsize), shscnndx; 3923 ofl_flag_t flags = ofl->ofl_flags; 3924 Word ehdrsz = ehdr->e_ehsize; 3925 Boolean nobits; 3926 Off offset; 3927 Aliste idx1; 3928 3929 /* 3930 * Initialize the starting address for the first segment. Executables 3931 * have different starting addresses depending upon the target ABI, 3932 * where as shared objects have a starting address of 0. If this is 3933 * a 64-bit executable that is being constructed to run in a restricted 3934 * address space, use an alternative origin that will provide more free 3935 * address space for the the eventual process. 3936 */ 3937 if (ofl->ofl_flags & FLG_OF_EXEC) { 3938 #if defined(_ELF64) 3939 if (ofl->ofl_ocapset.oc_sf_1.cm_val & SF1_SUNW_ADDR32) 3940 vaddr = ld_targ.t_m.m_segm_aorigin; 3941 else 3942 #endif 3943 vaddr = ld_targ.t_m.m_segm_origin; 3944 } else 3945 vaddr = 0; 3946 3947 /* 3948 * Loop through the segment descriptors and pick out what we need. 3949 */ 3950 DBG_CALL(Dbg_seg_title(ofl->ofl_lml)); 3951 for (APLIST_TRAVERSE(ofl->ofl_segs, idx1, sgp)) { 3952 Phdr *phdr = &(sgp->sg_phdr); 3953 Xword p_align; 3954 Aliste idx2; 3955 Sym_desc *sdp; 3956 3957 segndx++; 3958 3959 /* 3960 * If an interpreter is required generate a PT_INTERP and 3961 * PT_PHDR program header entry. The PT_PHDR entry describes 3962 * the program header table itself. This information will be 3963 * passed via the aux vector to the interpreter (ld.so.1). 3964 * The program header array is actually part of the first 3965 * loadable segment (and the PT_PHDR entry is the first entry), 3966 * therefore its virtual address isn't known until the first 3967 * loadable segment is processed. 3968 */ 3969 if (phdr->p_type == PT_PHDR) { 3970 if (ofl->ofl_osinterp) { 3971 phdr->p_offset = ehdr->e_phoff; 3972 phdr->p_filesz = phdr->p_memsz = phdrsz; 3973 3974 DBG_CALL(Dbg_seg_entry(ofl, segndx, sgp)); 3975 ofl->ofl_phdr[phdrndx++] = *phdr; 3976 } 3977 continue; 3978 } 3979 if (phdr->p_type == PT_INTERP) { 3980 if (ofl->ofl_osinterp) { 3981 intpsgp = sgp; 3982 intpsndx = segndx; 3983 intppndx = phdrndx++; 3984 } 3985 continue; 3986 } 3987 3988 /* 3989 * If we are creating a PT_SUNWDTRACE segment, remember where 3990 * the program header is. The header values are assigned after 3991 * update_osym() has completed and the symbol table addresses 3992 * have been updated. 3993 */ 3994 if (phdr->p_type == PT_SUNWDTRACE) { 3995 if (ofl->ofl_dtracesym && 3996 ((flags & FLG_OF_RELOBJ) == 0)) { 3997 dtracesgp = sgp; 3998 dtracesndx = segndx; 3999 dtracepndx = phdrndx++; 4000 } 4001 continue; 4002 } 4003 4004 /* 4005 * If a hardware/software capabilities section is required, 4006 * generate the PT_SUNWCAP header. Note, as this comes before 4007 * the first loadable segment, we don't yet know its real 4008 * virtual address. This is updated later. 4009 */ 4010 if (phdr->p_type == PT_SUNWCAP) { 4011 if (ofl->ofl_oscap && (ofl->ofl_flags & FLG_OF_PTCAP) && 4012 ((flags & FLG_OF_RELOBJ) == 0)) { 4013 capsgp = sgp; 4014 capsndx = segndx; 4015 cappndx = phdrndx++; 4016 } 4017 continue; 4018 } 4019 4020 /* 4021 * As the dynamic program header occurs after the loadable 4022 * headers in the segment descriptor table, all the address 4023 * information for the .dynamic output section will have been 4024 * figured out by now. 4025 */ 4026 if (phdr->p_type == PT_DYNAMIC) { 4027 if (OFL_ALLOW_DYNSYM(ofl)) { 4028 Shdr *shdr = ofl->ofl_osdynamic->os_shdr; 4029 4030 build_phdr_from_shdr(phdr, shdr, 4031 ld_targ.t_m.m_dataseg_perm); 4032 4033 DBG_CALL(Dbg_seg_entry(ofl, segndx, sgp)); 4034 ofl->ofl_phdr[phdrndx++] = *phdr; 4035 } 4036 continue; 4037 } 4038 4039 /* 4040 * As the unwind (.eh_frame_hdr) program header occurs after 4041 * the loadable headers in the segment descriptor table, all 4042 * the address information for the .eh_frame output section 4043 * will have been figured out by now. 4044 */ 4045 if (phdr->p_type == PT_SUNW_UNWIND) { 4046 Shdr *shdr; 4047 4048 if (ofl->ofl_unwindhdr == NULL) 4049 continue; 4050 4051 shdr = ofl->ofl_unwindhdr->os_shdr; 4052 4053 build_phdr_from_shdr(phdr, shdr, PF_R); 4054 phdr->p_paddr = 0; 4055 ofl->ofl_phdr[phdrndx++] = *phdr; 4056 continue; 4057 } 4058 4059 /* 4060 * The sunwstack program is used to convey non-default 4061 * flags for the process stack. Only emit it if it would 4062 * change the default. 4063 */ 4064 if (phdr->p_type == PT_SUNWSTACK) { 4065 if (((flags & FLG_OF_RELOBJ) == 0) && 4066 ((sgp->sg_flags & FLG_SG_DISABLED) == 0)) 4067 ofl->ofl_phdr[phdrndx++] = *phdr; 4068 continue; 4069 } 4070 4071 /* 4072 * As the TLS program header occurs after the loadable 4073 * headers in the segment descriptor table, all the address 4074 * information for the .tls output section will have been 4075 * figured out by now. 4076 */ 4077 if (phdr->p_type == PT_TLS) { 4078 Os_desc *tlsosp; 4079 Shdr *lastfileshdr = NULL; 4080 Shdr *firstshdr = NULL, *lastshdr; 4081 Aliste idx; 4082 4083 if (ofl->ofl_ostlsseg == NULL) 4084 continue; 4085 4086 /* 4087 * Scan the output sections that have contributed TLS. 4088 * Remember the first and last so as to determine the 4089 * TLS memory size requirement. Remember the last 4090 * progbits section to determine the TLS data 4091 * contribution, which determines the TLS program 4092 * header filesz. 4093 */ 4094 for (APLIST_TRAVERSE(ofl->ofl_ostlsseg, idx, tlsosp)) { 4095 Shdr *tlsshdr = tlsosp->os_shdr; 4096 4097 if (firstshdr == NULL) 4098 firstshdr = tlsshdr; 4099 if (tlsshdr->sh_type != SHT_NOBITS) 4100 lastfileshdr = tlsshdr; 4101 lastshdr = tlsshdr; 4102 } 4103 4104 build_phdr_from_shdr(phdr, firstshdr, PF_R | PF_W); 4105 4106 /* 4107 * Determine the initialized TLS data size. This 4108 * address range is from the start of the TLS segment 4109 * to the end of the last piece of initialized data. 4110 */ 4111 if (lastfileshdr) 4112 phdr->p_filesz = lastfileshdr->sh_offset + 4113 lastfileshdr->sh_size - phdr->p_offset; 4114 else 4115 phdr->p_filesz = 0; 4116 4117 /* 4118 * Determine the total TLS memory size. This includes 4119 * all TLS data and TLS uninitialized data. This 4120 * address range is from the start of the TLS segment 4121 * to the memory address of the last piece of 4122 * uninitialized data. 4123 */ 4124 phdr->p_memsz = lastshdr->sh_addr + 4125 lastshdr->sh_size - phdr->p_vaddr; 4126 4127 DBG_CALL(Dbg_seg_entry(ofl, segndx, sgp)); 4128 ofl->ofl_phdr[phdrndx] = *phdr; 4129 ofl->ofl_tlsphdr = &ofl->ofl_phdr[phdrndx++]; 4130 continue; 4131 } 4132 4133 /* 4134 * If this is an empty segment declaration, it will occur after 4135 * all other loadable segments. As empty segments can be 4136 * defined with fixed addresses, make sure that no loadable 4137 * segments overlap. This might occur as the object evolves 4138 * and the loadable segments grow, thus encroaching upon an 4139 * existing segment reservation. 4140 * 4141 * Segments are only created for dynamic objects, thus this 4142 * checking can be skipped when building a relocatable object. 4143 */ 4144 if (!(flags & FLG_OF_RELOBJ) && 4145 (sgp->sg_flags & FLG_SG_EMPTY)) { 4146 int i; 4147 Addr v_e; 4148 4149 vaddr = phdr->p_vaddr; 4150 phdr->p_memsz = sgp->sg_length; 4151 DBG_CALL(Dbg_seg_entry(ofl, segndx, sgp)); 4152 ofl->ofl_phdr[phdrndx++] = *phdr; 4153 4154 if (phdr->p_type != PT_LOAD) 4155 continue; 4156 4157 v_e = vaddr + phdr->p_memsz; 4158 4159 /* 4160 * Check overlaps 4161 */ 4162 for (i = 0; i < phdrndx - 1; i++) { 4163 Addr p_s = (ofl->ofl_phdr[i]).p_vaddr; 4164 Addr p_e; 4165 4166 if ((ofl->ofl_phdr[i]).p_type != PT_LOAD) 4167 continue; 4168 4169 p_e = p_s + (ofl->ofl_phdr[i]).p_memsz; 4170 if (((p_s <= vaddr) && (p_e > vaddr)) || 4171 ((vaddr <= p_s) && (v_e > p_s))) 4172 ld_eprintf(ofl, ERR_WARNING, 4173 MSG_INTL(MSG_UPD_SEGOVERLAP), 4174 ofl->ofl_name, EC_ADDR(p_e), 4175 sgp->sg_name, EC_ADDR(vaddr)); 4176 } 4177 continue; 4178 } 4179 4180 /* 4181 * Having processed any of the special program headers any 4182 * remaining headers will be built to express individual 4183 * segments. Segments are only built if they have output 4184 * section descriptors associated with them (ie. some form of 4185 * input section has been matched to this segment). 4186 */ 4187 if (aplist_nitems(sgp->sg_osdescs) == 0) 4188 continue; 4189 4190 /* 4191 * Determine the segments offset and size from the section 4192 * information provided from elf_update(). 4193 * Allow for multiple NOBITS sections. 4194 */ 4195 osp = sgp->sg_osdescs->apl_data[0]; 4196 hshdr = osp->os_shdr; 4197 4198 phdr->p_filesz = 0; 4199 phdr->p_memsz = 0; 4200 phdr->p_offset = offset = hshdr->sh_offset; 4201 4202 nobits = ((hshdr->sh_type == SHT_NOBITS) && 4203 ((sgp->sg_flags & FLG_SG_PHREQ) == 0)); 4204 4205 for (APLIST_TRAVERSE(sgp->sg_osdescs, idx2, osp)) { 4206 Shdr *shdr = osp->os_shdr; 4207 4208 p_align = 0; 4209 if (shdr->sh_addralign > p_align) 4210 p_align = shdr->sh_addralign; 4211 4212 offset = (Off)S_ROUND(offset, shdr->sh_addralign); 4213 offset += shdr->sh_size; 4214 4215 if (shdr->sh_type != SHT_NOBITS) { 4216 if (nobits) { 4217 ld_eprintf(ofl, ERR_FATAL, 4218 MSG_INTL(MSG_UPD_NOBITS)); 4219 return (S_ERROR); 4220 } 4221 phdr->p_filesz = offset - phdr->p_offset; 4222 } else if ((sgp->sg_flags & FLG_SG_PHREQ) == 0) 4223 nobits = TRUE; 4224 } 4225 phdr->p_memsz = offset - hshdr->sh_offset; 4226 4227 /* 4228 * If this is the first loadable segment of a dynamic object, 4229 * or an interpreter has been specified (a static object built 4230 * with an interpreter will still be given a PT_HDR entry), then 4231 * compensate for the elf header and program header array. Both 4232 * of these are actually part of the loadable segment as they 4233 * may be inspected by the interpreter. Adjust the segments 4234 * size and offset accordingly. 4235 */ 4236 if ((_phdr == NULL) && (phdr->p_type == PT_LOAD) && 4237 ((ofl->ofl_osinterp) || (flags & FLG_OF_DYNAMIC)) && 4238 (!(ofl->ofl_dtflags_1 & DF_1_NOHDR))) { 4239 size = (Addr)S_ROUND((phdrsz + ehdrsz), 4240 hshdr->sh_addralign); 4241 phdr->p_offset -= size; 4242 phdr->p_filesz += size; 4243 phdr->p_memsz += size; 4244 } 4245 4246 /* 4247 * If segment size symbols are required (specified via a 4248 * mapfile) update their value. 4249 */ 4250 for (APLIST_TRAVERSE(sgp->sg_sizesym, idx2, sdp)) 4251 sdp->sd_sym->st_value = phdr->p_memsz; 4252 4253 /* 4254 * If no file content has been assigned to this segment (it 4255 * only contains no-bits sections), then reset the offset for 4256 * consistency. 4257 */ 4258 if (phdr->p_filesz == 0) 4259 phdr->p_offset = 0; 4260 4261 /* 4262 * If a virtual address has been specified for this segment 4263 * from a mapfile use it and make sure the previous segment 4264 * does not run into this segment. 4265 */ 4266 if (phdr->p_type == PT_LOAD) { 4267 if ((sgp->sg_flags & FLG_SG_P_VADDR)) { 4268 if (_phdr && (vaddr > phdr->p_vaddr) && 4269 (phdr->p_type == PT_LOAD)) 4270 ld_eprintf(ofl, ERR_WARNING, 4271 MSG_INTL(MSG_UPD_SEGOVERLAP), 4272 ofl->ofl_name, EC_ADDR(vaddr), 4273 sgp->sg_name, 4274 EC_ADDR(phdr->p_vaddr)); 4275 vaddr = phdr->p_vaddr; 4276 phdr->p_align = 0; 4277 } else { 4278 vaddr = phdr->p_vaddr = 4279 (Addr)S_ROUND(vaddr, phdr->p_align); 4280 } 4281 } 4282 4283 /* 4284 * Adjust the address offset and p_align if needed. 4285 */ 4286 if (((sgp->sg_flags & FLG_SG_P_VADDR) == 0) && 4287 ((ofl->ofl_dtflags_1 & DF_1_NOHDR) == 0)) { 4288 if (phdr->p_align != 0) 4289 vaddr += phdr->p_offset % phdr->p_align; 4290 else 4291 vaddr += phdr->p_offset; 4292 phdr->p_vaddr = vaddr; 4293 } 4294 4295 /* 4296 * If an interpreter is required set the virtual address of the 4297 * PT_PHDR program header now that we know the virtual address 4298 * of the loadable segment that contains it. Update the 4299 * PT_SUNWCAP header similarly. 4300 */ 4301 if ((_phdr == NULL) && (phdr->p_type == PT_LOAD)) { 4302 _phdr = phdr; 4303 4304 if ((ofl->ofl_dtflags_1 & DF_1_NOHDR) == 0) { 4305 if (ofl->ofl_osinterp) 4306 ofl->ofl_phdr[0].p_vaddr = 4307 vaddr + ehdrsz; 4308 4309 /* 4310 * Finally, if we're creating a dynamic object 4311 * (or a static object in which an interpreter 4312 * is specified) update the vaddr to reflect 4313 * the address of the first section within this 4314 * segment. 4315 */ 4316 if ((ofl->ofl_osinterp) || 4317 (flags & FLG_OF_DYNAMIC)) 4318 vaddr += size; 4319 } else { 4320 /* 4321 * If the DF_1_NOHDR flag was set, and an 4322 * interpreter is being generated, the PT_PHDR 4323 * will not be part of any loadable segment. 4324 */ 4325 if (ofl->ofl_osinterp) { 4326 ofl->ofl_phdr[0].p_vaddr = 0; 4327 ofl->ofl_phdr[0].p_memsz = 0; 4328 ofl->ofl_phdr[0].p_flags = 0; 4329 } 4330 } 4331 } 4332 4333 /* 4334 * Ensure the ELF entry point defaults to zero. Typically, this 4335 * value is overridden in update_oehdr() to one of the standard 4336 * entry points. Historically, this default was set to the 4337 * address of first executable section, but this has since been 4338 * found to be more confusing than it is helpful. 4339 */ 4340 ehdr->e_entry = 0; 4341 4342 DBG_CALL(Dbg_seg_entry(ofl, segndx, sgp)); 4343 4344 /* 4345 * Traverse the output section descriptors for this segment so 4346 * that we can update the section headers addresses. We've 4347 * calculated the virtual address of the initial section within 4348 * this segment, so each successive section can be calculated 4349 * based on their offsets from each other. 4350 */ 4351 secndx = 0; 4352 hshdr = 0; 4353 for (APLIST_TRAVERSE(sgp->sg_osdescs, idx2, osp)) { 4354 Shdr *shdr = osp->os_shdr; 4355 4356 if (shdr->sh_link) 4357 shdr->sh_link = translate_link(ofl, osp, 4358 shdr->sh_link, MSG_INTL(MSG_FIL_INVSHLINK)); 4359 4360 if (shdr->sh_info && (shdr->sh_flags & SHF_INFO_LINK)) 4361 shdr->sh_info = translate_link(ofl, osp, 4362 shdr->sh_info, MSG_INTL(MSG_FIL_INVSHINFO)); 4363 4364 if (!(flags & FLG_OF_RELOBJ) && 4365 (phdr->p_type == PT_LOAD)) { 4366 if (hshdr) 4367 vaddr += (shdr->sh_offset - 4368 hshdr->sh_offset); 4369 4370 shdr->sh_addr = vaddr; 4371 hshdr = shdr; 4372 } 4373 4374 DBG_CALL(Dbg_seg_os(ofl, osp, secndx)); 4375 secndx++; 4376 } 4377 4378 /* 4379 * Establish the virtual address of the end of the last section 4380 * in this segment so that the next segments offset can be 4381 * calculated from this. 4382 */ 4383 if (hshdr) 4384 vaddr += hshdr->sh_size; 4385 4386 /* 4387 * Output sections for this segment complete. Adjust the 4388 * virtual offset for the last sections size, and make sure we 4389 * haven't exceeded any maximum segment length specification. 4390 */ 4391 if ((sgp->sg_length != 0) && (sgp->sg_length < phdr->p_memsz)) { 4392 ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_UPD_LARGSIZE), 4393 ofl->ofl_name, sgp->sg_name, 4394 EC_XWORD(phdr->p_memsz), EC_XWORD(sgp->sg_length)); 4395 return (S_ERROR); 4396 } 4397 4398 if (phdr->p_type == PT_NOTE) { 4399 phdr->p_vaddr = 0; 4400 phdr->p_paddr = 0; 4401 phdr->p_align = 0; 4402 phdr->p_memsz = 0; 4403 } 4404 4405 if ((phdr->p_type != PT_NULL) && !(flags & FLG_OF_RELOBJ)) 4406 ofl->ofl_phdr[phdrndx++] = *phdr; 4407 } 4408 4409 /* 4410 * Update any new output sections. When building the initial output 4411 * image, a number of sections were created but left uninitialized (eg. 4412 * .dynsym, .dynstr, .symtab, .symtab, etc.). Here we update these 4413 * sections with the appropriate data. Other sections may still be 4414 * modified via reloc_process(). 4415 * 4416 * Copy the interpreter name into the .interp section. 4417 */ 4418 if (ofl->ofl_interp) 4419 (void) strcpy((char *)ofl->ofl_osinterp->os_outdata->d_buf, 4420 ofl->ofl_interp); 4421 4422 /* 4423 * Update the .shstrtab, .strtab and .dynstr sections. 4424 */ 4425 update_ostrtab(ofl->ofl_osshstrtab, ofl->ofl_shdrsttab, 0); 4426 update_ostrtab(ofl->ofl_osstrtab, ofl->ofl_strtab, 0); 4427 update_ostrtab(ofl->ofl_osdynstr, ofl->ofl_dynstrtab, DYNSTR_EXTRA_PAD); 4428 4429 /* 4430 * Build any output symbol tables, the symbols information is copied 4431 * and updated into the new output image. 4432 */ 4433 if ((etext = update_osym(ofl)) == (Addr)S_ERROR) 4434 return (S_ERROR); 4435 4436 4437 /* 4438 * Now the symbol tables are complete, process any mapfile 4439 * assertions 4440 */ 4441 if (check_mapfile_assertions(ofl) == S_ERROR) 4442 return (S_ERROR); 4443 /* 4444 * If we have an PT_INTERP phdr, update it now from the associated 4445 * section information. 4446 */ 4447 if (intpsgp) { 4448 Phdr *phdr = &(intpsgp->sg_phdr); 4449 Shdr *shdr = ofl->ofl_osinterp->os_shdr; 4450 4451 build_phdr_from_shdr(phdr, shdr, PF_R); 4452 4453 DBG_CALL(Dbg_seg_entry(ofl, intpsndx, intpsgp)); 4454 ofl->ofl_phdr[intppndx] = *phdr; 4455 } 4456 4457 /* 4458 * If we have a PT_SUNWDTRACE phdr, update it now with the address of 4459 * the symbol. It's only now been updated via update_sym(). 4460 * 4461 * The program header is used to find this symbol for its private use 4462 * during process startup (see fasttrap.h), and it is not itself 4463 * loadable. Phdr fields not used by DTrace are left at 0. 4464 */ 4465 if (dtracesgp) { 4466 Phdr *aphdr, *phdr = &(dtracesgp->sg_phdr); 4467 Sym_desc *sdp = ofl->ofl_dtracesym; 4468 4469 phdr->p_vaddr = sdp->sd_sym->st_value; 4470 phdr->p_memsz = sdp->sd_sym->st_size; 4471 4472 /* 4473 * Take permissions from the segment that the symbol is 4474 * associated with. 4475 */ 4476 aphdr = &sdp->sd_isc->is_osdesc->os_sgdesc->sg_phdr; 4477 assert(aphdr); 4478 phdr->p_flags = aphdr->p_flags; 4479 4480 DBG_CALL(Dbg_seg_entry(ofl, dtracesndx, dtracesgp)); 4481 ofl->ofl_phdr[dtracepndx] = *phdr; 4482 } 4483 4484 /* 4485 * If we have a PT_SUNWCAP phdr, update it now from the associated 4486 * section information. 4487 */ 4488 if (capsgp) { 4489 Phdr *phdr = &(capsgp->sg_phdr); 4490 Shdr *shdr = ofl->ofl_oscap->os_shdr; 4491 4492 build_phdr_from_shdr(phdr, shdr, PF_R); 4493 4494 DBG_CALL(Dbg_seg_entry(ofl, capsndx, capsgp)); 4495 ofl->ofl_phdr[cappndx] = *phdr; 4496 } 4497 4498 /* 4499 * Update the GROUP sections. 4500 */ 4501 if (update_ogroup(ofl) == S_ERROR) 4502 return (S_ERROR); 4503 4504 /* 4505 * Update Move Table. 4506 */ 4507 if (ofl->ofl_osmove || ofl->ofl_isparexpn) 4508 update_move(ofl); 4509 4510 /* 4511 * Build any output headers, version information, dynamic structure and 4512 * syminfo structure. 4513 */ 4514 if (update_oehdr(ofl) == S_ERROR) 4515 return (S_ERROR); 4516 if (!(flags & FLG_OF_NOVERSEC)) { 4517 if ((flags & FLG_OF_VERDEF) && 4518 (update_overdef(ofl) == S_ERROR)) 4519 return (S_ERROR); 4520 if ((flags & FLG_OF_VERNEED) && 4521 (update_overneed(ofl) == S_ERROR)) 4522 return (S_ERROR); 4523 if (flags & (FLG_OF_VERNEED | FLG_OF_VERDEF)) 4524 update_oversym(ofl); 4525 } 4526 if (flags & FLG_OF_DYNAMIC) { 4527 if (update_odynamic(ofl) == S_ERROR) 4528 return (S_ERROR); 4529 } 4530 if (ofl->ofl_ossyminfo) { 4531 if (update_osyminfo(ofl) == S_ERROR) 4532 return (S_ERROR); 4533 } 4534 4535 /* 4536 * Update capabilities information if required. 4537 */ 4538 if (ofl->ofl_oscap) 4539 update_oscap(ofl); 4540 if (ofl->ofl_oscapinfo) 4541 update_oscapinfo(ofl); 4542 4543 /* 4544 * Sanity test: the first and last data byte of a string table 4545 * must be NULL. 4546 */ 4547 assert((ofl->ofl_osshstrtab == NULL) || 4548 (*((char *)ofl->ofl_osshstrtab->os_outdata->d_buf) == '\0')); 4549 assert((ofl->ofl_osshstrtab == NULL) || 4550 (*(((char *)ofl->ofl_osshstrtab->os_outdata->d_buf) + 4551 ofl->ofl_osshstrtab->os_outdata->d_size - 1) == '\0')); 4552 4553 assert((ofl->ofl_osstrtab == NULL) || 4554 (*((char *)ofl->ofl_osstrtab->os_outdata->d_buf) == '\0')); 4555 assert((ofl->ofl_osstrtab == NULL) || 4556 (*(((char *)ofl->ofl_osstrtab->os_outdata->d_buf) + 4557 ofl->ofl_osstrtab->os_outdata->d_size - 1) == '\0')); 4558 4559 assert((ofl->ofl_osdynstr == NULL) || 4560 (*((char *)ofl->ofl_osdynstr->os_outdata->d_buf) == '\0')); 4561 assert((ofl->ofl_osdynstr == NULL) || 4562 (*(((char *)ofl->ofl_osdynstr->os_outdata->d_buf) + 4563 ofl->ofl_osdynstr->os_outdata->d_size - DYNSTR_EXTRA_PAD - 1) == 4564 '\0')); 4565 4566 /* 4567 * Emit Strtab diagnostics. 4568 */ 4569 DBG_CALL(Dbg_sec_strtab(ofl->ofl_lml, ofl->ofl_osshstrtab, 4570 ofl->ofl_shdrsttab)); 4571 DBG_CALL(Dbg_sec_strtab(ofl->ofl_lml, ofl->ofl_osstrtab, 4572 ofl->ofl_strtab)); 4573 DBG_CALL(Dbg_sec_strtab(ofl->ofl_lml, ofl->ofl_osdynstr, 4574 ofl->ofl_dynstrtab)); 4575 4576 /* 4577 * Initialize the section headers string table index within the elf 4578 * header. 4579 */ 4580 /* LINTED */ 4581 if ((shscnndx = elf_ndxscn(ofl->ofl_osshstrtab->os_scn)) < 4582 SHN_LORESERVE) { 4583 ofl->ofl_nehdr->e_shstrndx = 4584 /* LINTED */ 4585 (Half)shscnndx; 4586 } else { 4587 /* 4588 * If the STRTAB section index doesn't fit into 4589 * e_shstrndx, then we store it in 'shdr[0].st_link'. 4590 */ 4591 Elf_Scn *scn; 4592 Shdr *shdr0; 4593 4594 if ((scn = elf_getscn(ofl->ofl_elf, 0)) == NULL) { 4595 ld_eprintf(ofl, ERR_ELF, MSG_INTL(MSG_ELF_GETSCN), 4596 ofl->ofl_name); 4597 return (S_ERROR); 4598 } 4599 if ((shdr0 = elf_getshdr(scn)) == NULL) { 4600 ld_eprintf(ofl, ERR_ELF, MSG_INTL(MSG_ELF_GETSHDR), 4601 ofl->ofl_name); 4602 return (S_ERROR); 4603 } 4604 ofl->ofl_nehdr->e_shstrndx = SHN_XINDEX; 4605 shdr0->sh_link = shscnndx; 4606 } 4607 4608 return ((uintptr_t)etext); 4609 } 4610