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 * set-up for relocations 31 */ 32 33 #define ELF_TARGET_AMD64 34 #define ELF_TARGET_SPARC 35 36 #include <string.h> 37 #include <stdio.h> 38 #include <alloca.h> 39 #include <debug.h> 40 #include "msg.h" 41 #include "_libld.h" 42 43 /* 44 * Set up the relocation table flag test macros so that they use the 45 * relocation table for the current target machine. 46 */ 47 #define IS_PLT(X) RELTAB_IS_PLT(X, ld_targ.t_mr.mr_reloc_table) 48 #define IS_GOT_RELATIVE(X) \ 49 RELTAB_IS_GOT_RELATIVE(X, ld_targ.t_mr.mr_reloc_table) 50 #define IS_GOT_PC(X) RELTAB_IS_GOT_PC(X, ld_targ.t_mr.mr_reloc_table) 51 #define IS_GOTPCREL(X) RELTAB_IS_GOTPCREL(X, ld_targ.t_mr.mr_reloc_table) 52 #define IS_GOT_BASED(X) RELTAB_IS_GOT_BASED(X, ld_targ.t_mr.mr_reloc_table) 53 #define IS_GOT_OPINS(X) RELTAB_IS_GOT_OPINS(X, ld_targ.t_mr.mr_reloc_table) 54 #define IS_GOT_REQUIRED(X) \ 55 RELTAB_IS_GOT_REQUIRED(X, ld_targ.t_mr.mr_reloc_table) 56 #define IS_PC_RELATIVE(X) RELTAB_IS_PC_RELATIVE(X, ld_targ.t_mr.mr_reloc_table) 57 #define IS_ADD_RELATIVE(X) \ 58 RELTAB_IS_ADD_RELATIVE(X, ld_targ.t_mr.mr_reloc_table) 59 #define IS_REGISTER(X) RELTAB_IS_REGISTER(X, ld_targ.t_mr.mr_reloc_table) 60 #define IS_NOTSUP(X) RELTAB_IS_NOTSUP(X, ld_targ.t_mr.mr_reloc_table) 61 #define IS_SEG_RELATIVE(X) \ 62 RELTAB_IS_SEG_RELATIVE(X, ld_targ.t_mr.mr_reloc_table) 63 #define IS_EXTOFFSET(X) RELTAB_IS_EXTOFFSET(X, ld_targ.t_mr.mr_reloc_table) 64 #define IS_SEC_RELATIVE(X) \ 65 RELTAB_IS_SEC_RELATIVE(X, ld_targ.t_mr.mr_reloc_table) 66 #define IS_TLS_INS(X) RELTAB_IS_TLS_INS(X, ld_targ.t_mr.mr_reloc_table) 67 #define IS_TLS_GD(X) RELTAB_IS_TLS_GD(X, ld_targ.t_mr.mr_reloc_table) 68 #define IS_TLS_LD(X) RELTAB_IS_TLS_LD(X, ld_targ.t_mr.mr_reloc_table) 69 #define IS_TLS_IE(X) RELTAB_IS_TLS_IE(X, ld_targ.t_mr.mr_reloc_table) 70 #define IS_TLS_LE(X) RELTAB_IS_TLS_LE(X, ld_targ.t_mr.mr_reloc_table) 71 #define IS_LOCALBND(X) RELTAB_IS_LOCALBND(X, ld_targ.t_mr.mr_reloc_table) 72 #define IS_SIZE(X) RELTAB_IS_SIZE(X, ld_targ.t_mr.mr_reloc_table) 73 74 /* 75 * Structure to hold copy relocation items. 76 */ 77 typedef struct copy_rel { 78 Sym_desc *c_sdp; /* symbol descriptor to be copied */ 79 Addr c_val; /* original symbol value */ 80 } Copy_rel; 81 82 /* 83 * For each copy relocation symbol, determine if the symbol is: 84 * 1) to be *disp* relocated at runtime 85 * 2) a reference symbol for *disp* relocation 86 * 3) possibly *disp* relocated at ld time. 87 * 88 * The first and the second are serious errors. 89 */ 90 static void 91 is_disp_copied(Ofl_desc *ofl, Copy_rel *crp) 92 { 93 Ifl_desc *ifl = crp->c_sdp->sd_file; 94 Sym_desc *sdp = crp->c_sdp; 95 Addr symaddr = crp->c_val; 96 Is_desc *irel; 97 Aliste idx; 98 Conv_inv_buf_t inv_buf; 99 100 /* 101 * This symbol may not be *disp* relocated at run time, but could 102 * already have been *disp* relocated when the shared object was 103 * created. Warn the user. 104 */ 105 if ((ifl->ifl_flags & FLG_IF_DISPDONE) && 106 (ofl->ofl_flags & FLG_OF_VERBOSE)) 107 eprintf(ofl->ofl_lml, ERR_WARNING, MSG_INTL(MSG_REL_DISPREL2), 108 conv_reloc_type(ifl->ifl_ehdr->e_machine, 109 ld_targ.t_m.m_r_copy, 0, &inv_buf), 110 ifl->ifl_name, demangle(sdp->sd_name)); 111 112 if ((ifl->ifl_flags & FLG_IF_DISPPEND) == 0) 113 return; 114 115 /* 116 * Traverse the input relocation sections. 117 */ 118 for (APLIST_TRAVERSE(ifl->ifl_relsect, idx, irel)) { 119 Sym_desc *rsdp; 120 Is_desc *trel; 121 Rel *rend, *reloc; 122 Xword rsize, entsize; 123 124 trel = ifl->ifl_isdesc[irel->is_shdr->sh_info]; 125 rsize = irel->is_shdr->sh_size; 126 entsize = irel->is_shdr->sh_entsize; 127 reloc = (Rel *)irel->is_indata->d_buf; 128 129 /* 130 * Decide entry size 131 */ 132 if ((entsize == 0) || (entsize > rsize)) { 133 if (irel->is_shdr->sh_type == SHT_RELA) 134 entsize = sizeof (Rela); 135 else 136 entsize = sizeof (Rel); 137 } 138 139 /* 140 * Traverse the relocation entries. 141 */ 142 for (rend = (Rel *)((uintptr_t)reloc + (uintptr_t)rsize); 143 reloc < rend; 144 reloc = (Rel *)((uintptr_t)reloc + (uintptr_t)entsize)) { 145 const char *str; 146 Word rstndx; 147 148 if (IS_PC_RELATIVE(ELF_R_TYPE(reloc->r_info, 149 ld_targ.t_m.m_mach)) == 0) 150 continue; 151 152 /* 153 * Determine if symbol is referenced from a relocation. 154 */ 155 rstndx = (Word) ELF_R_SYM(reloc->r_info); 156 rsdp = ifl->ifl_oldndx[rstndx]; 157 if (rsdp == sdp) { 158 if ((str = demangle(rsdp->sd_name)) != 159 rsdp->sd_name) { 160 char *_str = alloca(strlen(str) + 1); 161 (void) strcpy(_str, str); 162 str = (const char *)_str; 163 } 164 eprintf(ofl->ofl_lml, 165 ERR_WARNING, MSG_INTL(MSG_REL_DISPREL1), 166 conv_reloc_type(ifl->ifl_ehdr->e_machine, 167 (uint_t)ELF_R_TYPE(reloc->r_info, 168 ld_targ.t_m.m_mach), 169 0, &inv_buf), ifl->ifl_name, str, 170 MSG_INTL(MSG_STR_UNKNOWN), 171 EC_XWORD(reloc->r_offset), 172 demangle(sdp->sd_name)); 173 } 174 175 /* 176 * Determine whether the relocation entry is relocating 177 * this symbol. 178 */ 179 if ((sdp->sd_isc != trel) || 180 (reloc->r_offset < symaddr) || 181 (reloc->r_offset >= 182 (symaddr + sdp->sd_sym->st_size))) 183 continue; 184 185 /* 186 * This symbol is truely *disp* relocated, so should 187 * really be fixed by user. 188 */ 189 if ((str = demangle(sdp->sd_name)) != sdp->sd_name) { 190 char *_str = alloca(strlen(str) + 1); 191 (void) strcpy(_str, str); 192 str = (const char *)_str; 193 } 194 eprintf(ofl->ofl_lml, ERR_WARNING, 195 MSG_INTL(MSG_REL_DISPREL1), 196 conv_reloc_type(ifl->ifl_ehdr->e_machine, 197 (uint_t)ELF_R_TYPE(reloc->r_info, 198 ld_targ.t_m.m_mach), 0, &inv_buf), 199 ifl->ifl_name, demangle(rsdp->sd_name), str, 200 EC_XWORD(reloc->r_offset), str); 201 } 202 } 203 } 204 205 /* 206 * The number of symbols provided by some objects can be very large. Use a 207 * binary search to match the associated value to a symbol table entry. 208 */ 209 static int 210 disp_bsearch(const void *key, const void *array) 211 { 212 Addr kvalue, avalue; 213 Ssv_desc *ssvp = (Ssv_desc *)array; 214 215 kvalue = *((Addr *)key); 216 avalue = ssvp->ssv_value; 217 218 if (avalue > kvalue) 219 return (-1); 220 if ((avalue < kvalue) && 221 ((avalue + ssvp->ssv_sdp->sd_sym->st_size) <= kvalue)) 222 return (1); 223 return (0); 224 } 225 226 /* 227 * Given a sorted list of symbols, look for a symbol in which the relocation 228 * offset falls between the [sym.st_value - sym.st_value + sym.st_size]. Since 229 * the symbol list is maintained in sorted order, we can bail once the 230 * relocation offset becomes less than the symbol values. The symbol is 231 * returned for use in error diagnostics. 232 */ 233 static Sym_desc * 234 disp_scansyms(Ifl_desc * ifl, Rel_desc *rld, Boolean rlocal, int inspect, 235 Ofl_desc *ofl) 236 { 237 Sym_desc *tsdp, *rsdp; 238 Sym *rsym, *tsym; 239 Ssv_desc *ssvp; 240 uchar_t rtype, ttype; 241 Addr value; 242 243 /* 244 * Sorted symbol values have been uniquified by adding their associated 245 * section offset. Uniquify the relocation offset by adding its 246 * associated section offset, and search for the symbol. 247 */ 248 value = rld->rel_roffset; 249 if (rld->rel_isdesc->is_shdr) 250 value += rld->rel_isdesc->is_shdr->sh_offset; 251 252 if ((ssvp = bsearch((void *)&value, (void *)ifl->ifl_sortsyms, 253 ifl->ifl_sortcnt, sizeof (Ssv_desc), &disp_bsearch)) != 0) 254 tsdp = ssvp->ssv_sdp; 255 else 256 tsdp = 0; 257 258 if (inspect) 259 return (tsdp); 260 261 /* 262 * Determine the relocation reference symbol and its type. 263 */ 264 rsdp = rld->rel_sym; 265 rsym = rsdp->sd_sym; 266 rtype = ELF_ST_TYPE(rsym->st_info); 267 268 /* 269 * If there is no target symbol to match the relocation offset, then the 270 * offset is effectively local data. If the relocation symbol is global 271 * data we have a potential for this displacement relocation to be 272 * invalidated should the global symbol be copied. 273 */ 274 if (tsdp == 0) { 275 if ((rlocal == TRUE) || 276 ((rtype != STT_OBJECT) && (rtype != STT_SECTION))) 277 return (tsdp); 278 } else { 279 /* 280 * If both symbols are local, no copy relocations can occur to 281 * either symbol. Note, this test is very similar to the test 282 * used in ld_sym_adjust_vis(). 283 */ 284 if ((rlocal == TRUE) && (SYM_IS_HIDDEN(tsdp) || 285 (ELF_ST_BIND(tsdp->sd_sym->st_info) != STB_GLOBAL) || 286 ((ofl->ofl_flags & (FLG_OF_AUTOLCL | FLG_OF_AUTOELM)) && 287 ((tsdp->sd_flags & MSK_SY_NOAUTO) == 0)))) 288 return (tsdp); 289 290 /* 291 * Determine the relocation target symbols type. 292 */ 293 tsym = tsdp->sd_sym; 294 ttype = ELF_ST_TYPE(tsym->st_info); 295 296 /* 297 * If the reference symbol is local, and the target isn't a 298 * data element, then no copy relocations can occur to either 299 * symbol. Note, this catches pc-relative relocations against 300 * the _GLOBAL_OFFSET_TABLE_, which is effectively treated as 301 * a local symbol. 302 */ 303 if ((rlocal == TRUE) && (ttype != STT_OBJECT) && 304 (ttype != STT_SECTION)) 305 return (tsdp); 306 307 /* 308 * Finally, one of the symbols must reference a data element. 309 */ 310 if ((rtype != STT_OBJECT) && (rtype != STT_SECTION) && 311 (ttype != STT_OBJECT) && (ttype != STT_SECTION)) 312 return (tsdp); 313 } 314 315 /* 316 * We have two global symbols, at least one of which is a data item. 317 * The last case where a displacement relocation can be ignored, is 318 * if the reference symbol is included in the target symbol. 319 */ 320 value = rsym->st_value; 321 if ((rld->rel_flags & FLG_REL_RELA) == FLG_REL_RELA) 322 value += rld->rel_raddend; 323 324 if ((rld->rel_roffset >= value) && 325 (rld->rel_roffset < (value + rsym->st_size))) 326 return (tsdp); 327 328 /* 329 * We have a displacement relocation that could be compromised by a 330 * copy relocation of one of the associated data items. 331 */ 332 rld->rel_flags |= FLG_REL_DISP; 333 return (tsdp); 334 } 335 336 void 337 ld_disp_errmsg(const char *msg, Rel_desc *rsp, Ofl_desc *ofl) 338 { 339 Sym_desc *sdp; 340 const char *str; 341 Ifl_desc *ifl = rsp->rel_isdesc->is_file; 342 Conv_inv_buf_t inv_buf; 343 344 if ((sdp = disp_scansyms(ifl, rsp, 0, 1, ofl)) != 0) 345 str = demangle(sdp->sd_name); 346 else 347 str = MSG_INTL(MSG_STR_UNKNOWN); 348 349 eprintf(ofl->ofl_lml, ERR_WARNING, msg, 350 conv_reloc_type(ifl->ifl_ehdr->e_machine, rsp->rel_rtype, 351 0, &inv_buf), ifl->ifl_name, ld_reloc_sym_name(rsp), str, 352 EC_OFF(rsp->rel_roffset)); 353 } 354 355 /* 356 * qsort(3C) comparison routine used for the disp_sortsyms(). 357 */ 358 static int 359 disp_qsort(const void * s1, const void * s2) 360 { 361 Ssv_desc *ssvp1 = ((Ssv_desc *)s1); 362 Ssv_desc *ssvp2 = ((Ssv_desc *)s2); 363 Addr val1 = ssvp1->ssv_value; 364 Addr val2 = ssvp2->ssv_value; 365 366 if (val1 > val2) 367 return (1); 368 if (val1 < val2) 369 return (-1); 370 return (0); 371 } 372 373 /* 374 * Determine whether a displacement relocation is between a local and global 375 * symbol pair. One symbol is used to perform the relocation, and the other 376 * is the destination offset of the relocation. 377 */ 378 static uintptr_t 379 disp_inspect(Ofl_desc *ofl, Rel_desc *rld, Boolean rlocal) 380 { 381 Is_desc *isp = rld->rel_isdesc; 382 Ifl_desc *ifl = rld->rel_isdesc->is_file; 383 384 /* 385 * If the input files symbols haven't been sorted yet, do so. 386 */ 387 if (ifl->ifl_sortsyms == 0) { 388 Word ondx, nndx; 389 390 if ((ifl->ifl_sortsyms = libld_malloc((ifl->ifl_symscnt + 1) * 391 sizeof (Ssv_desc))) == 0) 392 return (S_ERROR); 393 394 for (ondx = 0, nndx = 0; ondx < ifl->ifl_symscnt; ondx++) { 395 Sym_desc *sdp; 396 Addr value; 397 398 /* 399 * As symbol resolution has already occurred, various 400 * symbols from this object may have been satisfied 401 * from other objects. Only select symbols from this 402 * object. For the displacement test, we only really 403 * need to observe data definitions, however, later as 404 * part of providing warning disgnostics, relating the 405 * relocation offset to a symbol is desirable. Thus, 406 * collect all symbols that define a memory area. 407 */ 408 if (((sdp = ifl->ifl_oldndx[ondx]) == 0) || 409 (sdp->sd_sym->st_shndx == SHN_UNDEF) || 410 (sdp->sd_sym->st_shndx >= SHN_LORESERVE) || 411 (sdp->sd_ref != REF_REL_NEED) || 412 (sdp->sd_file != ifl) || 413 (sdp->sd_sym->st_size == 0)) 414 continue; 415 416 /* 417 * As a further optimization for later checking, mark 418 * this section if this a global data definition. 419 */ 420 if (sdp->sd_isc && (ondx >= ifl->ifl_locscnt)) 421 sdp->sd_isc->is_flags |= FLG_IS_GDATADEF; 422 423 /* 424 * Capture the symbol. Within relocatable objects, a 425 * symbols value is its offset within its associated 426 * section. Add the section offset to this value to 427 * uniquify the symbol. 428 */ 429 value = sdp->sd_sym->st_value; 430 if (sdp->sd_isc && sdp->sd_isc->is_shdr) 431 value += sdp->sd_isc->is_shdr->sh_offset; 432 433 ifl->ifl_sortsyms[nndx].ssv_value = value; 434 ifl->ifl_sortsyms[nndx].ssv_sdp = sdp; 435 nndx++; 436 } 437 438 /* 439 * Sort the list based on the symbols value (address). 440 */ 441 if ((ifl->ifl_sortcnt = nndx) != 0) 442 qsort(ifl->ifl_sortsyms, nndx, sizeof (Ssv_desc), 443 &disp_qsort); 444 } 445 446 /* 447 * If the reference symbol is local, and the section being relocated 448 * contains no global definitions, neither can be the target of a copy 449 * relocation. 450 */ 451 if ((rlocal == FALSE) && ((isp->is_flags & FLG_IS_GDATADEF) == 0)) 452 return (1); 453 454 /* 455 * Otherwise determine whether this relocation symbol and its offset 456 * could be candidates for a copy relocation. 457 */ 458 if (ifl->ifl_sortcnt) 459 (void) disp_scansyms(ifl, rld, rlocal, 0, ofl); 460 return (1); 461 } 462 463 /* 464 * Return a Rel_cachebuf with an available Rel_desc entry from the 465 * specified cache, allocating a cache buffer if necessary. 466 * 467 * entry: 468 * ofl - Output file descriptor 469 * rcp - Relocation cache to allocate the descriptor from. 470 * One of &ofl->ofl_actrels or &ofl->ofl_outrels. 471 * 472 * exit: 473 * Returns the allocated descriptor, or NULL if the allocation fails. 474 */ 475 static Rel_cachebuf * 476 ld_add_rel_cache(Ofl_desc *ofl, Rel_cache *rcp) 477 { 478 Rel_cachebuf *rcbp; 479 size_t nelts, size, alloc_cnt; 480 481 /* 482 * If there is space available in the present cache bucket, return the 483 * next free entry. 484 */ 485 alloc_cnt = aplist_nitems(rcp->rc_list); 486 if (rcp->rc_list && 487 ((rcbp = rcp->rc_list->apl_data[alloc_cnt - 1]) != NULL) && 488 (rcbp->rc_free < rcbp->rc_end)) 489 return (rcbp); 490 491 /* 492 * Allocate a new bucket. As we cannot know the number of relocations 493 * we'll have in the active and output cache until after the link is 494 * complete, the size of the bucket is a heuristic. 495 * 496 * In general, if the output object is an executable, or a sharable 497 * object, then the size of the active relocation list will be nearly 498 * the same as the number of input relocations, and the output 499 * relocation list will be very short. If the output object is a 500 * relocatable object, then the reverse is true. Therefore, the initial 501 * allocation for the appropriate list is sized to fit all the input 502 * allocations in a single shot. 503 * 504 * All other allocations are done in units of REL_CACHEBUF_ALLOC, 505 * which is chosen to be large enough to cover most common cases, 506 * but small enough that not using it fully is inconsequential. 507 * 508 * In an ideal scenario, this results in one allocation on each list. 509 */ 510 nelts = REL_CACHEBUF_ALLOC; 511 if ((alloc_cnt == 0) && (ofl->ofl_relocincnt > REL_CACHEBUF_ALLOC)) { 512 Boolean is_rel = (ofl->ofl_flags & FLG_OF_RELOBJ) != 0; 513 514 if (((rcp == &ofl->ofl_actrels) && !is_rel) || 515 ((rcp == &ofl->ofl_outrels) && is_rel)) 516 nelts = ofl->ofl_relocincnt; 517 } 518 519 /* 520 * Compute the total number of bytes to allocate. The first element 521 * of the array is built into the Rel_cachebuf header, so we subtract 522 * one from nelts. 523 */ 524 size = sizeof (Rel_cachebuf) + ((nelts - 1) * sizeof (Rel_desc)); 525 526 if (((rcbp = libld_malloc(size)) == NULL) || 527 (aplist_append(&rcp->rc_list, rcbp, AL_CNT_OFL_RELS) == NULL)) 528 return (NULL); 529 530 rcbp->rc_free = rcbp->rc_arr; 531 rcbp->rc_end = rcbp->rc_arr + nelts; 532 533 return (rcbp); 534 } 535 536 /* 537 * Allocate a Rel_aux descriptor and attach it to the given Rel_desc, 538 * allocating an auxiliary cache buffer if necessary. 539 * 540 * entry: 541 * ofl - Output file descriptor 542 * rdp - Rel_desc descriptor that requires an auxiliary block 543 * 544 * exit: 545 * Returns TRUE on success, and FALSE if the allocation fails. 546 * On success, the caller is responsible for initializing the 547 * auxiliary block properly. 548 */ 549 static Boolean 550 ld_add_rel_aux(Ofl_desc *ofl, Rel_desc *rdesc) 551 { 552 Rel_aux_cachebuf *racp = NULL; 553 size_t size; 554 555 /* 556 * If there is space available in the present cache bucket, use it. 557 * Otherwise, allocate a new bucket. 558 */ 559 if (ofl->ofl_relaux) { 560 racp = ofl->ofl_relaux->apl_data[ 561 ofl->ofl_relaux->apl_nitems - 1]; 562 563 if (racp && (racp->rac_free >= racp->rac_end)) 564 racp = NULL; 565 } 566 if (racp == NULL) { 567 /* 568 * Compute the total number of bytes to allocate. The first 569 * element of the array is built into the Rel_aux_cachebuf 570 * header, so we subtract one from the number of elements. 571 */ 572 size = sizeof (Rel_aux_cachebuf) + 573 ((RELAUX_CACHEBUF_ALLOC - 1) * sizeof (Rel_aux)); 574 if (((racp = libld_malloc(size)) == NULL) || 575 (aplist_append(&ofl->ofl_relaux, racp, AL_CNT_OFL_RELS) == 576 NULL)) 577 return (FALSE); 578 579 racp->rac_free = racp->rac_arr; 580 racp->rac_end = racp->rac_arr + RELAUX_CACHEBUF_ALLOC; 581 } 582 583 /* Take an auxiliary descriptor from the cache and add it to rdesc */ 584 rdesc->rel_aux = racp->rac_free++; 585 586 return (TRUE); 587 } 588 589 /* 590 * Enter a copy of the given Rel_desc relocation descriptor, and 591 * any associated auxiliary Rel_aux it may reference, into the 592 * specified relocation cache. 593 * 594 * entry: 595 * ofl - Output file descriptor 596 * rcp - Relocation descriptor cache to recieve relocation 597 * rdesc - Rel_desc image to be inserted 598 * flags - Flags to add to rdest->rel_flags in the inserted descriptor 599 * 600 * exit: 601 * Returns the pointer to the inserted descriptor on success. 602 * Returns NULL if an allocation error occurs. 603 */ 604 Rel_desc * 605 ld_reloc_enter(Ofl_desc *ofl, Rel_cache *rcp, Rel_desc *rdesc, Word flags) 606 { 607 Rel_desc *arsp; 608 Rel_aux *auxp; 609 Rel_cachebuf *rcbp; 610 611 612 /* 613 * If no relocation cache structures are available, allocate a new 614 * one and link it to the buffer list. 615 */ 616 rcbp = ld_add_rel_cache(ofl, rcp); 617 if (rcbp == NULL) 618 return (NULL); 619 arsp = rcbp->rc_free; 620 621 /* 622 * If there is an auxiliary block on the original, allocate 623 * one for the clone. Save the pointer, because the struct copy 624 * below will crush it. 625 */ 626 if (rdesc->rel_aux != NULL) { 627 if (!ld_add_rel_aux(ofl, arsp)) 628 return (NULL); 629 auxp = arsp->rel_aux; 630 } 631 632 /* Copy contents of the original into the clone */ 633 *arsp = *rdesc; 634 635 /* 636 * If there is an auxiliary block, restore the clone's pointer to 637 * it, and copy the auxiliary contents. 638 */ 639 if (rdesc->rel_aux != NULL) { 640 arsp->rel_aux = auxp; 641 *auxp = *rdesc->rel_aux; 642 } 643 arsp->rel_flags |= flags; 644 645 rcbp->rc_free++; 646 rcp->rc_cnt++; 647 648 return (arsp); 649 } 650 651 /* 652 * Initialize a relocation descriptor auxiliary block to default 653 * values. 654 * 655 * entry: 656 * rdesc - Relocation descriptor, with a non-NULL rel_aux field 657 * pointing at the auxiliary block to be initialized. 658 * 659 * exit: 660 * Each field in rdesc->rel_aux has been set to its default value 661 */ 662 static void 663 ld_init_rel_aux(Rel_desc *rdesc) 664 { 665 Rel_aux *rap = rdesc->rel_aux; 666 667 /* 668 * The default output section is the one the input section 669 * is assigned to, assuming that there is an input section. 670 * Failing that, NULL is the only possibility, and we expect 671 * that the caller will assign an explicit value. 672 */ 673 rap->ra_osdesc = (rdesc->rel_isdesc == NULL) ? NULL : 674 rdesc->rel_isdesc->is_osdesc; 675 676 /* The ra_usym defaults to the value in rel_sym */ 677 rap->ra_usym = rdesc->rel_sym; 678 679 /* Remaining fields are zeroed */ 680 rap->ra_move = NULL; 681 rap->ra_typedata = 0; 682 } 683 684 /* 685 * The ld_reloc_set_aux_XXX() functions are used to set the value of an 686 * auxiliary relocation item on a relocation descriptor that exists in 687 * the active or output relocation cache. These descriptors are created 688 * via a call to ld_reloc_enter(). 689 * 690 * These functions preserve the illusion that every relocation descriptor 691 * has a non-NULL auxiliary block into which values can be set, while 692 * only creating an auxiliary block if one is actually necessary, preventing 693 * the large memory allocations that would otherwise occur. They operate 694 * as follows: 695 * 696 * - If an auxiliary block already exists, set the desired value and 697 * and return TRUE. 698 * 699 * - If no auxiliary block exists, but the desired value is the default 700 * value for the specified item, then no auxiliary block is needed, 701 * and TRUE is returned. 702 * 703 * - If no auxiliary block exists, and the desired value is not the 704 * default for the specified item, allocate an auxiliary block for 705 * the descriptor, initialize its contents to default values for all 706 * items, set the specified value, and return TRUE. 707 * 708 * - If an auxiliary block needs to be added, but the allocation fails, 709 * an error is issued, and FALSE is returned. 710 * 711 * Note that we only provide an ld_reloc_set_aux_XXX() function for those 712 * auxiliary items that libld actually modifies in Rel_desc descriptors 713 * in the active or output caches. If another one is needed, add it here. 714 * 715 * The PROCESS_NULL_REL_AUX macro is used to provide a single implementation 716 * for the logic that determines if an auxiliary block is needed or not, 717 * and handles the details of allocating and initializing it. It accepts 718 * one argument, _isdefault_predicate, which should be a call to the 719 * RELAUX_ISDEFAULT_xxx() macro appropriate for the auxiliary item 720 */ 721 722 #define PROCESS_NULL_REL_AUX(_isdefault_predicate) \ 723 if (rdesc->rel_aux == NULL) { \ 724 /* If requested value is the default, no need for aux block */ \ 725 if (_isdefault_predicate) \ 726 return (TRUE); \ 727 /* Allocate and attach an auxiliary block */ \ 728 if (!ld_add_rel_aux(ofl, rdesc)) \ 729 return (FALSE); \ 730 /* Initialize the auxiliary block with default values */ \ 731 ld_init_rel_aux(rdesc); \ 732 } 733 734 Boolean 735 ld_reloc_set_aux_osdesc(Ofl_desc *ofl, Rel_desc *rdesc, Os_desc *osp) 736 { 737 PROCESS_NULL_REL_AUX(RELAUX_ISDEFAULT_OSDESC(rdesc, osp)) 738 rdesc->rel_aux->ra_osdesc = osp; 739 return (TRUE); 740 } 741 742 Boolean 743 ld_reloc_set_aux_usym(Ofl_desc *ofl, Rel_desc *rdesc, Sym_desc *sdp) 744 { 745 PROCESS_NULL_REL_AUX(RELAUX_ISDEFAULT_USYM(rdesc, sdp)) 746 rdesc->rel_aux->ra_usym = sdp; 747 return (TRUE); 748 } 749 750 #undef PROCESS_NULL_REL_AUX 751 752 /* 753 * Return a descriptive name for the symbol associated with the 754 * given relocation descriptor. This will be the actual symbol 755 * name if one exists, or a suitable alternative otherwise. 756 * 757 * entry: 758 * rsp - Relocation descriptor 759 */ 760 const char * 761 ld_reloc_sym_name(Rel_desc *rsp) 762 { 763 Sym_desc *sdp = rsp->rel_sym; 764 765 if (sdp != NULL) { 766 /* If the symbol has a valid name use it */ 767 if (sdp->sd_name && *sdp->sd_name) 768 return (demangle(sdp->sd_name)); 769 770 /* 771 * If the symbol is STT_SECTION, and the corresponding 772 * section symbol has the specially prepared string intended 773 * for this use, use that string. The string is of the form 774 * secname (section) 775 */ 776 if ((ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION) && 777 (sdp->sd_isc != NULL) && (sdp->sd_isc->is_sym_name != NULL)) 778 return (demangle(sdp->sd_isc->is_sym_name)); 779 } else { 780 /* 781 * Use an empty name for a register relocation with 782 * no symbol. 783 */ 784 if (IS_REGISTER(rsp->rel_rtype)) 785 return (MSG_ORIG(MSG_STR_EMPTY)); 786 } 787 788 /* If all else fails, report it as <unknown> */ 789 return (MSG_INTL(MSG_STR_UNKNOWN)); 790 } 791 792 /* 793 * Add an active relocation record. 794 */ 795 uintptr_t 796 ld_add_actrel(Word flags, Rel_desc *rsp, Ofl_desc *ofl) 797 { 798 Rel_desc *arsp; 799 800 if ((arsp = ld_reloc_enter(ofl, &ofl->ofl_actrels, rsp, flags)) == NULL) 801 return (S_ERROR); 802 803 /* 804 * Any GOT relocation reference requires the creation of a .got table. 805 * Most references to a .got require a .got entry, which is accounted 806 * for with the ofl_gotcnt counter. However, some references are 807 * relative to the .got table, but require no .got entry. This test 808 * insures a .got is created regardless of the type of reference. 809 */ 810 if (IS_GOT_REQUIRED(arsp->rel_rtype)) 811 ofl->ofl_flags |= FLG_OF_BLDGOT; 812 813 /* 814 * If this is a displacement relocation generate a warning. 815 */ 816 if (arsp->rel_flags & FLG_REL_DISP) { 817 ofl->ofl_dtflags_1 |= DF_1_DISPRELDNE; 818 819 if (ofl->ofl_flags & FLG_OF_VERBOSE) 820 ld_disp_errmsg(MSG_INTL(MSG_REL_DISPREL3), arsp, ofl); 821 } 822 823 DBG_CALL(Dbg_reloc_ars_entry(ofl->ofl_lml, ELF_DBG_LD, 824 arsp->rel_isdesc->is_shdr->sh_type, ld_targ.t_m.m_mach, arsp)); 825 return (1); 826 } 827 828 /* 829 * In the platform specific machrel.XXX.c files, we sometimes write 830 * a value directly into the got/plt. These function can be used when 831 * the running linker has the opposite byte order of the object being 832 * produced. 833 */ 834 Word 835 ld_bswap_Word(Word v) 836 { 837 return (BSWAP_WORD(v)); 838 } 839 840 841 Xword 842 ld_bswap_Xword(Xword v) 843 { 844 return (BSWAP_XWORD(v)); 845 } 846 847 848 uintptr_t 849 ld_reloc_GOT_relative(Boolean local, Rel_desc *rsp, Ofl_desc *ofl) 850 { 851 Sym_desc *sdp = rsp->rel_sym; 852 ofl_flag_t flags = ofl->ofl_flags; 853 Gotndx *gnp; 854 855 /* 856 * If this is the first time we've seen this symbol in a GOT 857 * relocation we need to assign it a GOT token. Once we've got 858 * all of the GOT's assigned we can assign the actual indexes. 859 */ 860 if ((gnp = (*ld_targ.t_mr.mr_find_got_ndx)(sdp->sd_GOTndxs, 861 GOT_REF_GENERIC, ofl, rsp)) == 0) { 862 Word rtype = rsp->rel_rtype; 863 864 if ((*ld_targ.t_mr.mr_assign_got_ndx)(&(sdp->sd_GOTndxs), NULL, 865 GOT_REF_GENERIC, ofl, rsp, sdp) == S_ERROR) 866 return (S_ERROR); 867 868 /* 869 * Now we initialize the GOT table entry. 870 * 871 * Pseudo code to describe the the decisions below: 872 * 873 * If (local) 874 * then 875 * enter symbol value in GOT table entry 876 * if (Shared Object) 877 * then 878 * create Relative relocation against symbol 879 * fi 880 * else 881 * clear GOT table entry 882 * create a GLOB_DAT relocation against symbol 883 * fi 884 */ 885 if (local == TRUE) { 886 if (flags & FLG_OF_SHAROBJ) { 887 if (ld_add_actrel((FLG_REL_GOT | FLG_REL_GOTCL), 888 rsp, ofl) == S_ERROR) 889 return (S_ERROR); 890 891 /* 892 * Add a RELATIVE relocation if this is 893 * anything but a ABS symbol. 894 */ 895 if ((((sdp->sd_flags & FLG_SY_SPECSEC) == 0) || 896 (sdp->sd_sym->st_shndx != SHN_ABS)) || 897 (sdp->sd_aux && sdp->sd_aux->sa_symspec)) { 898 rsp->rel_rtype = 899 ld_targ.t_m.m_r_relative; 900 if ((*ld_targ.t_mr.mr_add_outrel) 901 ((FLG_REL_GOT | FLG_REL_ADVAL), rsp, 902 ofl) == S_ERROR) 903 return (S_ERROR); 904 rsp->rel_rtype = rtype; 905 } 906 } else { 907 if (ld_add_actrel(FLG_REL_GOT, rsp, 908 ofl) == S_ERROR) 909 return (S_ERROR); 910 } 911 } else { 912 rsp->rel_rtype = ld_targ.t_m.m_r_glob_dat; 913 if ((*ld_targ.t_mr.mr_add_outrel)(FLG_REL_GOT, 914 rsp, ofl) == S_ERROR) 915 return (S_ERROR); 916 rsp->rel_rtype = rtype; 917 } 918 } else { 919 if ((*ld_targ.t_mr.mr_assign_got_ndx)(&(sdp->sd_GOTndxs), gnp, 920 GOT_REF_GENERIC, ofl, rsp, sdp) == S_ERROR) 921 return (S_ERROR); 922 } 923 924 /* 925 * Perform relocation to GOT table entry. 926 */ 927 return (ld_add_actrel(NULL, rsp, ofl)); 928 } 929 930 /* 931 * Perform relocations for PLT's 932 */ 933 uintptr_t 934 ld_reloc_plt(Rel_desc *rsp, Ofl_desc *ofl) 935 { 936 Sym_desc *sdp = rsp->rel_sym; 937 938 switch (ld_targ.t_m.m_mach) { 939 case EM_AMD64: 940 /* 941 * AMD64 TLS code sequences do not use a unique TLS 942 * relocation to reference the __tls_get_addr() function call. 943 */ 944 if ((ofl->ofl_flags & FLG_OF_EXEC) && 945 (strcmp(sdp->sd_name, MSG_ORIG(MSG_SYM_TLSGETADDR_U)) == 946 0)) 947 return (ld_add_actrel(FLG_REL_TLSFIX, rsp, ofl)); 948 break; 949 950 case EM_386: 951 /* 952 * GNUC IA32 TLS code sequences do not use a unique TLS 953 * relocation to reference the ___tls_get_addr() function call. 954 */ 955 if ((ofl->ofl_flags & FLG_OF_EXEC) && 956 (strcmp(sdp->sd_name, MSG_ORIG(MSG_SYM_TLSGETADDR_UU)) == 957 0)) 958 return (ld_add_actrel(FLG_REL_TLSFIX, rsp, ofl)); 959 break; 960 } 961 962 /* 963 * if (not PLT yet assigned) 964 * then 965 * assign PLT index to symbol 966 * build output JMP_SLOT relocation 967 * fi 968 */ 969 if (sdp->sd_aux->sa_PLTndx == 0) { 970 Word ortype = rsp->rel_rtype; 971 972 (*ld_targ.t_mr.mr_assign_plt_ndx)(sdp, ofl); 973 974 /* 975 * If this symbol is binding to a LAZYLOADED object then 976 * set the LAZYLD symbol flag. 977 */ 978 if (sdp->sd_file && 979 (sdp->sd_file->ifl_flags & FLG_IF_LAZYLD)) 980 sdp->sd_flags |= FLG_SY_LAZYLD; 981 982 rsp->rel_rtype = ld_targ.t_m.m_r_jmp_slot; 983 if ((*ld_targ.t_mr.mr_add_outrel)(FLG_REL_PLT, rsp, ofl) == 984 S_ERROR) 985 return (S_ERROR); 986 rsp->rel_rtype = ortype; 987 } 988 989 /* 990 * Perform relocation to PLT table entry. 991 */ 992 if ((ofl->ofl_flags & FLG_OF_SHAROBJ) && 993 IS_ADD_RELATIVE(rsp->rel_rtype)) { 994 Word ortype = rsp->rel_rtype; 995 996 rsp->rel_rtype = ld_targ.t_m.m_r_relative; 997 if ((*ld_targ.t_mr.mr_add_outrel)(FLG_REL_ADVAL, rsp, ofl) == 998 S_ERROR) 999 return (S_ERROR); 1000 rsp->rel_rtype = ortype; 1001 return (1); 1002 } else 1003 return (ld_add_actrel(NULL, rsp, ofl)); 1004 } 1005 1006 /* 1007 * process GLOBAL undefined and ref_dyn_need symbols. 1008 */ 1009 static uintptr_t 1010 reloc_exec(Rel_desc *rsp, Ofl_desc *ofl) 1011 { 1012 Sym_desc *_sdp, *sdp = rsp->rel_sym; 1013 Sym_aux *sap = sdp->sd_aux; 1014 Sym *sym = sdp->sd_sym; 1015 Addr stval; 1016 1017 /* 1018 * Reference is to a function so simply create a plt entry for it. 1019 */ 1020 if (ELF_ST_TYPE(sym->st_info) == STT_FUNC) 1021 return (ld_reloc_plt(rsp, ofl)); 1022 1023 /* 1024 * Catch absolutes - these may cause a text relocation. 1025 */ 1026 if ((sdp->sd_flags & FLG_SY_SPECSEC) && (sym->st_shndx == SHN_ABS)) { 1027 if ((ofl->ofl_flags1 & FLG_OF1_ABSEXEC) == 0) 1028 return ((*ld_targ.t_mr.mr_add_outrel)(NULL, rsp, ofl)); 1029 1030 /* 1031 * If -zabsexec is set then promote the ABSOLUTE symbol to 1032 * current the current object and perform the relocation now. 1033 */ 1034 sdp->sd_ref = REF_REL_NEED; 1035 return (ld_add_actrel(NULL, rsp, ofl)); 1036 } 1037 1038 /* 1039 * If the relocation is against a writable section simply compute the 1040 * necessary output relocation. As an optimization, if the symbol has 1041 * already been transformed into a copy relocation then we can perform 1042 * the relocation directly (copy relocations should only be generated 1043 * for references from the text segment and these relocations are 1044 * normally carried out before we get to the data segment relocations). 1045 */ 1046 if ((ELF_ST_TYPE(sym->st_info) == STT_OBJECT) && 1047 (RELAUX_GET_OSDESC(rsp)->os_shdr->sh_flags & SHF_WRITE)) { 1048 if (sdp->sd_flags & FLG_SY_MVTOCOMM) 1049 return (ld_add_actrel(NULL, rsp, ofl)); 1050 else 1051 return ((*ld_targ.t_mr.mr_add_outrel)(NULL, rsp, ofl)); 1052 } 1053 1054 /* 1055 * If the reference isn't to an object (normally because a .type 1056 * directive hasn't defined in some assembler source), then simply apply 1057 * a generic relocation (this has a tendency to result in text 1058 * relocations). 1059 */ 1060 if (ELF_ST_TYPE(sym->st_info) != STT_OBJECT) { 1061 Conv_inv_buf_t inv_buf; 1062 1063 eprintf(ofl->ofl_lml, ERR_WARNING, MSG_INTL(MSG_REL_UNEXPSYM), 1064 conv_sym_info_type(sdp->sd_file->ifl_ehdr->e_machine, 1065 ELF_ST_TYPE(sym->st_info), 0, &inv_buf), 1066 rsp->rel_isdesc->is_file->ifl_name, 1067 ld_reloc_sym_name(rsp), sdp->sd_file->ifl_name); 1068 return ((*ld_targ.t_mr.mr_add_outrel)(NULL, rsp, ofl)); 1069 } 1070 1071 /* 1072 * Prepare for generating a copy relocation. 1073 * 1074 * If this symbol is one of an alias pair, we need to insure both 1075 * symbols become part of the output (the strong symbol will be used to 1076 * maintain the symbols state). And, if we did raise the precedence of 1077 * a symbol we need to check and see if this is a weak symbol. If it is 1078 * we want to use it's strong counter part. 1079 * 1080 * The results of this logic should be: 1081 * ra_usym: assigned to strong 1082 * rel_sym: assigned to symbol to perform 1083 * copy_reloc against (weak or strong). 1084 */ 1085 if (sap->sa_linkndx) { 1086 _sdp = sdp->sd_file->ifl_oldndx[sap->sa_linkndx]; 1087 1088 if (_sdp->sd_ref < sdp->sd_ref) { 1089 _sdp->sd_ref = sdp->sd_ref; 1090 _sdp->sd_flags |= FLG_SY_REFRSD; 1091 1092 /* 1093 * As we're going to replicate a symbol from a shared 1094 * object, retain its correct binding status. 1095 */ 1096 if (ELF_ST_BIND(_sdp->sd_sym->st_info) == STB_GLOBAL) 1097 _sdp->sd_flags |= FLG_SY_GLOBREF; 1098 1099 } else if (_sdp->sd_ref > sdp->sd_ref) { 1100 sdp->sd_ref = _sdp->sd_ref; 1101 sdp->sd_flags |= FLG_SY_REFRSD; 1102 1103 /* 1104 * As we're going to replicate a symbol from a shared 1105 * object, retain its correct binding status. 1106 */ 1107 if (ELF_ST_BIND(sym->st_info) == STB_GLOBAL) 1108 sdp->sd_flags |= FLG_SY_GLOBREF; 1109 } 1110 1111 /* 1112 * If this is a weak symbol then we want to move the strong 1113 * symbol into local .bss. If there is a copy_reloc to be 1114 * performed, that should still occur against the WEAK symbol. 1115 */ 1116 if (((ELF_ST_BIND(sdp->sd_sym->st_info) == STB_WEAK) || 1117 (sdp->sd_flags & FLG_SY_WEAKDEF)) && 1118 !ld_reloc_set_aux_usym(ofl, rsp, _sdp)) 1119 return (S_ERROR); 1120 } else 1121 _sdp = 0; 1122 1123 /* 1124 * If the reference is to an object then allocate space for the object 1125 * within the executables .bss. Relocations will now be performed from 1126 * this new location. If the original shared objects data is 1127 * initialized, then generate a copy relocation that will copy the data 1128 * to the executables .bss at runtime. 1129 */ 1130 if (!(RELAUX_GET_USYM(rsp)->sd_flags & FLG_SY_MVTOCOMM)) { 1131 Word rtype = rsp->rel_rtype; 1132 Copy_rel cr; 1133 1134 /* 1135 * Indicate that the symbol(s) against which we're relocating 1136 * have been moved to the executables common. Also, insure that 1137 * the symbol(s) remain marked as global, as the shared object 1138 * from which they are copied must be able to relocate to the 1139 * new common location within the executable. 1140 * 1141 * Note that even though a new symbol has been generated in the 1142 * output files' .bss, the symbol must remain REF_DYN_NEED and 1143 * not be promoted to REF_REL_NEED. sym_validate() still needs 1144 * to carry out a number of checks against the symbols binding 1145 * that are triggered by the REF_DYN_NEED state. 1146 */ 1147 sdp->sd_flags |= 1148 (FLG_SY_MVTOCOMM | FLG_SY_DEFAULT | FLG_SY_EXPDEF); 1149 sdp->sd_flags &= ~MSK_SY_LOCAL; 1150 sdp->sd_sym->st_other &= ~MSK_SYM_VISIBILITY; 1151 if (_sdp) { 1152 _sdp->sd_flags |= (FLG_SY_MVTOCOMM | 1153 FLG_SY_DEFAULT | FLG_SY_EXPDEF); 1154 _sdp->sd_flags &= ~MSK_SY_LOCAL; 1155 _sdp->sd_sym->st_other &= ~MSK_SYM_VISIBILITY; 1156 1157 /* 1158 * Make sure the symbol has a reference in case of any 1159 * error diagnostics against it (perhaps this belongs 1160 * to a version that isn't allowable for this build). 1161 * The resulting diagnostic (see sym_undef_entry()) 1162 * might seem a little bogus, as the symbol hasn't 1163 * really been referenced by this file, but has been 1164 * promoted as a consequence of its alias reference. 1165 */ 1166 if (!(_sdp->sd_aux->sa_rfile)) 1167 _sdp->sd_aux->sa_rfile = sdp->sd_aux->sa_rfile; 1168 } 1169 1170 /* 1171 * Assign the symbol to the bss and insure sufficient alignment 1172 * (we don't know the real alignment so we have to make the 1173 * worst case guess). 1174 */ 1175 _sdp = RELAUX_GET_USYM(rsp); 1176 stval = _sdp->sd_sym->st_value; 1177 if (ld_sym_copy(_sdp) == S_ERROR) 1178 return (S_ERROR); 1179 _sdp->sd_shndx = _sdp->sd_sym->st_shndx = SHN_COMMON; 1180 _sdp->sd_flags |= FLG_SY_SPECSEC; 1181 _sdp->sd_sym->st_value = 1182 (_sdp->sd_sym->st_size < (ld_targ.t_m.m_word_align * 2)) ? 1183 ld_targ.t_m.m_word_align : ld_targ.t_m.m_word_align * 2; 1184 1185 /* 1186 * Whether or not the symbol references initialized data we 1187 * generate a copy relocation - this differs from the past 1188 * where we would not create the COPY_RELOC if we were binding 1189 * against .bss. This is done for *two* reasons. 1190 * 1191 * - If the symbol in the shared object changes to a 1192 * initialized data - we need the COPY to pick it up. 1193 * - Without the COPY RELOC we can't tell that the symbol 1194 * from the COPY'd object has been moved and all bindings 1195 * to it should bind here. 1196 * 1197 * Keep this symbol in the copy relocation list to check the 1198 * validity later. 1199 */ 1200 cr.c_sdp = _sdp; 1201 cr.c_val = stval; 1202 if (alist_append(&ofl->ofl_copyrels, &cr, sizeof (Copy_rel), 1203 AL_CNT_OFL_COPYRELS) == NULL) 1204 return (S_ERROR); 1205 1206 rsp->rel_rtype = ld_targ.t_m.m_r_copy; 1207 if ((*ld_targ.t_mr.mr_add_outrel)(FLG_REL_BSS, rsp, ofl) == 1208 S_ERROR) 1209 return (S_ERROR); 1210 rsp->rel_rtype = rtype; 1211 1212 /* 1213 * If this symbol is a protected symbol, warn it. 1214 */ 1215 if (_sdp->sd_flags & FLG_SY_PROT) { 1216 Conv_inv_buf_t inv_buf; 1217 1218 eprintf(ofl->ofl_lml, ERR_WARNING, 1219 MSG_INTL(MSG_REL_COPY), 1220 conv_reloc_type(_sdp->sd_file->ifl_ehdr->e_machine, 1221 ld_targ.t_m.m_r_copy, 0, &inv_buf), 1222 _sdp->sd_file->ifl_name, _sdp->sd_name); 1223 } 1224 DBG_CALL(Dbg_syms_reloc(ofl, sdp)); 1225 } 1226 return (ld_add_actrel(NULL, rsp, ofl)); 1227 } 1228 1229 /* 1230 * All relocations should have been handled by the other routines. This 1231 * routine is here as a catch all, if we do enter it we've goofed - but 1232 * we'll try and do the best we can. 1233 */ 1234 static uintptr_t 1235 reloc_generic(Rel_desc *rsp, Ofl_desc *ofl) 1236 { 1237 Ifl_desc *ifl = rsp->rel_isdesc->is_file; 1238 Conv_inv_buf_t inv_buf; 1239 1240 eprintf(ofl->ofl_lml, ERR_WARNING, MSG_INTL(MSG_REL_UNEXPREL), 1241 conv_reloc_type(ifl->ifl_ehdr->e_machine, rsp->rel_rtype, 1242 0, &inv_buf), ifl->ifl_name, ld_reloc_sym_name(rsp)); 1243 1244 /* 1245 * If building a shared object then put the relocation off 1246 * until runtime. 1247 */ 1248 if (ofl->ofl_flags & FLG_OF_SHAROBJ) 1249 return ((*ld_targ.t_mr.mr_add_outrel)(NULL, rsp, ofl)); 1250 1251 /* 1252 * Otherwise process relocation now. 1253 */ 1254 return (ld_add_actrel(NULL, rsp, ofl)); 1255 } 1256 1257 /* 1258 * Process relocations when building a relocatable object. Typically, there 1259 * aren't many relocations that can be caught at this point, most are simply 1260 * passed through to the output relocatable object. 1261 */ 1262 static uintptr_t 1263 reloc_relobj(Boolean local, Rel_desc *rsp, Ofl_desc *ofl) 1264 { 1265 Word rtype = rsp->rel_rtype; 1266 Sym_desc *sdp = rsp->rel_sym; 1267 Is_desc *isp = rsp->rel_isdesc; 1268 Word oflags = NULL; 1269 1270 /* 1271 * Determine if we can do any relocations at this point. We can if: 1272 * 1273 * this is local_symbol and a non-GOT relocation, and 1274 * the relocation is pc-relative, and 1275 * the relocation is against a symbol in same section 1276 */ 1277 if (local && !IS_GOT_RELATIVE(rtype) && 1278 !IS_GOT_BASED(rtype) && !IS_GOT_PC(rtype) && 1279 IS_PC_RELATIVE(rtype) && 1280 ((sdp->sd_isc) && (sdp->sd_isc->is_osdesc == isp->is_osdesc))) 1281 return (ld_add_actrel(NULL, rsp, ofl)); 1282 1283 /* 1284 * If -zredlocsym is in effect, translate all local symbol relocations 1285 * to be against section symbols, since section symbols are the only 1286 * local symbols which will be added to the .symtab. 1287 */ 1288 if (local && (((ofl->ofl_flags & FLG_OF_REDLSYM) && 1289 (ELF_ST_BIND(sdp->sd_sym->st_info) == STB_LOCAL)) || 1290 ((sdp->sd_flags & FLG_SY_ELIM) && 1291 (ofl->ofl_flags & FLG_OF_PROCRED)))) { 1292 /* 1293 * But if this is PIC code, don't allow it for now. 1294 */ 1295 if (IS_GOT_RELATIVE(rsp->rel_rtype)) { 1296 Ifl_desc *ifl = rsp->rel_isdesc->is_file; 1297 Conv_inv_buf_t inv_buf; 1298 1299 eprintf(ofl->ofl_lml, ERR_FATAL, 1300 MSG_INTL(MSG_REL_PICREDLOC), 1301 ld_reloc_sym_name(rsp), ifl->ifl_name, 1302 conv_reloc_type(ifl->ifl_ehdr->e_machine, 1303 rsp->rel_rtype, 0, &inv_buf)); 1304 return (S_ERROR); 1305 } 1306 1307 /* 1308 * Indicate that this relocation should be processed the same 1309 * as a section symbol. For RELA, indicate that the addend 1310 * also needs to be applied to this relocation. 1311 */ 1312 if ((rsp->rel_flags & FLG_REL_RELA) == FLG_REL_RELA) 1313 oflags = FLG_REL_SCNNDX | FLG_REL_ADVAL; 1314 else 1315 oflags = FLG_REL_SCNNDX; 1316 } 1317 1318 if ((rsp->rel_flags & FLG_REL_RELA) == 0) { 1319 /* 1320 * Intel (Rel) relocations do not contain an addend. Any 1321 * addend is contained within the file at the location 1322 * identified by the relocation offset. Therefore, if we're 1323 * processing a section symbol, or a -zredlocsym relocation 1324 * (that basically transforms a local symbol reference into 1325 * a section reference), perform an active relocation to 1326 * propagate any addend. 1327 */ 1328 if ((ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION) || 1329 (oflags == FLG_REL_SCNNDX)) 1330 if (ld_add_actrel(NULL, rsp, ofl) == S_ERROR) 1331 return (S_ERROR); 1332 } 1333 return ((*ld_targ.t_mr.mr_add_outrel)(oflags, rsp, ofl)); 1334 } 1335 1336 /* 1337 * Perform any generic TLS validations before passing control to machine 1338 * specific routines. At this point we know we are dealing with an executable 1339 * or shared object - relocatable objects have already been processed. 1340 */ 1341 static uintptr_t 1342 reloc_TLS(Boolean local, Rel_desc *rsp, Ofl_desc *ofl) 1343 { 1344 Word rtype = rsp->rel_rtype; 1345 ofl_flag_t flags = ofl->ofl_flags; 1346 Ifl_desc *ifl = rsp->rel_isdesc->is_file; 1347 Half mach = ifl->ifl_ehdr->e_machine; 1348 Sym_desc *sdp = rsp->rel_sym; 1349 unsigned char type; 1350 Conv_inv_buf_t inv_buf1, inv_buf2; 1351 1352 /* 1353 * All TLS relocations are illegal in a static executable. 1354 */ 1355 if (OFL_IS_STATIC_EXEC(ofl)) { 1356 eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_REL_TLSSTAT), 1357 conv_reloc_type(mach, rtype, 0, &inv_buf1), ifl->ifl_name, 1358 ld_reloc_sym_name(rsp)); 1359 return (S_ERROR); 1360 } 1361 1362 /* 1363 * Any TLS relocation must be against a STT_TLS symbol, all others 1364 * are illegal. 1365 */ 1366 if ((type = ELF_ST_TYPE(sdp->sd_sym->st_info)) != STT_TLS) { 1367 eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_REL_TLSBADSYM), 1368 conv_reloc_type(mach, rtype, 0, &inv_buf1), ifl->ifl_name, 1369 ld_reloc_sym_name(rsp), 1370 conv_sym_info_type(mach, type, 0, &inv_buf2)); 1371 return (S_ERROR); 1372 } 1373 1374 /* 1375 * A dynamic executable can not use the LD or LE reference models to 1376 * reference an external symbol. A shared object can not use the LD 1377 * reference model to reference an external symbol. 1378 */ 1379 if (!local && (IS_TLS_LD(rtype) || 1380 ((flags & FLG_OF_EXEC) && IS_TLS_LE(rtype)))) { 1381 eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_REL_TLSBND), 1382 conv_reloc_type(mach, rtype, 0, &inv_buf1), ifl->ifl_name, 1383 ld_reloc_sym_name(rsp), sdp->sd_file->ifl_name); 1384 return (S_ERROR); 1385 } 1386 1387 /* 1388 * The TLS LE model is only allowed for dynamic executables. The TLS IE 1389 * model is allowed for shared objects, but this model has restrictions. 1390 * This model can only be used freely in dependencies that are loaded 1391 * immediately as part of process initialization. However, during the 1392 * initial runtime handshake with libc that establishes the thread 1393 * pointer, a small backup TLS reservation is created. This area can 1394 * be used by objects that are loaded after threads are initialized. 1395 * However, this area is limited in size and may have already been 1396 * used. This area is intended for specialized applications, and does 1397 * not provide the degree of flexibility dynamic TLS can offer. Under 1398 * -z verbose indicate this restriction to the user. 1399 */ 1400 if ((flags & FLG_OF_EXEC) == 0) { 1401 if (IS_TLS_LE(rtype)) { 1402 eprintf(ofl->ofl_lml, ERR_FATAL, 1403 MSG_INTL(MSG_REL_TLSLE), 1404 conv_reloc_type(mach, rtype, 0, &inv_buf1), 1405 ifl->ifl_name, ld_reloc_sym_name(rsp)); 1406 return (S_ERROR); 1407 1408 } else if ((IS_TLS_IE(rtype)) && 1409 (flags & FLG_OF_VERBOSE)) { 1410 eprintf(ofl->ofl_lml, ERR_WARNING, 1411 MSG_INTL(MSG_REL_TLSIE), 1412 conv_reloc_type(mach, rtype, 0, &inv_buf1), 1413 ifl->ifl_name, ld_reloc_sym_name(rsp)); 1414 } 1415 } 1416 1417 return ((*ld_targ.t_mr.mr_reloc_TLS)(local, rsp, ofl)); 1418 } 1419 1420 uintptr_t 1421 ld_process_sym_reloc(Ofl_desc *ofl, Rel_desc *reld, Rel *reloc, Is_desc *isp, 1422 const char *isname, Word isscnndx) 1423 { 1424 Word rtype = reld->rel_rtype; 1425 ofl_flag_t flags = ofl->ofl_flags; 1426 Sym_desc *sdp = reld->rel_sym; 1427 Sym_aux *sap; 1428 Boolean local; 1429 Conv_inv_buf_t inv_buf; 1430 1431 DBG_CALL(Dbg_reloc_in(ofl->ofl_lml, ELF_DBG_LD, ld_targ.t_m.m_mach, 1432 ld_targ.t_m.m_rel_sht_type, (void *)reloc, isname, isscnndx, 1433 ld_reloc_sym_name(reld))); 1434 1435 /* 1436 * Indicate this symbol is being used for relocation and therefore must 1437 * have its output address updated accordingly (refer to update_osym()). 1438 */ 1439 sdp->sd_flags |= FLG_SY_UPREQD; 1440 1441 /* 1442 * Indicate the section this symbol is defined in has been referenced, 1443 * therefor it *is not* a candidate for elimination. 1444 */ 1445 if (sdp->sd_isc) { 1446 sdp->sd_isc->is_flags |= FLG_IS_SECTREF; 1447 sdp->sd_isc->is_file->ifl_flags |= FLG_IF_FILEREF; 1448 } 1449 1450 if (!ld_reloc_set_aux_usym(ofl, reld, sdp)) 1451 return (S_ERROR); 1452 1453 /* 1454 * Determine if this symbol is actually an alias to another symbol. If 1455 * so, and the alias is not REF_DYN_SEEN, set ra_usym to point to the 1456 * weak symbols strong counter-part. The one exception is if the 1457 * FLG_SY_MVTOCOMM flag is set on the weak symbol. If this is the case, 1458 * the strong is only here because of its promotion, and the weak symbol 1459 * should still be used for the relocation reference (see reloc_exec()). 1460 */ 1461 sap = sdp->sd_aux; 1462 if (sap && sap->sa_linkndx && 1463 ((ELF_ST_BIND(sdp->sd_sym->st_info) == STB_WEAK) || 1464 (sdp->sd_flags & FLG_SY_WEAKDEF)) && 1465 (!(sdp->sd_flags & FLG_SY_MVTOCOMM))) { 1466 Sym_desc *_sdp; 1467 1468 _sdp = sdp->sd_file->ifl_oldndx[sap->sa_linkndx]; 1469 if ((_sdp->sd_ref != REF_DYN_SEEN) && 1470 !ld_reloc_set_aux_usym(ofl, reld, _sdp)) 1471 return (S_ERROR); 1472 } 1473 1474 /* 1475 * Determine whether this symbol should be bound locally or not. 1476 * Symbols are bound locally if one of the following is true: 1477 * 1478 * - the symbol is of type STB_LOCAL. 1479 * 1480 * - the output image is not a relocatable object and the relocation 1481 * is relative to the .got. 1482 * 1483 * - the section being relocated is of type SHT_SUNW_dof. These 1484 * sections must be bound to the functions in the containing 1485 * object and can not be interposed upon. 1486 * 1487 * - the symbol has been reduced (scoped to a local or symbolic) and 1488 * reductions are being processed. 1489 * 1490 * - the -Bsymbolic flag is in use when building a shared object, 1491 * and the symbol hasn't explicitly been defined as nodirect. 1492 * 1493 * - an executable (fixed address) is being created, and the symbol 1494 * is defined in the executable. 1495 * 1496 * - the relocation is against a segment which will not be loaded 1497 * into memory. In this case, the relocation must be resolved 1498 * now, as ld.so.1 can not process relocations against unmapped 1499 * segments. 1500 */ 1501 local = FALSE; 1502 if (ELF_ST_BIND(sdp->sd_sym->st_info) == STB_LOCAL) { 1503 local = TRUE; 1504 } else if (!(reld->rel_flags & FLG_REL_LOAD)) { 1505 local = TRUE; 1506 } else if (sdp->sd_sym->st_shndx != SHN_UNDEF) { 1507 if (reld->rel_isdesc && 1508 reld->rel_isdesc->is_shdr->sh_type == SHT_SUNW_dof) { 1509 local = TRUE; 1510 } else if (!(flags & FLG_OF_RELOBJ) && 1511 (IS_LOCALBND(rtype) || IS_SEG_RELATIVE(rtype))) { 1512 local = TRUE; 1513 } else if ((sdp->sd_ref == REF_REL_NEED) && 1514 ((sdp->sd_flags & FLG_SY_CAP) == 0)) { 1515 /* 1516 * Global symbols may have been individually reduced in 1517 * scope. If the whole object is to be self contained, 1518 * such as when generating an executable or a symbolic 1519 * shared object, make sure all relocation symbol 1520 * references (sections too) are treated locally. Note, 1521 * explicit no-direct symbols should not be bound to 1522 * locally. 1523 */ 1524 if ((sdp->sd_flags & 1525 (FLG_SY_HIDDEN | FLG_SY_PROTECT))) 1526 local = TRUE; 1527 else if ((flags & FLG_OF_EXEC) || 1528 ((flags & FLG_OF_SYMBOLIC) && 1529 ((sdp->sd_flags & FLG_SY_NDIR) == 0))) { 1530 local = TRUE; 1531 } 1532 } 1533 } 1534 1535 /* 1536 * If this is a PC_RELATIVE relocation, the relocation could be 1537 * compromised if the relocated address is later used as a copy 1538 * relocated symbol (PSARC 1999/636, bugid 4187211). Scan the input 1539 * files symbol table to cross reference this relocation offset. 1540 */ 1541 if ((ofl->ofl_flags & FLG_OF_SHAROBJ) && 1542 IS_PC_RELATIVE(rtype) && 1543 (IS_GOT_PC(rtype) == 0) && 1544 (IS_PLT(rtype) == 0)) { 1545 if (disp_inspect(ofl, reld, local) == S_ERROR) 1546 return (S_ERROR); 1547 } 1548 1549 /* 1550 * GOT based relocations must bind to the object being built - since 1551 * they are relevant to the current GOT. If not building a relocatable 1552 * object - give a appropriate error message. 1553 */ 1554 if (!local && !(flags & FLG_OF_RELOBJ) && 1555 IS_GOT_BASED(rtype)) { 1556 Ifl_desc *ifl = reld->rel_isdesc->is_file; 1557 1558 eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_REL_BADGOTBASED), 1559 conv_reloc_type(ifl->ifl_ehdr->e_machine, rtype, 1560 0, &inv_buf), ifl->ifl_name, demangle(sdp->sd_name)); 1561 return (S_ERROR); 1562 } 1563 1564 /* 1565 * TLS symbols can only have TLS relocations. 1566 */ 1567 if ((ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_TLS) && 1568 (IS_TLS_INS(rtype) == 0)) { 1569 /* 1570 * The above test is relaxed if the target section is 1571 * non-allocable. 1572 */ 1573 if (RELAUX_GET_OSDESC(reld)->os_shdr->sh_flags & SHF_ALLOC) { 1574 Ifl_desc *ifl = reld->rel_isdesc->is_file; 1575 1576 eprintf(ofl->ofl_lml, ERR_FATAL, 1577 MSG_INTL(MSG_REL_BADTLS), 1578 conv_reloc_type(ifl->ifl_ehdr->e_machine, 1579 rtype, 0, &inv_buf), ifl->ifl_name, 1580 demangle(sdp->sd_name)); 1581 return (S_ERROR); 1582 } 1583 } 1584 1585 /* 1586 * Select the relocation to perform. 1587 */ 1588 if (IS_REGISTER(rtype)) { 1589 if (ld_targ.t_mr.mr_reloc_register == NULL) { 1590 eprintf(ofl->ofl_lml, ERR_FATAL, 1591 MSG_INTL(MSG_REL_NOREG)); 1592 return (S_ERROR); 1593 } 1594 return ((*ld_targ.t_mr.mr_reloc_register)(reld, isp, ofl)); 1595 } 1596 1597 if (flags & FLG_OF_RELOBJ) 1598 return (reloc_relobj(local, reld, ofl)); 1599 1600 if (IS_TLS_INS(rtype)) 1601 return (reloc_TLS(local, reld, ofl)); 1602 1603 if (IS_GOT_OPINS(rtype)) { 1604 if (ld_targ.t_mr.mr_reloc_GOTOP == NULL) { 1605 assert(0); 1606 return (S_ERROR); 1607 } 1608 return ((*ld_targ.t_mr.mr_reloc_GOTOP)(local, reld, ofl)); 1609 } 1610 1611 if (IS_GOT_RELATIVE(rtype)) 1612 return (ld_reloc_GOT_relative(local, reld, ofl)); 1613 1614 if (local) 1615 return ((*ld_targ.t_mr.mr_reloc_local)(reld, ofl)); 1616 1617 if ((IS_PLT(rtype) || ((sdp->sd_flags & FLG_SY_CAP) && 1618 (ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_FUNC))) && 1619 ((flags & FLG_OF_BFLAG) == 0)) 1620 return (ld_reloc_plt(reld, ofl)); 1621 1622 if ((sdp->sd_ref == REF_REL_NEED) || 1623 (flags & FLG_OF_BFLAG) || (flags & FLG_OF_SHAROBJ) || 1624 (ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_NOTYPE)) 1625 return ((*ld_targ.t_mr.mr_add_outrel)(NULL, reld, ofl)); 1626 1627 if (sdp->sd_ref == REF_DYN_NEED) 1628 return (reloc_exec(reld, ofl)); 1629 1630 /* 1631 * IS_NOT_REL(rtype) 1632 */ 1633 return (reloc_generic(reld, ofl)); 1634 } 1635 1636 /* 1637 * Given a relocation that references a local symbol from a discarded COMDAT 1638 * section, replace the symbol with the corresponding symbol from the section 1639 * that was kept. 1640 * 1641 * entry: 1642 * reld - Relocation 1643 * sdp - Symbol to be replaced. Must be a local symbol (STB_LOCAL). 1644 * reject - Address of variable to receive rejection code 1645 * if no replacement symbol is found. 1646 * 1647 * exit: 1648 * Returns address of replacement symbol descriptor if one was 1649 * found, and NULL otherwise. The result is also cached in 1650 * ofl->ofl_sr_cache as an optimization to speed following calls 1651 * for the same value of sdp. 1652 * 1653 * On success (non-NULL result), *reject is set to RLXREL_REJ_NONE. 1654 * On failure (NULL result), *reject is filled in with a code 1655 * describing the underlying reason. 1656 * 1657 * note: 1658 * The word "COMDAT" is used to refer to actual COMDAT sections, COMDAT 1659 * groups tied together with an SHF_GROUP section, and .gnu.linkonce 1660 * sections which provide a simplified COMDAT requirement. COMDAT 1661 * sections are identified with the FLG_IS_COMDAT section flag. 1662 * 1663 * In principle, this sort of sloppy relocation remapping is 1664 * a questionable practice. All self-referential sections should 1665 * be in a common SHF_GROUP so that they are all kept or removed 1666 * together. The problem is that there is no way to ensure that the 1667 * two sections are similar enough that the replacement section will 1668 * really supply the correct information. However, we see a couple of 1669 * situations where it is useful to do this: (1) Older Sun C compilers 1670 * generated DWARF sections that would refer to one of the COMDAT 1671 * sections, and (2) gcc, when its GNU linkonce COMDAT feature is enabled. 1672 * It turns out that the GNU ld does these sloppy remappings. 1673 * 1674 * The GNU ld takes an approach that hard wires special section 1675 * names and treats them specially. We avoid that practice and 1676 * try to get the necessary work done relying only on the ELF 1677 * attributes of the sections and symbols involved. This means 1678 * that our heuristic is somewhat different than theirs, but the 1679 * end result is close enough to solve the same problem. 1680 * 1681 * gcc is in the process of converting to SHF_GROUP. This will 1682 * eventually phase out the need for sloppy relocations, and 1683 * then this logic won't be needed. In the meantime, relaxed relocation 1684 * processing allows us to interoperate. 1685 */ 1686 static Sym_desc * 1687 sloppy_comdat_reloc(Ofl_desc *ofl, Rel_desc *reld, Sym_desc *sdp, 1688 Rlxrel_rej *reject) 1689 { 1690 Is_desc *rep_isp; 1691 Sym *sym, *rep_sym; 1692 Is_desc *isp; 1693 Ifl_desc *ifl; 1694 Conv_inv_buf_t inv_buf; 1695 Word scnndx, symscnt; 1696 Sym_desc **oldndx, *rep_sdp; 1697 const char *is_name; 1698 1699 1700 /* 1701 * Sloppy relocations are never applied to .eh_frame or 1702 * .gcc_except_table sections. The entries in these sections 1703 * for discarded sections are better left uninitialized. 1704 * 1705 * We match these sections by name, because on most platforms they 1706 * are SHT_PROGBITS, and cannot be identified otherwise. On amd64 1707 * architectures, .eh_frame is SHT_AMD64_UNWIND, but that is ambiguous 1708 * (.eh_frame_hdr is also SHT_AMD64_UNWIND), so we still match it by 1709 * name. 1710 */ 1711 is_name = reld->rel_isdesc->is_name; 1712 if (((is_name[1] == 'e') && 1713 (strcmp(is_name, MSG_ORIG(MSG_SCN_EHFRAME)) == 0)) || 1714 ((is_name[1] == 'g') && 1715 (strcmp(is_name, MSG_ORIG(MSG_SCN_GCC_X_TBL)) == 0))) { 1716 *reject = RLXREL_REJ_TARGET; 1717 return (NULL); 1718 } 1719 1720 /* 1721 * If we looked up the same symbol on the previous call, we can 1722 * return the cached value. 1723 */ 1724 if (sdp == ofl->ofl_sr_cache.sr_osdp) { 1725 *reject = ofl->ofl_sr_cache.sr_rej; 1726 return (ofl->ofl_sr_cache.sr_rsdp); 1727 } 1728 1729 ofl->ofl_sr_cache.sr_osdp = sdp; 1730 sym = sdp->sd_sym; 1731 isp = sdp->sd_isc; 1732 ifl = sdp->sd_file; 1733 1734 /* 1735 * When a COMDAT section is discarded in favor of another COMDAT 1736 * section, the replacement is recorded in its section descriptor 1737 * (is_comdatkeep). We must validate the replacement before using 1738 * it. The replacement section must: 1739 * - Not have been discarded 1740 * - Have the same size (*) 1741 * - Have the same section type 1742 * - Have the same SHF_GROUP flag setting (either on or off) 1743 * - Must be a COMDAT section of one form or the other. 1744 * 1745 * (*) One might imagine that the replacement section could be 1746 * larger than the original, rather than the exact size. However, 1747 * we have verified that this is the same policy used by the GNU 1748 * ld. If the sections are not the same size, the chance of them 1749 * being interchangeable drops significantly. 1750 */ 1751 if (((rep_isp = isp->is_comdatkeep) == NULL) || 1752 ((rep_isp->is_flags & FLG_IS_DISCARD) != 0) || 1753 ((rep_isp->is_flags & FLG_IS_COMDAT) == 0) || 1754 (isp->is_indata->d_size != rep_isp->is_indata->d_size) || 1755 (isp->is_shdr->sh_type != rep_isp->is_shdr->sh_type) || 1756 ((isp->is_shdr->sh_flags & SHF_GROUP) != 1757 (rep_isp->is_shdr->sh_flags & SHF_GROUP))) { 1758 *reject = ofl->ofl_sr_cache.sr_rej = RLXREL_REJ_SECTION; 1759 return (ofl->ofl_sr_cache.sr_rsdp = NULL); 1760 } 1761 1762 /* 1763 * We found the kept COMDAT section. Now, look at all of the 1764 * symbols from the input file that contains it to find the 1765 * symbol that corresponds to the one we started with: 1766 * - Hasn't been discarded 1767 * - Has section index of kept section 1768 * - If one symbol has a name, the other must have 1769 * the same name. The st_name field of a symbol 1770 * is 0 if there is no name, and is a string 1771 * table offset otherwise. The string table 1772 * offsets may well not agree --- it is the 1773 * actual string that matters. 1774 * - Type and binding attributes match (st_info) 1775 * - Values match (st_value) 1776 * - Sizes match (st_size) 1777 * - Visibility matches (st_other) 1778 */ 1779 scnndx = rep_isp->is_scnndx; 1780 oldndx = rep_isp->is_file->ifl_oldndx; 1781 symscnt = rep_isp->is_file->ifl_symscnt; 1782 while (symscnt--) { 1783 rep_sdp = *oldndx++; 1784 if ((rep_sdp == NULL) || (rep_sdp->sd_flags & FLG_SY_ISDISC) || 1785 ((rep_sym = rep_sdp->sd_sym)->st_shndx != scnndx) || 1786 ((sym->st_name == 0) != (rep_sym->st_name == 0)) || 1787 ((sym->st_name != 0) && 1788 (strcmp(sdp->sd_name, rep_sdp->sd_name) != 0)) || 1789 (sym->st_info != rep_sym->st_info) || 1790 (sym->st_value != rep_sym->st_value) || 1791 (sym->st_size != rep_sym->st_size) || 1792 (sym->st_other != rep_sym->st_other)) 1793 continue; 1794 1795 1796 if (ofl->ofl_flags & FLG_OF_VERBOSE) { 1797 if (sym->st_name != 0) { 1798 eprintf(ofl->ofl_lml, ERR_WARNING, 1799 MSG_INTL(MSG_REL_SLOPCDATNAM), 1800 conv_reloc_type(ifl->ifl_ehdr->e_machine, 1801 reld->rel_rtype, 0, &inv_buf), 1802 ifl->ifl_name, 1803 EC_WORD(reld->rel_isdesc->is_scnndx), 1804 reld->rel_isdesc->is_name, 1805 rep_sdp->sd_name, 1806 EC_WORD(isp->is_scnndx), isp->is_name, 1807 rep_sdp->sd_file->ifl_name); 1808 } else { 1809 eprintf(ofl->ofl_lml, ERR_WARNING, 1810 MSG_INTL(MSG_REL_SLOPCDATNONAM), 1811 conv_reloc_type(ifl->ifl_ehdr->e_machine, 1812 reld->rel_rtype, 0, &inv_buf), 1813 ifl->ifl_name, 1814 EC_WORD(reld->rel_isdesc->is_scnndx), 1815 reld->rel_isdesc->is_name, 1816 EC_WORD(isp->is_scnndx), isp->is_name, 1817 rep_sdp->sd_file->ifl_name); 1818 } 1819 } 1820 DBG_CALL(Dbg_reloc_sloppycomdat(ofl->ofl_lml, rep_sdp)); 1821 *reject = ofl->ofl_sr_cache.sr_rej = RLXREL_REJ_NONE; 1822 return (ofl->ofl_sr_cache.sr_rsdp = rep_sdp); 1823 } 1824 1825 /* If didn't return above, we didn't find it */ 1826 *reject = ofl->ofl_sr_cache.sr_rej = RLXREL_REJ_SYMBOL; 1827 return (ofl->ofl_sr_cache.sr_rsdp = NULL); 1828 } 1829 1830 /* 1831 * Generate relocation descriptor and dispatch 1832 */ 1833 static uintptr_t 1834 process_reld(Ofl_desc *ofl, Is_desc *isp, Rel_desc *reld, Word rsndx, 1835 Rel *reloc) 1836 { 1837 Ifl_desc *ifl = isp->is_file; 1838 Word rtype = reld->rel_rtype; 1839 Sym_desc *sdp; 1840 Conv_inv_buf_t inv_buf; 1841 1842 /* 1843 * Make sure the relocation is in the valid range. 1844 */ 1845 if (rtype >= ld_targ.t_m.m_r_num) { 1846 eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_REL_INVALRELT), 1847 ifl->ifl_name, EC_WORD(isp->is_scnndx), isp->is_name, 1848 rtype); 1849 return (S_ERROR); 1850 } 1851 1852 ofl->ofl_entrelscnt++; 1853 1854 /* 1855 * Special case: a register symbol associated with symbol index 0 is 1856 * initialized (i.e., relocated) to a constant from the r_addend field 1857 * rather than from a symbol value. 1858 */ 1859 if (IS_REGISTER(rtype) && (rsndx == 0)) { 1860 reld->rel_sym = NULL; 1861 DBG_CALL(Dbg_reloc_in(ofl->ofl_lml, ELF_DBG_LD, 1862 ld_targ.t_m.m_mach, isp->is_shdr->sh_type, 1863 (void *)reloc, isp->is_name, isp->is_scnndx, 1864 ld_reloc_sym_name(reld))); 1865 if (ld_targ.t_mr.mr_reloc_register == NULL) { 1866 eprintf(ofl->ofl_lml, ERR_FATAL, 1867 MSG_INTL(MSG_REL_NOREG)); 1868 return (S_ERROR); 1869 } 1870 return ((*ld_targ.t_mr.mr_reloc_register)(reld, isp, ofl)); 1871 } 1872 1873 /* 1874 * If this is a STT_SECTION symbol, make sure the associated 1875 * section has a descriptive non-NULL is_sym_name field that can 1876 * be accessed by ld_reloc_sym_name() to satisfy debugging output 1877 * and errors. 1878 * 1879 * In principle, we could add this string to every input section 1880 * as it is created, but we defer it until we see a relocation 1881 * symbol that might need it. Not every section will have such 1882 * a relocation, so we create fewer of them this way. 1883 */ 1884 sdp = reld->rel_sym = ifl->ifl_oldndx[rsndx]; 1885 if ((sdp != NULL) && 1886 (ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION) && 1887 (sdp->sd_isc != NULL) && (sdp->sd_isc->is_name != NULL) && 1888 (sdp->sd_isc->is_sym_name == NULL) && 1889 (ld_stt_section_sym_name(sdp->sd_isc) == NULL)) 1890 return (S_ERROR); 1891 1892 /* 1893 * If for some reason we have a null relocation record issue a 1894 * warning and continue (the compiler folks can get into this 1895 * state some time). Normal users should never see this error. 1896 */ 1897 if (rtype == ld_targ.t_m.m_r_none) { 1898 DBG_CALL(Dbg_reloc_in(ofl->ofl_lml, ELF_DBG_LD, 1899 ld_targ.t_m.m_mach, ld_targ.t_m.m_rel_sht_type, 1900 (void *)reloc, isp->is_name, isp->is_scnndx, 1901 ld_reloc_sym_name(reld))); 1902 eprintf(ofl->ofl_lml, ERR_WARNING, MSG_INTL(MSG_REL_NULL), 1903 ifl->ifl_name, EC_WORD(isp->is_scnndx), isp->is_name); 1904 return (1); 1905 } 1906 1907 if (((ofl->ofl_flags & FLG_OF_RELOBJ) == 0) && 1908 IS_NOTSUP(rtype)) { 1909 eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_REL_NOTSUP), 1910 conv_reloc_type(ifl->ifl_ehdr->e_machine, rtype, 1911 0, &inv_buf), ifl->ifl_name, EC_WORD(isp->is_scnndx), 1912 isp->is_name); 1913 return (S_ERROR); 1914 } 1915 1916 /* 1917 * If we are here, we know that the relocation requires reference 1918 * symbol. If no symbol is assigned, this is a fatal error. 1919 */ 1920 if (sdp == NULL) { 1921 eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_REL_NOSYMBOL), 1922 conv_reloc_type(ifl->ifl_ehdr->e_machine, rtype, 1923 0, &inv_buf), ifl->ifl_name, EC_WORD(isp->is_scnndx), 1924 isp->is_name, EC_XWORD(reloc->r_offset)); 1925 return (S_ERROR); 1926 } 1927 1928 if (sdp->sd_flags & FLG_SY_IGNORE) 1929 return (1); 1930 1931 /* 1932 * If this symbol is part of a DISCARDED section attempt to find another 1933 * definition. 1934 */ 1935 if (sdp->sd_flags & FLG_SY_ISDISC) { 1936 Sym_desc *nsdp = NULL; 1937 Rlxrel_rej reject; 1938 1939 if (ELF_ST_BIND(sdp->sd_sym->st_info) == STB_LOCAL) { 1940 /* 1941 * If "-z relaxreloc", and the input section is COMDAT 1942 * that has been assigned to an output section, then 1943 * determine if this is a reference to a discarded 1944 * COMDAT section that can be replaced with a COMDAT 1945 * that has been kept. 1946 */ 1947 if ((ofl->ofl_flags1 & FLG_OF1_RLXREL) && 1948 sdp->sd_isc->is_osdesc && 1949 (sdp->sd_isc->is_flags & FLG_IS_COMDAT) && 1950 ((nsdp = sloppy_comdat_reloc(ofl, reld, 1951 sdp, &reject)) == NULL)) { 1952 Shdr *is_shdr = reld->rel_isdesc->is_shdr; 1953 1954 /* 1955 * A matching symbol was not found. We will 1956 * ignore this relocation. Determine whether 1957 * or not to issue a warning. 1958 * Warnings are always issued under -z verbose, 1959 * but otherwise, we will follow the lead of 1960 * the GNU ld and suppress them for certain 1961 * cases: 1962 * 1963 * - It is a non-allocable debug section. 1964 * The GNU ld tests for these by name, 1965 * but we are willing to extend it to 1966 * any non-allocable section. 1967 * - The target section is excluded from 1968 * sloppy relocations by policy. 1969 */ 1970 if (((ofl->ofl_flags & FLG_OF_VERBOSE) != 0) || 1971 ((is_shdr->sh_flags & SHF_ALLOC) && 1972 (reject != RLXREL_REJ_TARGET))) 1973 eprintf(ofl->ofl_lml, ERR_WARNING, 1974 MSG_INTL(MSG_REL_SLOPCDATNOSYM), 1975 conv_reloc_type( 1976 ifl->ifl_ehdr->e_machine, 1977 reld->rel_rtype, 0, &inv_buf), 1978 ifl->ifl_name, 1979 EC_WORD(isp->is_scnndx), 1980 isp->is_name, 1981 ld_reloc_sym_name(reld), 1982 EC_WORD(sdp->sd_isc->is_scnndx), 1983 sdp->sd_isc->is_name); 1984 return (1); 1985 } 1986 } else if ((sdp != NULL) && sdp->sd_name && *sdp->sd_name) 1987 nsdp = ld_sym_find(sdp->sd_name, SYM_NOHASH, NULL, ofl); 1988 1989 if (nsdp == NULL) { 1990 eprintf(ofl->ofl_lml, ERR_FATAL, 1991 MSG_INTL(MSG_REL_SYMDISC), 1992 conv_reloc_type(ifl->ifl_ehdr->e_machine, 1993 reld->rel_rtype, 0, &inv_buf), ifl->ifl_name, 1994 EC_WORD(isp->is_scnndx), isp->is_name, 1995 ld_reloc_sym_name(reld), 1996 EC_WORD(sdp->sd_isc->is_scnndx), 1997 sdp->sd_isc->is_name); 1998 return (S_ERROR); 1999 } 2000 ifl->ifl_oldndx[rsndx] = sdp = nsdp; 2001 if ((ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION) && 2002 (sdp->sd_isc != NULL) && (sdp->sd_isc->is_name != NULL) && 2003 (sdp->sd_isc->is_sym_name == NULL) && 2004 (ld_stt_section_sym_name(sdp->sd_isc) == NULL)) 2005 return (S_ERROR); 2006 } 2007 2008 /* 2009 * If this is a global symbol, determine whether its visibility needs 2010 * adjusting. 2011 */ 2012 if (sdp->sd_aux && ((sdp->sd_flags & FLG_SY_VISIBLE) == 0)) 2013 ld_sym_adjust_vis(sdp, ofl); 2014 2015 /* 2016 * Ignore any relocation against a section that will not be in the 2017 * output file (has been stripped). 2018 */ 2019 if ((sdp->sd_isc == 0) && 2020 (ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION)) 2021 return (1); 2022 2023 /* 2024 * If the input section exists, but the section has not been associated 2025 * to an output section, then this is a little suspicious. 2026 */ 2027 if (sdp->sd_isc && (sdp->sd_isc->is_osdesc == 0) && 2028 (ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION)) { 2029 eprintf(ofl->ofl_lml, ERR_WARNING, MSG_INTL(MSG_RELINVSEC), 2030 conv_reloc_type(ifl->ifl_ehdr->e_machine, rtype, 2031 0, &inv_buf), ifl->ifl_name, EC_WORD(isp->is_scnndx), 2032 isp->is_name, EC_WORD(sdp->sd_isc->is_scnndx), 2033 sdp->sd_isc->is_name); 2034 return (1); 2035 } 2036 2037 /* 2038 * If the symbol for this relocation is invalid (which should have 2039 * generated a message during symbol processing), or the relocation 2040 * record's symbol reference is in any other way invalid, then it's 2041 * about time we gave up. 2042 */ 2043 if ((sdp->sd_flags & FLG_SY_INVALID) || (rsndx == 0) || 2044 (rsndx >= ifl->ifl_symscnt)) { 2045 eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_REL_UNKNWSYM), 2046 conv_reloc_type(ifl->ifl_ehdr->e_machine, rtype, 2047 0, &inv_buf), ifl->ifl_name, EC_WORD(isp->is_scnndx), 2048 isp->is_name, ld_reloc_sym_name(reld), 2049 EC_XWORD(reloc->r_offset), EC_WORD(rsndx)); 2050 return (S_ERROR); 2051 } 2052 2053 /* 2054 * Size relocations against section symbols are presently unsupported. 2055 * There is a question as to whether the input section size, or output 2056 * section size would be used. Until an explicit requirement is 2057 * established for either case, we'll punt. 2058 */ 2059 if (IS_SIZE(rtype) && 2060 (ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION)) { 2061 eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_REL_UNSUPSIZE), 2062 conv_reloc_type(ifl->ifl_ehdr->e_machine, rtype, 2063 0, &inv_buf), ifl->ifl_name, EC_WORD(isp->is_scnndx), 2064 isp->is_name); 2065 return (S_ERROR); 2066 } 2067 2068 reld->rel_sym = sdp; 2069 if (reld->rel_aux) 2070 reld->rel_aux->ra_usym = sdp; 2071 return (ld_process_sym_reloc(ofl, reld, reloc, isp, isp->is_name, 2072 isp->is_scnndx)); 2073 } 2074 2075 static uintptr_t 2076 reloc_section(Ofl_desc *ofl, Is_desc *isect, Is_desc *rsect, Os_desc *osect) 2077 { 2078 Rel *rend; /* end of relocation section data */ 2079 Rel *reloc; /* current relocation entry */ 2080 Xword rsize; /* size of relocation section data */ 2081 Xword entsize; /* size of relocation entry */ 2082 Rel_desc reld; /* relocation descriptor */ 2083 Rel_aux rel_aux; 2084 Shdr * shdr; 2085 Word flags = 0; 2086 uintptr_t ret = 1; 2087 2088 shdr = rsect->is_shdr; 2089 rsize = shdr->sh_size; 2090 reloc = (Rel *)rsect->is_indata->d_buf; 2091 2092 /* 2093 * Decide entry size. 2094 */ 2095 if (((entsize = shdr->sh_entsize) == 0) || (entsize > rsize)) { 2096 if (shdr->sh_type == SHT_RELA) 2097 entsize = sizeof (Rela); 2098 else 2099 entsize = sizeof (Rel); 2100 } 2101 2102 /* 2103 * Build up the basic information in for the Rel_desc structure. 2104 */ 2105 reld.rel_isdesc = isect; 2106 reld.rel_aux = &rel_aux; 2107 ld_init_rel_aux(&reld); 2108 rel_aux.ra_osdesc = osect; 2109 2110 if ((ofl->ofl_flags & FLG_OF_RELOBJ) || 2111 (osect && (osect->os_sgdesc->sg_phdr.p_type == PT_LOAD))) 2112 flags |= FLG_REL_LOAD; 2113 2114 if (shdr->sh_info == 0) 2115 flags |= FLG_REL_NOINFO; 2116 2117 DBG_CALL(Dbg_reloc_proc(ofl->ofl_lml, osect, isect, rsect)); 2118 2119 for (rend = (Rel *)((uintptr_t)reloc + (uintptr_t)rsize); 2120 reloc < rend; 2121 reloc = (Rel *)((uintptr_t)reloc + (uintptr_t)entsize)) { 2122 Word rsndx; 2123 2124 /* 2125 * Initialize the relocation record information and process 2126 * the individual relocation. Reinitialize the flags to 2127 * insure we don't carry any state over from the previous 2128 * relocation records processing. 2129 */ 2130 reld.rel_flags = flags; 2131 rsndx = (*ld_targ.t_mr.mr_init_rel)(&reld, 2132 &rel_aux.ra_typedata, (void *)reloc); 2133 2134 /* 2135 * Determine whether or not to pass an auxiliary block 2136 * in with this Rel_desc. It is not needed if both the 2137 * osdesc and typedata fields have default values. 2138 */ 2139 reld.rel_aux = 2140 (RELAUX_ISDEFAULT_OSDESC(&reld, rel_aux.ra_osdesc) && 2141 RELAUX_ISDEFAULT_TYPEDATA(&reld, rel_aux.ra_typedata)) ? 2142 NULL : &rel_aux; 2143 2144 if (process_reld(ofl, rsect, &reld, rsndx, reloc) == S_ERROR) 2145 ret = S_ERROR; 2146 } 2147 return (ret); 2148 } 2149 2150 static uintptr_t 2151 reloc_segments(int wr_flag, Ofl_desc *ofl) 2152 { 2153 Aliste idx1; 2154 Sg_desc *sgp; 2155 Is_desc *isp; 2156 2157 for (APLIST_TRAVERSE(ofl->ofl_segs, idx1, sgp)) { 2158 Os_desc *osp; 2159 Aliste idx2; 2160 2161 if ((sgp->sg_phdr.p_flags & PF_W) != wr_flag) 2162 continue; 2163 2164 for (APLIST_TRAVERSE(sgp->sg_osdescs, idx2, osp)) { 2165 Is_desc *risp; 2166 Aliste idx3; 2167 2168 osp->os_szoutrels = 0; 2169 for (APLIST_TRAVERSE(osp->os_relisdescs, idx3, risp)) { 2170 Word indx; 2171 2172 /* 2173 * Determine the input section that this 2174 * relocation information refers to. 2175 */ 2176 indx = risp->is_shdr->sh_info; 2177 isp = risp->is_file->ifl_isdesc[indx]; 2178 2179 /* 2180 * Do not process relocations against sections 2181 * which are being discarded (COMDAT) 2182 */ 2183 if (isp->is_flags & FLG_IS_DISCARD) 2184 continue; 2185 2186 if (reloc_section(ofl, isp, risp, osp) == 2187 S_ERROR) 2188 return (S_ERROR); 2189 } 2190 2191 /* 2192 * Check for relocations against non-writable 2193 * allocatable sections. 2194 */ 2195 if (osp->os_szoutrels && 2196 (sgp->sg_phdr.p_type == PT_LOAD) && 2197 ((sgp->sg_phdr.p_flags & PF_W) == 0)) { 2198 ofl->ofl_flags |= FLG_OF_TEXTREL; 2199 ofl->ofl_dtflags |= DF_TEXTREL; 2200 } 2201 } 2202 } 2203 2204 return (1); 2205 } 2206 2207 /* 2208 * Move Section related function 2209 * Get move entry 2210 */ 2211 static Move * 2212 get_move_entry(Is_desc *rsect, Xword roffset) 2213 { 2214 Ifl_desc *ifile = rsect->is_file; 2215 Shdr *rshdr = rsect->is_shdr; 2216 Is_desc *misp; 2217 Shdr *mshdr; 2218 Xword midx; 2219 Move *mvp; 2220 2221 /* 2222 * Set info for the target move section 2223 */ 2224 misp = ifile->ifl_isdesc[rshdr->sh_info]; 2225 mshdr = misp->is_shdr; 2226 2227 if (mshdr->sh_entsize == 0) 2228 return (NULL); 2229 2230 /* 2231 * If this is an invalid entry, return NULL. 2232 */ 2233 midx = roffset / mshdr->sh_entsize; 2234 if ((midx * mshdr->sh_entsize) >= mshdr->sh_size) 2235 return (NULL); 2236 2237 mvp = (Move *)misp->is_indata->d_buf; 2238 mvp += midx; 2239 return (mvp); 2240 } 2241 2242 /* 2243 * Relocation against Move Table. 2244 */ 2245 static uintptr_t 2246 process_movereloc(Ofl_desc *ofl, Is_desc *rsect) 2247 { 2248 Ifl_desc *file = rsect->is_file; 2249 Rel *rend, *reloc; 2250 Xword rsize, entsize; 2251 Rel_desc reld; 2252 Rel_aux rel_aux; 2253 2254 rsize = rsect->is_shdr->sh_size; 2255 reloc = (Rel *)rsect->is_indata->d_buf; 2256 2257 /* 2258 * Decide entry size. 2259 */ 2260 entsize = rsect->is_shdr->sh_entsize; 2261 if ((entsize == 0) || 2262 (entsize > rsect->is_shdr->sh_size)) { 2263 if (rsect->is_shdr->sh_type == SHT_RELA) 2264 entsize = sizeof (Rela); 2265 else 2266 entsize = sizeof (Rel); 2267 } 2268 2269 /* 2270 * The requirement for move data ensures that we have to supply a 2271 * Rel_aux auxiliary block. 2272 */ 2273 reld.rel_aux = &rel_aux; 2274 ld_init_rel_aux(&reld); 2275 2276 /* 2277 * Go through the relocation entries. 2278 */ 2279 for (rend = (Rel *)((uintptr_t)reloc + (uintptr_t)rsize); 2280 reloc < rend; 2281 reloc = (Rel *)((uintptr_t)reloc + (uintptr_t)entsize)) { 2282 Sym_desc *psdp; 2283 Move *mvp; 2284 Word rsndx; 2285 2286 /* 2287 * Initialize the relocation record information. 2288 */ 2289 reld.rel_flags = FLG_REL_LOAD; 2290 rsndx = (*ld_targ.t_mr.mr_init_rel)(&reld, 2291 &rel_aux.ra_typedata, (void *)reloc); 2292 2293 if (((mvp = get_move_entry(rsect, reloc->r_offset)) == NULL) || 2294 ((rel_aux.ra_move = 2295 libld_malloc(sizeof (Mv_reloc))) == NULL)) 2296 return (S_ERROR); 2297 2298 psdp = file->ifl_oldndx[ELF_M_SYM(mvp->m_info)]; 2299 rel_aux.ra_move->mr_move = mvp; 2300 rel_aux.ra_move->mr_sym = psdp; 2301 2302 if (psdp->sd_flags & FLG_SY_PAREXPN) { 2303 int _num, num = mvp->m_repeat; 2304 2305 rel_aux.ra_osdesc = ofl->ofl_isparexpn->is_osdesc; 2306 reld.rel_isdesc = ofl->ofl_isparexpn; 2307 reld.rel_roffset = mvp->m_poffset; 2308 2309 for (_num = 0; _num < num; _num++) { 2310 reld.rel_roffset += 2311 /* LINTED */ 2312 (_num * ELF_M_SIZE(mvp->m_info)); 2313 2314 /* 2315 * Generate Reld 2316 */ 2317 if (process_reld(ofl, 2318 rsect, &reld, rsndx, reloc) == S_ERROR) 2319 return (S_ERROR); 2320 } 2321 } else { 2322 /* 2323 * Generate Reld 2324 */ 2325 reld.rel_flags |= FLG_REL_MOVETAB; 2326 rel_aux.ra_osdesc = ofl->ofl_osmove; 2327 reld.rel_isdesc = ld_os_first_isdesc(ofl->ofl_osmove); 2328 2329 if (process_reld(ofl, 2330 rsect, &reld, rsndx, reloc) == S_ERROR) 2331 return (S_ERROR); 2332 } 2333 } 2334 return (1); 2335 } 2336 2337 /* 2338 * This function is similar to reloc_init(). 2339 * 2340 * This function is called when the SHT_SUNW_move table is expanded and there 2341 * are relocations against the SHT_SUNW_move section. 2342 */ 2343 static uintptr_t 2344 reloc_movesections(Ofl_desc *ofl) 2345 { 2346 Aliste idx; 2347 Is_desc *risp; 2348 uintptr_t ret = 1; 2349 2350 /* 2351 * Generate/Expand relocation entries 2352 */ 2353 for (APLIST_TRAVERSE(ofl->ofl_ismoverel, idx, risp)) { 2354 if (process_movereloc(ofl, risp) == S_ERROR) 2355 ret = S_ERROR; 2356 } 2357 2358 return (ret); 2359 } 2360 2361 /* 2362 * Count the number of output relocation entries, global offset table entries, 2363 * and procedure linkage table entries. This function searches the segment and 2364 * outsect lists and passes each input reloc section to process_reloc(). 2365 * It allocates space for any output relocations needed. And builds up 2366 * the relocation structures for later processing. 2367 */ 2368 uintptr_t 2369 ld_reloc_init(Ofl_desc *ofl) 2370 { 2371 Aliste idx; 2372 Is_desc *isp; 2373 Sym_desc *sdp; 2374 2375 DBG_CALL(Dbg_basic_collect(ofl->ofl_lml)); 2376 2377 /* 2378 * At this point we have finished processing all input symbols. Make 2379 * sure we add any absolute (internal) symbols before continuing with 2380 * any relocation processing. 2381 */ 2382 if (ld_sym_spec(ofl) == S_ERROR) 2383 return (S_ERROR); 2384 2385 ofl->ofl_gotcnt = ld_targ.t_m.m_got_xnumber; 2386 2387 /* 2388 * Process all of the relocations against NON-writable segments 2389 * followed by relocations against the writable segments. 2390 * 2391 * This separation is so that when the writable segments are processed 2392 * we know whether or not a COPYRELOC will be produced for any symbols. 2393 * If relocations aren't processed in this order, a COPYRELOC and a 2394 * regular relocation can be produced against the same symbol. The 2395 * regular relocation would be redundant. 2396 */ 2397 if (reloc_segments(0, ofl) == S_ERROR) 2398 return (S_ERROR); 2399 2400 if (reloc_segments(PF_W, ofl) == S_ERROR) 2401 return (S_ERROR); 2402 2403 /* 2404 * Process any extra relocations. These are relocation sections that 2405 * have a NULL sh_info. 2406 */ 2407 for (APLIST_TRAVERSE(ofl->ofl_extrarels, idx, isp)) { 2408 if (reloc_section(ofl, NULL, isp, NULL) == S_ERROR) 2409 return (S_ERROR); 2410 } 2411 2412 /* 2413 * If there were relocation against move table, 2414 * process the relocation sections. 2415 */ 2416 if (reloc_movesections(ofl) == S_ERROR) 2417 return (S_ERROR); 2418 2419 /* 2420 * Now all the relocations are pre-processed, 2421 * check the validity of copy relocations. 2422 */ 2423 if (ofl->ofl_copyrels) { 2424 Copy_rel *crp; 2425 2426 for (ALIST_TRAVERSE(ofl->ofl_copyrels, idx, crp)) { 2427 /* 2428 * If there were no displacement relocation 2429 * in this file, don't worry about it. 2430 */ 2431 if (crp->c_sdp->sd_file->ifl_flags & 2432 (FLG_IF_DISPPEND | FLG_IF_DISPDONE)) 2433 is_disp_copied(ofl, crp); 2434 } 2435 } 2436 2437 /* 2438 * GOT sections are created for dynamic executables and shared objects 2439 * if the FLG_OF_BLDGOT is set, or explicit reference has been made to 2440 * a GOT symbol. 2441 */ 2442 if (((ofl->ofl_flags & FLG_OF_RELOBJ) == 0) && 2443 ((ofl->ofl_flags & FLG_OF_BLDGOT) || 2444 ((((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_GOFTBL), 2445 SYM_NOHASH, NULL, ofl)) != NULL) || 2446 ((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_GOFTBL_U), 2447 SYM_NOHASH, NULL, ofl)) != NULL)) && 2448 (sdp->sd_ref != REF_DYN_SEEN)))) { 2449 if (ld_make_got(ofl) == S_ERROR) 2450 return (S_ERROR); 2451 2452 /* Allocate the GOT if required by target */ 2453 if ((ld_targ.t_mr.mr_allocate_got != NULL) && 2454 ((*ld_targ.t_mr.mr_allocate_got)(ofl) == S_ERROR)) 2455 return (S_ERROR); 2456 } 2457 2458 return (1); 2459 } 2460 2461 /* 2462 * Simple comparison routine to be used by qsort() for 2463 * the sorting of the output relocation list. 2464 * 2465 * The reloc_compare() routine results in a relocation 2466 * table which is located on: 2467 * 2468 * file referenced (NEEDED NDX) 2469 * referenced symbol 2470 * relocation offset 2471 * 2472 * This provides the most efficient traversal of the relocation 2473 * table at run-time. 2474 */ 2475 static int 2476 reloc_compare(Reloc_list *i, Reloc_list *j) 2477 { 2478 2479 /* 2480 * first - sort on neededndx 2481 */ 2482 if (i->rl_key1 > j->rl_key1) 2483 return (1); 2484 if (i->rl_key1 < j->rl_key1) 2485 return (-1); 2486 2487 /* 2488 * Then sort on symbol 2489 */ 2490 if ((uintptr_t)i->rl_key2 > (uintptr_t)j->rl_key2) 2491 return (1); 2492 if ((uintptr_t)i->rl_key2 < (uintptr_t)j->rl_key2) 2493 return (-1); 2494 2495 /* 2496 * i->key2 == j->key2 2497 * 2498 * At this point we fall back to key2 (offsets) to 2499 * sort the output relocations. Ideally this will 2500 * make for the most efficient processing of these 2501 * relocations at run-time. 2502 */ 2503 if (i->rl_key3 > j->rl_key3) 2504 return (1); 2505 if (i->rl_key3 < j->rl_key3) 2506 return (-1); 2507 return (0); 2508 } 2509 2510 static uintptr_t 2511 do_sorted_outrelocs(Ofl_desc *ofl) 2512 { 2513 Rel_desc *orsp; 2514 Rel_cachebuf *rcbp; 2515 Aliste idx; 2516 Reloc_list *sorted_list; 2517 Word index = 0; 2518 int debug = 0; 2519 uintptr_t error = 1; 2520 2521 if ((sorted_list = libld_malloc((size_t)(sizeof (Reloc_list) * 2522 ofl->ofl_reloccnt))) == NULL) 2523 return (S_ERROR); 2524 2525 /* 2526 * All but the PLT output relocations are sorted in the output file 2527 * based upon their sym_desc. By doing this multiple relocations 2528 * against the same symbol are grouped together, thus when the object 2529 * is later relocated by ld.so.1 it will take advantage of the symbol 2530 * cache that ld.so.1 has. This can significantly reduce the runtime 2531 * relocation cost of a dynamic object. 2532 * 2533 * PLT relocations are not sorted because the order of the PLT 2534 * relocations is used by ld.so.1 to determine what symbol a PLT 2535 * relocation is against. 2536 */ 2537 REL_CACHE_TRAVERSE(&ofl->ofl_outrels, idx, rcbp, orsp) { 2538 if (debug == 0) { 2539 DBG_CALL(Dbg_reloc_dooutrel(ofl->ofl_lml, 2540 ld_targ.t_m.m_rel_sht_type)); 2541 debug = 1; 2542 } 2543 2544 /* 2545 * If it's a PLT relocation we output it now in the 2546 * order that it was originally processed. 2547 */ 2548 if (orsp->rel_flags & FLG_REL_PLT) { 2549 if ((*ld_targ.t_mr.mr_perform_outreloc)(orsp, ofl) == 2550 S_ERROR) 2551 error = S_ERROR; 2552 continue; 2553 } 2554 2555 if ((orsp->rel_rtype == ld_targ.t_m.m_r_relative) || 2556 (orsp->rel_rtype == ld_targ.t_m.m_r_register)) { 2557 sorted_list[index].rl_key1 = 0; 2558 sorted_list[index].rl_key2 = 2559 /* LINTED */ 2560 (Sym_desc *)(uintptr_t)orsp->rel_rtype; 2561 } else { 2562 sorted_list[index].rl_key1 = 2563 orsp->rel_sym->sd_file->ifl_neededndx; 2564 sorted_list[index].rl_key2 = orsp->rel_sym; 2565 } 2566 2567 if (orsp->rel_flags & FLG_REL_GOT) { 2568 sorted_list[index].rl_key3 = 2569 (*ld_targ.t_mr.mr_calc_got_offset)(orsp, ofl); 2570 } else { 2571 if (orsp->rel_rtype == ld_targ.t_m.m_r_register) { 2572 sorted_list[index].rl_key3 = 0; 2573 } else { 2574 sorted_list[index].rl_key3 = orsp->rel_roffset + 2575 (Xword)_elf_getxoff(orsp-> 2576 rel_isdesc->is_indata) + 2577 orsp->rel_isdesc->is_osdesc-> 2578 os_shdr->sh_addr; 2579 } 2580 } 2581 2582 sorted_list[index++].rl_rsp = orsp; 2583 } 2584 2585 qsort(sorted_list, (size_t)ofl->ofl_reloccnt, sizeof (Reloc_list), 2586 (int (*)(const void *, const void *))reloc_compare); 2587 2588 /* 2589 * All output relocations have now been sorted, go through 2590 * and process each relocation. 2591 */ 2592 for (index = 0; index < ofl->ofl_reloccnt; index++) { 2593 if ((*ld_targ.t_mr.mr_perform_outreloc) 2594 (sorted_list[index].rl_rsp, ofl) == S_ERROR) 2595 error = S_ERROR; 2596 } 2597 2598 return (error); 2599 } 2600 2601 /* 2602 * Process relocations. Finds every input relocation section for each output 2603 * section and invokes reloc_section() to relocate that section. 2604 */ 2605 uintptr_t 2606 ld_reloc_process(Ofl_desc *ofl) 2607 { 2608 Sg_desc *sgp; 2609 Os_desc *osp; 2610 Word ndx = 0; 2611 ofl_flag_t flags = ofl->ofl_flags; 2612 Shdr *shdr; 2613 2614 DBG_CALL(Dbg_basic_relocate(ofl->ofl_lml)); 2615 2616 /* 2617 * Determine the index of the symbol table that will be referenced by 2618 * the relocation entries. 2619 */ 2620 if (OFL_ALLOW_DYNSYM(ofl)) 2621 /* LINTED */ 2622 ndx = (Word)elf_ndxscn(ofl->ofl_osdynsym->os_scn); 2623 else if (!(flags & FLG_OF_STRIP) || (flags & FLG_OF_RELOBJ)) 2624 /* LINTED */ 2625 ndx = (Word)elf_ndxscn(ofl->ofl_ossymtab->os_scn); 2626 2627 /* 2628 * Re-initialize counters. These are used to provide relocation 2629 * offsets within the output buffers. 2630 */ 2631 ofl->ofl_relocpltsz = 0; 2632 ofl->ofl_relocgotsz = 0; 2633 ofl->ofl_relocbsssz = 0; 2634 2635 /* 2636 * Now that the output file is created and symbol update has occurred, 2637 * process the relocations collected in process_reloc(). 2638 */ 2639 if (do_sorted_outrelocs(ofl) == S_ERROR) 2640 return (S_ERROR); 2641 2642 if ((*ld_targ.t_mr.mr_do_activerelocs)(ofl) == S_ERROR) 2643 return (S_ERROR); 2644 2645 if ((flags & FLG_OF_COMREL) == 0) { 2646 Aliste idx1; 2647 2648 /* 2649 * Process the relocation sections. For each relocation 2650 * section generated for the output image update its shdr 2651 * information to reflect the symbol table it needs (sh_link) 2652 * and the section to which the relocation must be applied 2653 * (sh_info). 2654 */ 2655 for (APLIST_TRAVERSE(ofl->ofl_segs, idx1, sgp)) { 2656 Os_desc *osp; 2657 Aliste idx2; 2658 2659 for (APLIST_TRAVERSE(sgp->sg_osdescs, idx2, osp)) { 2660 if (osp->os_relosdesc == 0) 2661 continue; 2662 2663 shdr = osp->os_relosdesc->os_shdr; 2664 shdr->sh_link = ndx; 2665 /* LINTED */ 2666 shdr->sh_info = (Word)elf_ndxscn(osp->os_scn); 2667 } 2668 } 2669 2670 /* 2671 * Since the .rel[a] section is not tied to any specific 2672 * section, we'd not have found it above. 2673 */ 2674 if ((osp = ofl->ofl_osrel) != NULL) { 2675 shdr = osp->os_shdr; 2676 shdr->sh_link = ndx; 2677 shdr->sh_info = 0; 2678 } 2679 } else { 2680 /* 2681 * We only have two relocation sections here, (PLT's, 2682 * coalesced) so just hit them directly instead of stepping 2683 * over the output sections. 2684 */ 2685 if ((osp = ofl->ofl_osrelhead) != NULL) { 2686 shdr = osp->os_shdr; 2687 shdr->sh_link = ndx; 2688 shdr->sh_info = 0; 2689 } 2690 if (((osp = ofl->ofl_osplt) != NULL) && osp->os_relosdesc) { 2691 shdr = osp->os_relosdesc->os_shdr; 2692 shdr->sh_link = ndx; 2693 /* LINTED */ 2694 shdr->sh_info = (Word)elf_ndxscn(osp->os_scn); 2695 } 2696 } 2697 2698 /* 2699 * If the -z text option was given, and we have output relocations 2700 * against a non-writable, allocatable section, issue a diagnostic and 2701 * return (the actual entries that caused this error would have been 2702 * output during the relocating section phase). 2703 */ 2704 if ((flags & (FLG_OF_PURETXT | FLG_OF_TEXTREL)) == 2705 (FLG_OF_PURETXT | FLG_OF_TEXTREL)) { 2706 eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_REL_REMAIN_3)); 2707 return (S_ERROR); 2708 } 2709 2710 /* 2711 * Finally, initialize the first got entry with the address of the 2712 * .dynamic section (_DYNAMIC). 2713 */ 2714 if (flags & FLG_OF_DYNAMIC) { 2715 if ((*ld_targ.t_mr.mr_fillin_gotplt)(ofl) == S_ERROR) 2716 return (S_ERROR); 2717 } 2718 2719 /* 2720 * Now that any GOT information has been written, display the debugging 2721 * information if required. 2722 */ 2723 if ((osp = ofl->ofl_osgot) != NULL) 2724 DBG_CALL(Dbg_got_display(ofl, osp->os_shdr->sh_addr, 1, 2725 ld_targ.t_m.m_got_xnumber, ld_targ.t_m.m_got_entsize)); 2726 2727 return (1); 2728 } 2729 2730 /* 2731 * If the -z text option was given, and we have output relocations against a 2732 * non-writable, allocatable section, issue a diagnostic. Print offending 2733 * symbols in tabular form similar to the way undefined symbols are presented. 2734 * Called from reloc_count(). The actual fatal error condition is triggered on 2735 * in reloc_process() above. 2736 * 2737 * Note. For historic reasons -ztext is not a default option (however all OS 2738 * shared object builds use this option). It can be argued that this option 2739 * should also be default when generating an a.out (see 1163979). However, if 2740 * an a.out contains text relocations it is either because the user is creating 2741 * something pretty weird (they've used the -b or -znodefs options), or because 2742 * the library against which they're building wasn't constructed correctly (ie. 2743 * a function has a NOTYPE type, in which case the a.out won't generate an 2744 * associated plt). In the latter case the builder of the a.out can't do 2745 * anything to fix the error - thus we've chosen not to give the user an error, 2746 * or warning, for this case. 2747 */ 2748 static void 2749 reloc_remain_title(Ofl_desc *ofl, int warning) 2750 { 2751 const char *str1; 2752 2753 if (warning) 2754 str1 = MSG_INTL(MSG_REL_RMN_ITM_13); 2755 else 2756 str1 = MSG_INTL(MSG_REL_RMN_ITM_11); 2757 2758 eprintf(ofl->ofl_lml, ERR_NONE, MSG_INTL(MSG_REL_REMAIN_FMT_1), str1, 2759 MSG_INTL(MSG_REL_RMN_ITM_31), MSG_INTL(MSG_REL_RMN_ITM_12), 2760 MSG_INTL(MSG_REL_RMN_ITM_2), MSG_INTL(MSG_REL_RMN_ITM_32)); 2761 } 2762 2763 void 2764 ld_reloc_remain_entry(Rel_desc *orsp, Os_desc *osp, Ofl_desc *ofl) 2765 { 2766 static Boolean reloc_title = TRUE; 2767 2768 /* 2769 * -ztextoff 2770 */ 2771 if (ofl->ofl_flags1 & FLG_OF1_TEXTOFF) 2772 return; 2773 2774 /* 2775 * Only give relocation errors against loadable read-only segments. 2776 */ 2777 if ((orsp->rel_rtype == ld_targ.t_m.m_r_register) || (!osp) || 2778 (osp->os_sgdesc->sg_phdr.p_type != PT_LOAD) || 2779 (osp->os_sgdesc->sg_phdr.p_flags & PF_W)) 2780 return; 2781 2782 /* 2783 * If we are in -ztextwarn mode, it's a silent error if a relocation is 2784 * due to a 'WEAK REFERENCE'. This is because if the symbol is not 2785 * provided at run-time we will not perform a text-relocation. 2786 */ 2787 if (((ofl->ofl_flags & FLG_OF_PURETXT) == 0) && 2788 (ELF_ST_BIND(orsp->rel_sym->sd_sym->st_info) == STB_WEAK) && 2789 (orsp->rel_sym->sd_sym->st_shndx == SHN_UNDEF)) 2790 return; 2791 2792 if (reloc_title) { 2793 /* 2794 * If building with '-ztext' then emit a fatal error. If 2795 * building a executable then only emit a 'warning'. 2796 */ 2797 if (ofl->ofl_flags & FLG_OF_PURETXT) 2798 reloc_remain_title(ofl, 0); 2799 else 2800 reloc_remain_title(ofl, 1); 2801 reloc_title = FALSE; 2802 } 2803 2804 eprintf(ofl->ofl_lml, ERR_NONE, MSG_INTL(MSG_REL_REMAIN_2), 2805 ld_reloc_sym_name(orsp), EC_OFF(orsp->rel_roffset), 2806 orsp->rel_isdesc->is_file->ifl_name); 2807 } 2808 2809 /* 2810 * Generic encapsulation for generating a TLS got index. 2811 */ 2812 uintptr_t 2813 ld_assign_got_TLS(Boolean local, Rel_desc *rsp, Ofl_desc *ofl, Sym_desc *sdp, 2814 Gotndx *gnp, Gotref gref, Word rflag, Word ortype, Word rtype1, Word rtype2) 2815 { 2816 Word rflags; 2817 2818 if ((*ld_targ.t_mr.mr_assign_got_ndx)(&(sdp->sd_GOTndxs), gnp, 2819 gref, ofl, rsp, sdp) == S_ERROR) 2820 return (S_ERROR); 2821 2822 rflags = FLG_REL_GOT | rflag; 2823 if (local) 2824 rflags |= FLG_REL_SCNNDX; 2825 rsp->rel_rtype = rtype1; 2826 2827 if ((*ld_targ.t_mr.mr_add_outrel)(rflags, rsp, ofl) == S_ERROR) 2828 return (S_ERROR); 2829 2830 if (local && (gref == GOT_REF_TLSIE)) { 2831 /* 2832 * If this is a local LE TLS symbol, then the symbol won't be 2833 * available at runtime. The value of the local symbol will 2834 * be placed in the associated got entry, and the got 2835 * relocation is reassigned to a section symbol. 2836 */ 2837 if (ld_add_actrel(rflags, rsp, ofl) == S_ERROR) 2838 return (S_ERROR); 2839 } 2840 2841 if (rtype2) { 2842 rflags = FLG_REL_GOT | rflag; 2843 rsp->rel_rtype = rtype2; 2844 2845 if (local) { 2846 if (ld_add_actrel(rflags, rsp, ofl) == S_ERROR) 2847 return (S_ERROR); 2848 } else { 2849 if ((*ld_targ.t_mr.mr_add_outrel)(rflags, rsp, ofl) == 2850 S_ERROR) 2851 return (S_ERROR); 2852 } 2853 } 2854 2855 rsp->rel_rtype = ortype; 2856 2857 return (1); 2858 } 2859 2860 /* 2861 * Move Section related function 2862 */ 2863 static void 2864 newroffset_for_move(Sym_desc *sdp, Move *mvp, Xword offset1, Xword *offset2) 2865 { 2866 Mv_desc *mdp; 2867 Aliste idx; 2868 2869 /* 2870 * Search for matching move entry. 2871 */ 2872 for (ALIST_TRAVERSE(sdp->sd_move, idx, mdp)) { 2873 if (mdp->md_move == mvp) { 2874 /* 2875 * Update r_offset 2876 */ 2877 *offset2 = (Xword)((mdp->md_oidx - 1) * sizeof (Move) + 2878 offset1 % sizeof (Move)); 2879 return; 2880 } 2881 } 2882 } 2883 2884 void 2885 ld_adj_movereloc(Ofl_desc *ofl, Rel_desc *arsp) 2886 { 2887 Move *move = arsp->rel_aux->ra_move->mr_move; 2888 Sym_desc *psdp = arsp->rel_aux->ra_move->mr_sym; 2889 Xword newoffset; 2890 2891 if (arsp->rel_flags & FLG_REL_MOVETAB) { 2892 /* 2893 * We are relocating the move table itself. 2894 */ 2895 newroffset_for_move(psdp, move, arsp->rel_roffset, 2896 &newoffset); 2897 DBG_CALL(Dbg_move_adjmovereloc(ofl->ofl_lml, arsp->rel_roffset, 2898 newoffset, psdp->sd_name)); 2899 arsp->rel_roffset = newoffset; 2900 } else { 2901 /* 2902 * We are expanding the partial symbol. So we are generating 2903 * the relocation entry relocating the expanded partial symbol. 2904 */ 2905 arsp->rel_roffset += psdp->sd_sym->st_value - 2906 ofl->ofl_isparexpn->is_osdesc->os_shdr->sh_addr; 2907 DBG_CALL(Dbg_move_adjexpandreloc(ofl->ofl_lml, 2908 arsp->rel_roffset, psdp->sd_name)); 2909 } 2910 } 2911 2912 /* 2913 * Partially Initialized Symbol Handling routines 2914 * For RELA architecture, the second argument is reld->rel_raddend. For REL 2915 * architecure, the second argument is the value stored at the relocation 2916 * target address. 2917 */ 2918 Sym_desc * 2919 ld_am_I_partial(Rel_desc *reld, Xword val) 2920 { 2921 Ifl_desc *ifile = reld->rel_sym->sd_isc->is_file; 2922 int nlocs = ifile->ifl_locscnt, i; 2923 2924 for (i = 1; i < nlocs; i++) { 2925 Sym *osym; 2926 Sym_desc *symd = ifile->ifl_oldndx[i]; 2927 2928 if ((osym = symd->sd_osym) == 0) 2929 continue; 2930 if ((symd->sd_flags & FLG_SY_PAREXPN) == 0) 2931 continue; 2932 if ((osym->st_value <= val) && 2933 (osym->st_value + osym->st_size > val)) 2934 return (symd); 2935 } 2936 return (NULL); 2937 } 2938 2939 /* 2940 * Return True (1) if the code processing the given relocation 2941 * needs to perform byte swapping when accessing the section data. 2942 */ 2943 int 2944 ld_swap_reloc_data(Ofl_desc *ofl, Rel_desc *rsp) 2945 { 2946 /* 2947 * In a cross-link situation where the linker host and target 2948 * have opposite byte orders, it can be necessary to swap bytes 2949 * when doing relocation processing. This is indicated by the 2950 * presence of the FLG_OF1_ENCDIFF flag bit. However, swapping 2951 * is only needed for the section types that libelf doesn't 2952 * automatically xlate. 2953 */ 2954 if ((ofl->ofl_flags1 & FLG_OF1_ENCDIFF) != 0) { 2955 switch (RELAUX_GET_OSDESC(rsp)->os_shdr->sh_type) { 2956 case SHT_PROGBITS: 2957 return (1); 2958 2959 case SHT_SPARC_GOTDATA: 2960 if (ld_targ.t_m.m_mach == 2961 LD_TARG_BYCLASS(EM_SPARC, EM_SPARCV9)) 2962 return (1); 2963 break; 2964 2965 case SHT_AMD64_UNWIND: 2966 if (ld_targ.t_m.m_mach == EM_AMD64) 2967 return (1); 2968 break; 2969 } 2970 } 2971 2972 /* 2973 * If FLG_OF1_ENCDIFF isn't set, or the section isn't 2974 * progbits (or similar), then no swapping is needed. 2975 */ 2976 return (0); 2977 } 2978 2979 2980 2981 /* 2982 * Obtain the current value at the given relocation target. 2983 * 2984 * entry: 2985 * ofl - Output file descriptor 2986 * rsp - Relocation record 2987 * data - Pointer to relocation target 2988 * value - Address of variable to recieve value 2989 * 2990 * exit: 2991 * The value of the data at the relocation target has 2992 * been stored in value. 2993 */ 2994 int 2995 ld_reloc_targval_get(Ofl_desc *ofl, Rel_desc *rsp, uchar_t *data, Xword *value) 2996 { 2997 const Rel_entry *rep; 2998 2999 rep = &ld_targ.t_mr.mr_reloc_table[rsp->rel_rtype]; 3000 3001 switch (rep->re_fsize) { 3002 case 1: 3003 /* LINTED */ 3004 *value = (Xword) *((uchar_t *)data); 3005 break; 3006 case 2: 3007 { 3008 Half v; 3009 uchar_t *v_bytes = (uchar_t *)&v; 3010 3011 if (OFL_SWAP_RELOC_DATA(ofl, rsp)) { 3012 UL_ASSIGN_BSWAP_HALF(v_bytes, data); 3013 } else { 3014 UL_ASSIGN_HALF(v_bytes, data); 3015 } 3016 *value = (Xword) v; 3017 } 3018 break; 3019 case 4: 3020 { 3021 Word v; 3022 uchar_t *v_bytes = (uchar_t *)&v; 3023 3024 if (OFL_SWAP_RELOC_DATA(ofl, rsp)) { 3025 UL_ASSIGN_BSWAP_WORD(v_bytes, data); 3026 } else { 3027 UL_ASSIGN_WORD(v_bytes, data); 3028 } 3029 *value = (Xword) v; 3030 } 3031 break; 3032 default: 3033 { 3034 Conv_inv_buf_t inv_buf; 3035 eprintf(ofl->ofl_lml, ERR_FATAL, 3036 MSG_INTL(MSG_REL_UNSUPSZ), 3037 conv_reloc_type(ld_targ.t_m.m_mach, rsp->rel_rtype, 3038 0, &inv_buf), rsp->rel_isdesc->is_file->ifl_name, 3039 ld_reloc_sym_name(rsp), (int)rep->re_fsize); 3040 } 3041 return (0); 3042 } 3043 return (1); 3044 } 3045 3046 3047 /* 3048 * Set the value at the given relocation target. 3049 * 3050 * entry: 3051 * ofl - Output file descriptor 3052 * rsp - Relocation record 3053 * data - Pointer to relocation target 3054 * value - Address of variable to recieve value 3055 * 3056 * exit: 3057 * The value of the data at the relocation target has 3058 * been stored in value. 3059 */ 3060 int 3061 ld_reloc_targval_set(Ofl_desc *ofl, Rel_desc *rsp, uchar_t *data, Xword value) 3062 { 3063 const Rel_entry *rep; 3064 3065 rep = &ld_targ.t_mr.mr_reloc_table[rsp->rel_rtype]; 3066 3067 switch (rep->re_fsize) { 3068 case 1: 3069 /* LINTED */ 3070 *((uchar_t *)data) = (uchar_t)value; 3071 break; 3072 case 2: 3073 { 3074 Half v = (Half)value; 3075 uchar_t *v_bytes = (uchar_t *)&v; 3076 3077 if (OFL_SWAP_RELOC_DATA(ofl, rsp)) { 3078 UL_ASSIGN_BSWAP_HALF(data, v_bytes); 3079 } else { 3080 UL_ASSIGN_HALF(data, v_bytes); 3081 } 3082 } 3083 break; 3084 case 4: 3085 { 3086 Word v = (Word)value; 3087 uchar_t *v_bytes = (uchar_t *)&v; 3088 3089 if (OFL_SWAP_RELOC_DATA(ofl, rsp)) { 3090 UL_ASSIGN_BSWAP_WORD(data, v_bytes); 3091 } else { 3092 UL_ASSIGN_WORD(data, v_bytes); 3093 } 3094 } 3095 break; 3096 default: 3097 { 3098 Conv_inv_buf_t inv_buf; 3099 eprintf(ofl->ofl_lml, ERR_FATAL, 3100 MSG_INTL(MSG_REL_UNSUPSZ), 3101 conv_reloc_type(ld_targ.t_m.m_mach, rsp->rel_rtype, 3102 0, &inv_buf), rsp->rel_isdesc->is_file->ifl_name, 3103 ld_reloc_sym_name(rsp), (int)rep->re_fsize); 3104 } 3105 return (0); 3106 } 3107 return (1); 3108 } 3109 3110 3111 /* 3112 * Because of the combinations of 32-bit lib providing 64-bit support, and 3113 * visa-versa, the use of krtld's dorelocs can result in differing message 3114 * requirements that make msg.c/msg.h creation and chkmsg "interesting". 3115 * Thus the actual message files contain a couple of entries to satisfy 3116 * each architectures build. Here we add dummy calls to quieten chkmsg. 3117 * 3118 * chkmsg: MSG_INTL(MSG_REL_NOFIT) 3119 * chkmsg: MSG_INTL(MSG_REL_NONALIGN) 3120 */ 3121