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