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.
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.
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]
23 * Copyright (c) 1988 AT&T
26 * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
30 * set-up for relocations
33 #define ELF_TARGET_AMD64
34 #define ELF_TARGET_SPARC
44 * Set up the relocation table flag test macros so that they use the
45 * relocation table for the current target machine.
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)
75 * Structure to hold copy relocation items.
77 typedef struct copy_rel
{
78 Sym_desc
*c_sdp
; /* symbol descriptor to be copied */
79 Addr c_val
; /* original symbol value */
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.
88 * The first and the second are serious errors.
91 is_disp_copied(Ofl_desc
*ofl
, Copy_rel
*crp
)
93 Ifl_desc
*ifl
= crp
->c_sdp
->sd_file
;
94 Sym_desc
*sdp
= crp
->c_sdp
;
95 Addr symaddr
= crp
->c_val
;
98 Conv_inv_buf_t inv_buf
;
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.
105 if ((ifl
->ifl_flags
& FLG_IF_DISPDONE
) &&
106 (ofl
->ofl_flags
& FLG_OF_VERBOSE
))
107 ld_eprintf(ofl
, 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
));
112 if ((ifl
->ifl_flags
& FLG_IF_DISPPEND
) == 0)
116 * Traverse the input relocation sections.
118 for (APLIST_TRAVERSE(ifl
->ifl_relsect
, idx
, irel
)) {
122 Xword rsize
, entsize
;
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
;
132 if ((entsize
== 0) || (entsize
> rsize
)) {
133 if (irel
->is_shdr
->sh_type
== SHT_RELA
)
134 entsize
= sizeof (Rela
);
136 entsize
= sizeof (Rel
);
140 * Traverse the relocation entries.
142 for (rend
= (Rel
*)((uintptr_t)reloc
+ (uintptr_t)rsize
);
144 reloc
= (Rel
*)((uintptr_t)reloc
+ (uintptr_t)entsize
)) {
148 if (IS_PC_RELATIVE(ELF_R_TYPE(reloc
->r_info
,
149 ld_targ
.t_m
.m_mach
)) == 0)
153 * Determine if symbol is referenced from a relocation.
155 rstndx
= (Word
) ELF_R_SYM(reloc
->r_info
);
156 rsdp
= ifl
->ifl_oldndx
[rstndx
];
158 if ((str
= demangle(rsdp
->sd_name
)) !=
160 char *_str
= alloca(strlen(str
) + 1);
161 (void) strcpy(_str
, str
);
162 str
= (const char *)_str
;
164 ld_eprintf(ofl
, ERR_WARNING
,
165 MSG_INTL(MSG_REL_DISPREL1
),
166 conv_reloc_type(ifl
->ifl_ehdr
->e_machine
,
167 (uint_t
)ELF_R_TYPE(reloc
->r_info
,
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
));
176 * Determine whether the relocation entry is relocating
179 if ((sdp
->sd_isc
!= trel
) ||
180 (reloc
->r_offset
< symaddr
) ||
182 (symaddr
+ sdp
->sd_sym
->st_size
)))
186 * This symbol is truely *disp* relocated, so should
187 * really be fixed by user.
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
;
194 ld_eprintf(ofl
, ERR_WARNING
, MSG_INTL(MSG_REL_DISPREL1
),
195 conv_reloc_type(ifl
->ifl_ehdr
->e_machine
,
196 (uint_t
)ELF_R_TYPE(reloc
->r_info
,
197 ld_targ
.t_m
.m_mach
), 0, &inv_buf
),
198 ifl
->ifl_name
, demangle(rsdp
->sd_name
), str
,
199 EC_XWORD(reloc
->r_offset
), str
);
205 * The number of symbols provided by some objects can be very large. Use a
206 * binary search to match the associated value to a symbol table entry.
209 disp_bsearch(const void *key
, const void *array
)
212 Ssv_desc
*ssvp
= (Ssv_desc
*)array
;
214 kvalue
= *((Addr
*)key
);
215 avalue
= ssvp
->ssv_value
;
219 if ((avalue
< kvalue
) &&
220 ((avalue
+ ssvp
->ssv_sdp
->sd_sym
->st_size
) <= kvalue
))
226 * Given a sorted list of symbols, look for a symbol in which the relocation
227 * offset falls between the [sym.st_value - sym.st_value + sym.st_size]. Since
228 * the symbol list is maintained in sorted order, we can bail once the
229 * relocation offset becomes less than the symbol values. The symbol is
230 * returned for use in error diagnostics.
233 disp_scansyms(Ifl_desc
* ifl
, Rel_desc
*rld
, Boolean rlocal
, int inspect
,
236 Sym_desc
*tsdp
, *rsdp
;
239 uchar_t rtype
, ttype
;
243 * Sorted symbol values have been uniquified by adding their associated
244 * section offset. Uniquify the relocation offset by adding its
245 * associated section offset, and search for the symbol.
247 value
= rld
->rel_roffset
;
248 if (rld
->rel_isdesc
->is_shdr
)
249 value
+= rld
->rel_isdesc
->is_shdr
->sh_offset
;
251 if ((ssvp
= bsearch((void *)&value
, (void *)ifl
->ifl_sortsyms
,
252 ifl
->ifl_sortcnt
, sizeof (Ssv_desc
), &disp_bsearch
)) != 0)
253 tsdp
= ssvp
->ssv_sdp
;
261 * Determine the relocation reference symbol and its type.
265 rtype
= ELF_ST_TYPE(rsym
->st_info
);
268 * If there is no target symbol to match the relocation offset, then the
269 * offset is effectively local data. If the relocation symbol is global
270 * data we have a potential for this displacement relocation to be
271 * invalidated should the global symbol be copied.
274 if ((rlocal
== TRUE
) ||
275 ((rtype
!= STT_OBJECT
) && (rtype
!= STT_SECTION
)))
279 * If both symbols are local, no copy relocations can occur to
280 * either symbol. Note, this test is very similar to the test
281 * used in ld_sym_adjust_vis().
283 if ((rlocal
== TRUE
) && (SYM_IS_HIDDEN(tsdp
) ||
284 (ELF_ST_BIND(tsdp
->sd_sym
->st_info
) != STB_GLOBAL
) ||
285 ((ofl
->ofl_flags
& (FLG_OF_AUTOLCL
| FLG_OF_AUTOELM
)) &&
286 ((tsdp
->sd_flags
& MSK_SY_NOAUTO
) == 0))))
290 * Determine the relocation target symbols type.
293 ttype
= ELF_ST_TYPE(tsym
->st_info
);
296 * If the reference symbol is local, and the target isn't a
297 * data element, then no copy relocations can occur to either
298 * symbol. Note, this catches pc-relative relocations against
299 * the _GLOBAL_OFFSET_TABLE_, which is effectively treated as
302 if ((rlocal
== TRUE
) && (ttype
!= STT_OBJECT
) &&
303 (ttype
!= STT_SECTION
))
307 * Finally, one of the symbols must reference a data element.
309 if ((rtype
!= STT_OBJECT
) && (rtype
!= STT_SECTION
) &&
310 (ttype
!= STT_OBJECT
) && (ttype
!= STT_SECTION
))
315 * We have two global symbols, at least one of which is a data item.
316 * The last case where a displacement relocation can be ignored, is
317 * if the reference symbol is included in the target symbol.
319 value
= rsym
->st_value
;
320 if ((rld
->rel_flags
& FLG_REL_RELA
) == FLG_REL_RELA
)
321 value
+= rld
->rel_raddend
;
323 if ((rld
->rel_roffset
>= value
) &&
324 (rld
->rel_roffset
< (value
+ rsym
->st_size
)))
328 * We have a displacement relocation that could be compromised by a
329 * copy relocation of one of the associated data items.
331 rld
->rel_flags
|= FLG_REL_DISP
;
336 ld_disp_errmsg(const char *msg
, Rel_desc
*rsp
, Ofl_desc
*ofl
)
340 Ifl_desc
*ifl
= rsp
->rel_isdesc
->is_file
;
341 Conv_inv_buf_t inv_buf
;
343 if ((sdp
= disp_scansyms(ifl
, rsp
, 0, 1, ofl
)) != 0)
344 str
= demangle(sdp
->sd_name
);
346 str
= MSG_INTL(MSG_STR_UNKNOWN
);
348 ld_eprintf(ofl
, ERR_WARNING
, msg
,
349 conv_reloc_type(ifl
->ifl_ehdr
->e_machine
, rsp
->rel_rtype
,
350 0, &inv_buf
), ifl
->ifl_name
, ld_reloc_sym_name(rsp
), str
,
351 EC_OFF(rsp
->rel_roffset
));
355 * qsort(3C) comparison routine used for the disp_sortsyms().
358 disp_qsort(const void * s1
, const void * s2
)
360 Ssv_desc
*ssvp1
= ((Ssv_desc
*)s1
);
361 Ssv_desc
*ssvp2
= ((Ssv_desc
*)s2
);
362 Addr val1
= ssvp1
->ssv_value
;
363 Addr val2
= ssvp2
->ssv_value
;
373 * Determine whether a displacement relocation is between a local and global
374 * symbol pair. One symbol is used to perform the relocation, and the other
375 * is the destination offset of the relocation.
378 disp_inspect(Ofl_desc
*ofl
, Rel_desc
*rld
, Boolean rlocal
)
380 Is_desc
*isp
= rld
->rel_isdesc
;
381 Ifl_desc
*ifl
= rld
->rel_isdesc
->is_file
;
384 * If the input files symbols haven't been sorted yet, do so.
386 if (ifl
->ifl_sortsyms
== 0) {
389 if ((ifl
->ifl_sortsyms
= libld_malloc((ifl
->ifl_symscnt
+ 1) *
390 sizeof (Ssv_desc
))) == 0)
393 for (ondx
= 0, nndx
= 0; ondx
< ifl
->ifl_symscnt
; ondx
++) {
398 * As symbol resolution has already occurred, various
399 * symbols from this object may have been satisfied
400 * from other objects. Only select symbols from this
401 * object. For the displacement test, we only really
402 * need to observe data definitions, however, later as
403 * part of providing warning disgnostics, relating the
404 * relocation offset to a symbol is desirable. Thus,
405 * collect all symbols that define a memory area.
407 if (((sdp
= ifl
->ifl_oldndx
[ondx
]) == 0) ||
408 (sdp
->sd_sym
->st_shndx
== SHN_UNDEF
) ||
409 (sdp
->sd_sym
->st_shndx
>= SHN_LORESERVE
) ||
410 (sdp
->sd_ref
!= REF_REL_NEED
) ||
411 (sdp
->sd_file
!= ifl
) ||
412 (sdp
->sd_sym
->st_size
== 0))
416 * As a further optimization for later checking, mark
417 * this section if this a global data definition.
419 if (sdp
->sd_isc
&& (ondx
>= ifl
->ifl_locscnt
))
420 sdp
->sd_isc
->is_flags
|= FLG_IS_GDATADEF
;
423 * Capture the symbol. Within relocatable objects, a
424 * symbols value is its offset within its associated
425 * section. Add the section offset to this value to
426 * uniquify the symbol.
428 value
= sdp
->sd_sym
->st_value
;
429 if (sdp
->sd_isc
&& sdp
->sd_isc
->is_shdr
)
430 value
+= sdp
->sd_isc
->is_shdr
->sh_offset
;
432 ifl
->ifl_sortsyms
[nndx
].ssv_value
= value
;
433 ifl
->ifl_sortsyms
[nndx
].ssv_sdp
= sdp
;
438 * Sort the list based on the symbols value (address).
440 if ((ifl
->ifl_sortcnt
= nndx
) != 0)
441 qsort(ifl
->ifl_sortsyms
, nndx
, sizeof (Ssv_desc
),
446 * If the reference symbol is local, and the section being relocated
447 * contains no global definitions, neither can be the target of a copy
450 if ((rlocal
== FALSE
) && ((isp
->is_flags
& FLG_IS_GDATADEF
) == 0))
454 * Otherwise determine whether this relocation symbol and its offset
455 * could be candidates for a copy relocation.
457 if (ifl
->ifl_sortcnt
)
458 (void) disp_scansyms(ifl
, rld
, rlocal
, 0, ofl
);
463 * Return a Rel_cachebuf with an available Rel_desc entry from the
464 * specified cache, allocating a cache buffer if necessary.
467 * ofl - Output file descriptor
468 * rcp - Relocation cache to allocate the descriptor from.
469 * One of &ofl->ofl_actrels or &ofl->ofl_outrels.
472 * Returns the allocated descriptor, or NULL if the allocation fails.
474 static Rel_cachebuf
*
475 ld_add_rel_cache(Ofl_desc
*ofl
, Rel_cache
*rcp
)
478 size_t nelts
, size
, alloc_cnt
;
481 * If there is space available in the present cache bucket, return the
484 alloc_cnt
= aplist_nitems(rcp
->rc_list
);
486 ((rcbp
= rcp
->rc_list
->apl_data
[alloc_cnt
- 1]) != NULL
) &&
487 (rcbp
->rc_free
< rcbp
->rc_end
))
491 * Allocate a new bucket. As we cannot know the number of relocations
492 * we'll have in the active and output cache until after the link is
493 * complete, the size of the bucket is a heuristic.
495 * In general, if the output object is an executable, or a sharable
496 * object, then the size of the active relocation list will be nearly
497 * the same as the number of input relocations, and the output
498 * relocation list will be very short. If the output object is a
499 * relocatable object, then the reverse is true. Therefore, the initial
500 * allocation for the appropriate list is sized to fit all the input
501 * allocations in a single shot.
503 * All other allocations are done in units of REL_CACHEBUF_ALLOC,
504 * which is chosen to be large enough to cover most common cases,
505 * but small enough that not using it fully is inconsequential.
507 * In an ideal scenario, this results in one allocation on each list.
509 nelts
= REL_CACHEBUF_ALLOC
;
510 if ((alloc_cnt
== 0) && (ofl
->ofl_relocincnt
> REL_CACHEBUF_ALLOC
)) {
511 Boolean is_rel
= (ofl
->ofl_flags
& FLG_OF_RELOBJ
) != 0;
513 if (((rcp
== &ofl
->ofl_actrels
) && !is_rel
) ||
514 ((rcp
== &ofl
->ofl_outrels
) && is_rel
))
515 nelts
= ofl
->ofl_relocincnt
;
519 * Compute the total number of bytes to allocate. The first element
520 * of the array is built into the Rel_cachebuf header, so we subtract
523 size
= sizeof (Rel_cachebuf
) + ((nelts
- 1) * sizeof (Rel_desc
));
525 if (((rcbp
= libld_malloc(size
)) == NULL
) ||
526 (aplist_append(&rcp
->rc_list
, rcbp
, AL_CNT_OFL_RELS
) == NULL
))
529 rcbp
->rc_free
= rcbp
->rc_arr
;
530 rcbp
->rc_end
= rcbp
->rc_arr
+ nelts
;
536 * Allocate a Rel_aux descriptor and attach it to the given Rel_desc,
537 * allocating an auxiliary cache buffer if necessary.
540 * ofl - Output file descriptor
541 * rdp - Rel_desc descriptor that requires an auxiliary block
544 * Returns TRUE on success, and FALSE if the allocation fails.
545 * On success, the caller is responsible for initializing the
546 * auxiliary block properly.
549 ld_add_rel_aux(Ofl_desc
*ofl
, Rel_desc
*rdesc
)
551 Rel_aux_cachebuf
*racp
= NULL
;
555 * If there is space available in the present cache bucket, use it.
556 * Otherwise, allocate a new bucket.
558 if (ofl
->ofl_relaux
) {
559 racp
= ofl
->ofl_relaux
->apl_data
[
560 ofl
->ofl_relaux
->apl_nitems
- 1];
562 if (racp
&& (racp
->rac_free
>= racp
->rac_end
))
567 * Compute the total number of bytes to allocate. The first
568 * element of the array is built into the Rel_aux_cachebuf
569 * header, so we subtract one from the number of elements.
571 size
= sizeof (Rel_aux_cachebuf
) +
572 ((RELAUX_CACHEBUF_ALLOC
- 1) * sizeof (Rel_aux
));
573 if (((racp
= libld_malloc(size
)) == NULL
) ||
574 (aplist_append(&ofl
->ofl_relaux
, racp
, AL_CNT_OFL_RELS
) ==
578 racp
->rac_free
= racp
->rac_arr
;
579 racp
->rac_end
= racp
->rac_arr
+ RELAUX_CACHEBUF_ALLOC
;
582 /* Take an auxiliary descriptor from the cache and add it to rdesc */
583 rdesc
->rel_aux
= racp
->rac_free
++;
589 * Enter a copy of the given Rel_desc relocation descriptor, and
590 * any associated auxiliary Rel_aux it may reference, into the
591 * specified relocation cache.
594 * ofl - Output file descriptor
595 * rcp - Relocation descriptor cache to recieve relocation
596 * rdesc - Rel_desc image to be inserted
597 * flags - Flags to add to rdest->rel_flags in the inserted descriptor
600 * Returns the pointer to the inserted descriptor on success.
601 * Returns NULL if an allocation error occurs.
604 ld_reloc_enter(Ofl_desc
*ofl
, Rel_cache
*rcp
, Rel_desc
*rdesc
, Word flags
)
612 * If no relocation cache structures are available, allocate a new
613 * one and link it to the buffer list.
615 rcbp
= ld_add_rel_cache(ofl
, rcp
);
618 arsp
= rcbp
->rc_free
;
621 * If there is an auxiliary block on the original, allocate
622 * one for the clone. Save the pointer, because the struct copy
623 * below will crush it.
625 if (rdesc
->rel_aux
!= NULL
) {
626 if (!ld_add_rel_aux(ofl
, arsp
))
628 auxp
= arsp
->rel_aux
;
631 /* Copy contents of the original into the clone */
635 * If there is an auxiliary block, restore the clone's pointer to
636 * it, and copy the auxiliary contents.
638 if (rdesc
->rel_aux
!= NULL
) {
639 arsp
->rel_aux
= auxp
;
640 *auxp
= *rdesc
->rel_aux
;
642 arsp
->rel_flags
|= flags
;
651 * Initialize a relocation descriptor auxiliary block to default
655 * rdesc - Relocation descriptor, with a non-NULL rel_aux field
656 * pointing at the auxiliary block to be initialized.
659 * Each field in rdesc->rel_aux has been set to its default value
662 ld_init_rel_aux(Rel_desc
*rdesc
)
664 Rel_aux
*rap
= rdesc
->rel_aux
;
667 * The default output section is the one the input section
668 * is assigned to, assuming that there is an input section.
669 * Failing that, NULL is the only possibility, and we expect
670 * that the caller will assign an explicit value.
672 rap
->ra_osdesc
= (rdesc
->rel_isdesc
== NULL
) ? NULL
:
673 rdesc
->rel_isdesc
->is_osdesc
;
675 /* The ra_usym defaults to the value in rel_sym */
676 rap
->ra_usym
= rdesc
->rel_sym
;
678 /* Remaining fields are zeroed */
680 rap
->ra_typedata
= 0;
684 * The ld_reloc_set_aux_XXX() functions are used to set the value of an
685 * auxiliary relocation item on a relocation descriptor that exists in
686 * the active or output relocation cache. These descriptors are created
687 * via a call to ld_reloc_enter().
689 * These functions preserve the illusion that every relocation descriptor
690 * has a non-NULL auxiliary block into which values can be set, while
691 * only creating an auxiliary block if one is actually necessary, preventing
692 * the large memory allocations that would otherwise occur. They operate
695 * - If an auxiliary block already exists, set the desired value and
698 * - If no auxiliary block exists, but the desired value is the default
699 * value for the specified item, then no auxiliary block is needed,
700 * and TRUE is returned.
702 * - If no auxiliary block exists, and the desired value is not the
703 * default for the specified item, allocate an auxiliary block for
704 * the descriptor, initialize its contents to default values for all
705 * items, set the specified value, and return TRUE.
707 * - If an auxiliary block needs to be added, but the allocation fails,
708 * an error is issued, and FALSE is returned.
710 * Note that we only provide an ld_reloc_set_aux_XXX() function for those
711 * auxiliary items that libld actually modifies in Rel_desc descriptors
712 * in the active or output caches. If another one is needed, add it here.
714 * The PROCESS_NULL_REL_AUX macro is used to provide a single implementation
715 * for the logic that determines if an auxiliary block is needed or not,
716 * and handles the details of allocating and initializing it. It accepts
717 * one argument, _isdefault_predicate, which should be a call to the
718 * RELAUX_ISDEFAULT_xxx() macro appropriate for the auxiliary item
721 #define PROCESS_NULL_REL_AUX(_isdefault_predicate) \
722 if (rdesc->rel_aux == NULL) { \
723 /* If requested value is the default, no need for aux block */ \
724 if (_isdefault_predicate) \
726 /* Allocate and attach an auxiliary block */ \
727 if (!ld_add_rel_aux(ofl, rdesc)) \
729 /* Initialize the auxiliary block with default values */ \
730 ld_init_rel_aux(rdesc); \
734 ld_reloc_set_aux_osdesc(Ofl_desc
*ofl
, Rel_desc
*rdesc
, Os_desc
*osp
)
736 PROCESS_NULL_REL_AUX(RELAUX_ISDEFAULT_OSDESC(rdesc
, osp
))
737 rdesc
->rel_aux
->ra_osdesc
= osp
;
742 ld_reloc_set_aux_usym(Ofl_desc
*ofl
, Rel_desc
*rdesc
, Sym_desc
*sdp
)
744 PROCESS_NULL_REL_AUX(RELAUX_ISDEFAULT_USYM(rdesc
, sdp
))
745 rdesc
->rel_aux
->ra_usym
= sdp
;
749 #undef PROCESS_NULL_REL_AUX
752 * Return a descriptive name for the symbol associated with the
753 * given relocation descriptor. This will be the actual symbol
754 * name if one exists, or a suitable alternative otherwise.
757 * rsp - Relocation descriptor
760 ld_reloc_sym_name(Rel_desc
*rsp
)
762 Sym_desc
*sdp
= rsp
->rel_sym
;
765 /* If the symbol has a valid name use it */
766 if (sdp
->sd_name
&& *sdp
->sd_name
)
767 return (demangle(sdp
->sd_name
));
770 * If the symbol is STT_SECTION, and the corresponding
771 * section symbol has the specially prepared string intended
772 * for this use, use that string. The string is of the form
775 if ((ELF_ST_TYPE(sdp
->sd_sym
->st_info
) == STT_SECTION
) &&
776 (sdp
->sd_isc
!= NULL
) && (sdp
->sd_isc
->is_sym_name
!= NULL
))
777 return (demangle(sdp
->sd_isc
->is_sym_name
));
780 * Use an empty name for a register relocation with
783 if (IS_REGISTER(rsp
->rel_rtype
))
784 return (MSG_ORIG(MSG_STR_EMPTY
));
787 /* If all else fails, report it as <unknown> */
788 return (MSG_INTL(MSG_STR_UNKNOWN
));
792 * Add an active relocation record.
795 ld_add_actrel(Word flags
, Rel_desc
*rsp
, Ofl_desc
*ofl
)
799 if ((arsp
= ld_reloc_enter(ofl
, &ofl
->ofl_actrels
, rsp
, flags
)) == NULL
)
803 * Any GOT relocation reference requires the creation of a .got table.
804 * Most references to a .got require a .got entry, which is accounted
805 * for with the ofl_gotcnt counter. However, some references are
806 * relative to the .got table, but require no .got entry. This test
807 * insures a .got is created regardless of the type of reference.
809 if (IS_GOT_REQUIRED(arsp
->rel_rtype
))
810 ofl
->ofl_flags
|= FLG_OF_BLDGOT
;
813 * If this is a displacement relocation generate a warning.
815 if (arsp
->rel_flags
& FLG_REL_DISP
) {
816 ofl
->ofl_dtflags_1
|= DF_1_DISPRELDNE
;
818 if (ofl
->ofl_flags
& FLG_OF_VERBOSE
)
819 ld_disp_errmsg(MSG_INTL(MSG_REL_DISPREL3
), arsp
, ofl
);
822 DBG_CALL(Dbg_reloc_ars_entry(ofl
->ofl_lml
, ELF_DBG_LD
,
823 arsp
->rel_isdesc
->is_shdr
->sh_type
, ld_targ
.t_m
.m_mach
, arsp
));
828 * In the platform specific machrel.XXX.c files, we sometimes write
829 * a value directly into the got/plt. These function can be used when
830 * the running linker has the opposite byte order of the object being
834 ld_bswap_Word(Word v
)
836 return (BSWAP_WORD(v
));
841 ld_bswap_Xword(Xword v
)
843 return (BSWAP_XWORD(v
));
848 ld_reloc_GOT_relative(Boolean local
, Rel_desc
*rsp
, Ofl_desc
*ofl
)
850 Sym_desc
*sdp
= rsp
->rel_sym
;
851 ofl_flag_t flags
= ofl
->ofl_flags
;
855 * If this is the first time we've seen this symbol in a GOT
856 * relocation we need to assign it a GOT token. Once we've got
857 * all of the GOT's assigned we can assign the actual indexes.
859 if ((gnp
= (*ld_targ
.t_mr
.mr_find_got_ndx
)(sdp
->sd_GOTndxs
,
860 GOT_REF_GENERIC
, ofl
, rsp
)) == 0) {
861 Word rtype
= rsp
->rel_rtype
;
863 if ((*ld_targ
.t_mr
.mr_assign_got_ndx
)(&(sdp
->sd_GOTndxs
), NULL
,
864 GOT_REF_GENERIC
, ofl
, rsp
, sdp
) == S_ERROR
)
868 * Initialize the GOT table entry.
870 * For global symbols, we clear the GOT table entry and create
871 * a GLOB_DAT relocation against the symbol.
873 * For local symbols, we enter the symbol value into a GOT
874 * table entry and create a relative relocation if all of
875 * the following hold:
877 * - Output is a shared object
878 * - Symbol is not ABS
879 * - Relocation is not against one of the special sections
881 * - This is not one of the generated symbols we have
882 * to update after the output object has been fully
883 * laid out (_START_, _END_, ...)
885 * Local symbols that don't meet the above requirements
886 * are processed as is.
889 if ((flags
& FLG_OF_SHAROBJ
) &&
890 (((sdp
->sd_flags
& FLG_SY_SPECSEC
) == 0) ||
891 ((sdp
->sd_sym
->st_shndx
!= SHN_ABS
)) ||
892 (sdp
->sd_aux
&& sdp
->sd_aux
->sa_symspec
))) {
893 if (ld_add_actrel((FLG_REL_GOT
| FLG_REL_GOTCL
),
894 rsp
, ofl
) == S_ERROR
)
897 rsp
->rel_rtype
= ld_targ
.t_m
.m_r_relative
;
899 if ((*ld_targ
.t_mr
.mr_add_outrel
)
900 ((FLG_REL_GOT
| FLG_REL_ADVAL
),
901 rsp
, ofl
) == S_ERROR
)
904 rsp
->rel_rtype
= rtype
;
906 if (ld_add_actrel(FLG_REL_GOT
, rsp
,
911 rsp
->rel_rtype
= ld_targ
.t_m
.m_r_glob_dat
;
912 if ((*ld_targ
.t_mr
.mr_add_outrel
)(FLG_REL_GOT
,
913 rsp
, ofl
) == S_ERROR
)
915 rsp
->rel_rtype
= rtype
;
918 if ((*ld_targ
.t_mr
.mr_assign_got_ndx
)(&(sdp
->sd_GOTndxs
), gnp
,
919 GOT_REF_GENERIC
, ofl
, rsp
, sdp
) == S_ERROR
)
924 * Perform relocation to GOT table entry.
926 return (ld_add_actrel(NULL
, rsp
, ofl
));
930 * Perform relocations for PLT's
933 ld_reloc_plt(Rel_desc
*rsp
, Ofl_desc
*ofl
)
935 Sym_desc
*sdp
= rsp
->rel_sym
;
937 switch (ld_targ
.t_m
.m_mach
) {
940 * AMD64 TLS code sequences do not use a unique TLS
941 * relocation to reference the __tls_get_addr() function call.
943 if ((ofl
->ofl_flags
& FLG_OF_EXEC
) &&
944 (strcmp(sdp
->sd_name
, MSG_ORIG(MSG_SYM_TLSGETADDR_U
)) ==
946 return (ld_add_actrel(FLG_REL_TLSFIX
, rsp
, ofl
));
951 * GNUC IA32 TLS code sequences do not use a unique TLS
952 * relocation to reference the ___tls_get_addr() function call.
954 if ((ofl
->ofl_flags
& FLG_OF_EXEC
) &&
955 (strcmp(sdp
->sd_name
, MSG_ORIG(MSG_SYM_TLSGETADDR_UU
)) ==
957 return (ld_add_actrel(FLG_REL_TLSFIX
, rsp
, ofl
));
962 * if (not PLT yet assigned)
964 * assign PLT index to symbol
965 * build output JMP_SLOT relocation
968 if (sdp
->sd_aux
->sa_PLTndx
== 0) {
969 Word ortype
= rsp
->rel_rtype
;
971 (*ld_targ
.t_mr
.mr_assign_plt_ndx
)(sdp
, ofl
);
974 * If this symbol is binding to a lazy loadable, or deferred
975 * dependency, then identify the symbol.
978 if (sdp
->sd_file
->ifl_flags
& FLG_IF_LAZYLD
)
979 sdp
->sd_flags
|= FLG_SY_LAZYLD
;
980 if (sdp
->sd_file
->ifl_flags
& FLG_IF_DEFERRED
)
981 sdp
->sd_flags
|= FLG_SY_DEFERRED
;
984 rsp
->rel_rtype
= ld_targ
.t_m
.m_r_jmp_slot
;
985 if ((*ld_targ
.t_mr
.mr_add_outrel
)(FLG_REL_PLT
, rsp
, ofl
) ==
988 rsp
->rel_rtype
= ortype
;
992 * Perform relocation to PLT table entry.
994 if ((ofl
->ofl_flags
& FLG_OF_SHAROBJ
) &&
995 IS_ADD_RELATIVE(rsp
->rel_rtype
)) {
996 Word ortype
= rsp
->rel_rtype
;
998 rsp
->rel_rtype
= ld_targ
.t_m
.m_r_relative
;
999 if ((*ld_targ
.t_mr
.mr_add_outrel
)(FLG_REL_ADVAL
, rsp
, ofl
) ==
1002 rsp
->rel_rtype
= ortype
;
1005 return (ld_add_actrel(NULL
, rsp
, ofl
));
1009 * Round up to the next power of 2. Used to ensure section alignments that can
1010 * be used for copy relocation symbol alignments are sane values.
1025 * process GLOBAL undefined and ref_dyn_need symbols.
1028 reloc_exec(Rel_desc
*rsp
, Ofl_desc
*ofl
)
1030 Sym_desc
*_sdp
, *sdp
= rsp
->rel_sym
;
1031 Sym_aux
*sap
= sdp
->sd_aux
;
1032 Sym
*sym
= sdp
->sd_sym
;
1036 * Reference is to a function so simply create a plt entry for it.
1038 if (ELF_ST_TYPE(sym
->st_info
) == STT_FUNC
)
1039 return (ld_reloc_plt(rsp
, ofl
));
1042 * Catch absolutes - these may cause a text relocation.
1044 if ((sdp
->sd_flags
& FLG_SY_SPECSEC
) && (sym
->st_shndx
== SHN_ABS
)) {
1045 if ((ofl
->ofl_flags1
& FLG_OF1_ABSEXEC
) == 0)
1046 return ((*ld_targ
.t_mr
.mr_add_outrel
)(NULL
, rsp
, ofl
));
1049 * If -zabsexec is set then promote the ABSOLUTE symbol to
1050 * current the current object and perform the relocation now.
1052 sdp
->sd_ref
= REF_REL_NEED
;
1053 return (ld_add_actrel(NULL
, rsp
, ofl
));
1057 * If the relocation is against a writable section simply compute the
1058 * necessary output relocation. As an optimization, if the symbol has
1059 * already been transformed into a copy relocation then we can perform
1060 * the relocation directly (copy relocations should only be generated
1061 * for references from the text segment and these relocations are
1062 * normally carried out before we get to the data segment relocations).
1064 if ((ELF_ST_TYPE(sym
->st_info
) == STT_OBJECT
) &&
1065 (RELAUX_GET_OSDESC(rsp
)->os_shdr
->sh_flags
& SHF_WRITE
)) {
1066 if (sdp
->sd_flags
& FLG_SY_MVTOCOMM
)
1067 return (ld_add_actrel(NULL
, rsp
, ofl
));
1069 return ((*ld_targ
.t_mr
.mr_add_outrel
)(NULL
, rsp
, ofl
));
1073 * If the reference isn't to an object (normally because a .type
1074 * directive wasn't defined in some assembler source), then apply
1075 * a generic relocation (this has a tendency to result in text
1078 if (ELF_ST_TYPE(sym
->st_info
) != STT_OBJECT
) {
1079 Conv_inv_buf_t inv_buf
;
1081 ld_eprintf(ofl
, ERR_WARNING
, MSG_INTL(MSG_REL_UNEXPSYM
),
1082 conv_sym_info_type(sdp
->sd_file
->ifl_ehdr
->e_machine
,
1083 ELF_ST_TYPE(sym
->st_info
), 0, &inv_buf
),
1084 rsp
->rel_isdesc
->is_file
->ifl_name
,
1085 ld_reloc_sym_name(rsp
), sdp
->sd_file
->ifl_name
);
1086 return ((*ld_targ
.t_mr
.mr_add_outrel
)(NULL
, rsp
, ofl
));
1090 * Prepare for generating a copy relocation.
1092 * If this symbol is one of an alias pair, we need to ensure both
1093 * symbols become part of the output (the strong symbol will be used to
1094 * maintain the symbols state). And, if we did raise the precedence of
1095 * a symbol we need to check and see if this is a weak symbol. If it is
1096 * we want to use it's strong counter part.
1098 * The results of this logic should be:
1099 * ra_usym: assigned to strong
1100 * rel_sym: assigned to symbol to perform
1101 * copy_reloc against (weak or strong).
1103 if (sap
->sa_linkndx
) {
1104 _sdp
= sdp
->sd_file
->ifl_oldndx
[sap
->sa_linkndx
];
1106 if (_sdp
->sd_ref
< sdp
->sd_ref
) {
1107 _sdp
->sd_ref
= sdp
->sd_ref
;
1108 _sdp
->sd_flags
|= FLG_SY_REFRSD
;
1111 * As we're going to replicate a symbol from a shared
1112 * object, retain its correct binding status.
1114 if (ELF_ST_BIND(_sdp
->sd_sym
->st_info
) == STB_GLOBAL
)
1115 _sdp
->sd_flags
|= FLG_SY_GLOBREF
;
1117 } else if (_sdp
->sd_ref
> sdp
->sd_ref
) {
1118 sdp
->sd_ref
= _sdp
->sd_ref
;
1119 sdp
->sd_flags
|= FLG_SY_REFRSD
;
1122 * As we're going to replicate a symbol from a shared
1123 * object, retain its correct binding status.
1125 if (ELF_ST_BIND(sym
->st_info
) == STB_GLOBAL
)
1126 sdp
->sd_flags
|= FLG_SY_GLOBREF
;
1130 * If this is a weak symbol then we want to move the strong
1131 * symbol into local .bss. If there is a copy_reloc to be
1132 * performed, that should still occur against the WEAK symbol.
1134 if (((ELF_ST_BIND(sdp
->sd_sym
->st_info
) == STB_WEAK
) ||
1135 (sdp
->sd_flags
& FLG_SY_WEAKDEF
)) &&
1136 !ld_reloc_set_aux_usym(ofl
, rsp
, _sdp
))
1142 * If the reference is to an object then allocate space for the object
1143 * within the executables .bss. Relocations will now be performed from
1144 * this new location. If the original shared objects data is
1145 * initialized, then generate a copy relocation that will copy the data
1146 * to the executables .bss at runtime.
1148 if (!(RELAUX_GET_USYM(rsp
)->sd_flags
& FLG_SY_MVTOCOMM
)) {
1149 Word rtype
= rsp
->rel_rtype
, w2align
;
1153 * Diagnose the original copy reference, as this symbol
1154 * information will be overridden with the new destination.
1156 DBG_CALL(Dbg_syms_copy_reloc(ofl
, sdp
, 0));
1159 * Indicate that the symbol(s) against which we're relocating
1160 * have been moved to the executables common. Also, insure that
1161 * the symbol(s) remain marked as global, as the shared object
1162 * from which they are copied must be able to relocate to the
1163 * new common location within the executable.
1165 * Note that even though a new symbol has been generated in the
1166 * output files' .bss, the symbol must remain REF_DYN_NEED and
1167 * not be promoted to REF_REL_NEED. sym_validate() still needs
1168 * to carry out a number of checks against the symbols binding
1169 * that are triggered by the REF_DYN_NEED state.
1172 (FLG_SY_MVTOCOMM
| FLG_SY_DEFAULT
| FLG_SY_EXPDEF
);
1173 sdp
->sd_flags
&= ~MSK_SY_LOCAL
;
1174 sdp
->sd_sym
->st_other
&= ~MSK_SYM_VISIBILITY
;
1176 _sdp
->sd_flags
|= (FLG_SY_MVTOCOMM
|
1177 FLG_SY_DEFAULT
| FLG_SY_EXPDEF
);
1178 _sdp
->sd_flags
&= ~MSK_SY_LOCAL
;
1179 _sdp
->sd_sym
->st_other
&= ~MSK_SYM_VISIBILITY
;
1182 * Make sure the symbol has a reference in case of any
1183 * error diagnostics against it (perhaps this belongs
1184 * to a version that isn't allowable for this build).
1185 * The resulting diagnostic (see sym_undef_entry())
1186 * might seem a little bogus, as the symbol hasn't
1187 * really been referenced by this file, but has been
1188 * promoted as a consequence of its alias reference.
1190 if (!(_sdp
->sd_aux
->sa_rfile
))
1191 _sdp
->sd_aux
->sa_rfile
= sdp
->sd_aux
->sa_rfile
;
1195 * Assign the symbol to the bss.
1197 _sdp
= RELAUX_GET_USYM(rsp
);
1198 stval
= _sdp
->sd_sym
->st_value
;
1199 if (ld_sym_copy(_sdp
) == S_ERROR
)
1201 _sdp
->sd_shndx
= _sdp
->sd_sym
->st_shndx
= SHN_COMMON
;
1202 _sdp
->sd_flags
|= FLG_SY_SPECSEC
;
1205 * Ensure the symbol has sufficient alignment. The symbol
1206 * definition has no alignment information that can be used,
1207 * hence we use a heuristic. Historically, twice the native
1208 * word alignment was sufficient for any data type, however,
1209 * the developer may have requested larger alignments (pragma
1210 * align). The most conservative approach is to use a power
1211 * of two alignment, determined from the alignment of the
1212 * section containing the symbol definition. Note that this
1213 * can result in some bloat to the .bss as the not every item
1214 * of copied data might need the section alignment.
1216 * COMMON symbols carry their alignment requirements in the
1217 * symbols st_value field. This alignment is applied to the
1218 * symbol when it is eventually transformed into .bss.
1220 w2align
= ld_targ
.t_m
.m_word_align
* 2;
1221 if (_sdp
->sd_sym
->st_size
< w2align
)
1222 _sdp
->sd_sym
->st_value
= ld_targ
.t_m
.m_word_align
;
1228 ((shdr
= _sdp
->sd_isc
->is_shdr
) != NULL
) &&
1229 ((isalign
= shdr
->sh_addralign
) != 0))
1230 _sdp
->sd_sym
->st_value
= nlpo2(isalign
);
1232 _sdp
->sd_sym
->st_value
= w2align
;
1236 * Whether or not the symbol references initialized data we
1237 * generate a copy relocation - this differs from the past
1238 * where we would not create the COPY_RELOC if we were binding
1239 * against .bss. This is done for *two* reasons.
1241 * - If the symbol in the shared object changes to a
1242 * initialized data - we need the COPY to pick it up.
1243 * - Without the COPY RELOC we can't tell that the symbol
1244 * from the COPY'd object has been moved and all bindings
1245 * to it should bind here.
1247 * Keep this symbol in the copy relocation list to check the
1252 if (alist_append(&ofl
->ofl_copyrels
, &cr
, sizeof (Copy_rel
),
1253 AL_CNT_OFL_COPYRELS
) == NULL
)
1256 rsp
->rel_rtype
= ld_targ
.t_m
.m_r_copy
;
1257 if ((*ld_targ
.t_mr
.mr_add_outrel
)(FLG_REL_BSS
, rsp
, ofl
) ==
1260 rsp
->rel_rtype
= rtype
;
1263 * If this symbol is a protected symbol, warn the user. A
1264 * potential issue exists as the copy relocated symbol within
1265 * the executable can be visible to others, whereas the shared
1266 * object that defined the original copy data symbol is pre-
1267 * bound to reference it's own definition. Any modification
1268 * of the symbols data could lead to inconsistencies for the
1271 if (_sdp
->sd_flags
& FLG_SY_PROT
) {
1272 Conv_inv_buf_t inv_buf
;
1274 ld_eprintf(ofl
, ERR_WARNING
, MSG_INTL(MSG_REL_COPY
),
1275 conv_reloc_type(_sdp
->sd_file
->ifl_ehdr
->e_machine
,
1276 ld_targ
.t_m
.m_r_copy
, 0, &inv_buf
),
1277 _sdp
->sd_file
->ifl_name
, _sdp
->sd_name
);
1279 DBG_CALL(Dbg_syms_copy_reloc(ofl
, _sdp
,
1280 _sdp
->sd_sym
->st_value
));
1282 return (ld_add_actrel(NULL
, rsp
, ofl
));
1286 * All relocations should have been handled by the other routines. This
1287 * routine is here as a catch all, if we do enter it we've goofed - but
1288 * we'll try and do the best we can.
1291 reloc_generic(Rel_desc
*rsp
, Ofl_desc
*ofl
)
1293 Ifl_desc
*ifl
= rsp
->rel_isdesc
->is_file
;
1294 Conv_inv_buf_t inv_buf
;
1296 ld_eprintf(ofl
, ERR_WARNING
, MSG_INTL(MSG_REL_UNEXPREL
),
1297 conv_reloc_type(ifl
->ifl_ehdr
->e_machine
, rsp
->rel_rtype
,
1298 0, &inv_buf
), ifl
->ifl_name
, ld_reloc_sym_name(rsp
));
1301 * If building a shared object then put the relocation off
1304 if (ofl
->ofl_flags
& FLG_OF_SHAROBJ
)
1305 return ((*ld_targ
.t_mr
.mr_add_outrel
)(NULL
, rsp
, ofl
));
1308 * Otherwise process relocation now.
1310 return (ld_add_actrel(NULL
, rsp
, ofl
));
1314 * Process relocations when building a relocatable object. Typically, there
1315 * aren't many relocations that can be caught at this point, most are simply
1316 * passed through to the output relocatable object.
1319 reloc_relobj(Boolean local
, Rel_desc
*rsp
, Ofl_desc
*ofl
)
1321 Word rtype
= rsp
->rel_rtype
;
1322 Sym_desc
*sdp
= rsp
->rel_sym
;
1323 Is_desc
*isp
= rsp
->rel_isdesc
;
1327 * Determine if we can do any relocations at this point. We can if:
1329 * this is local_symbol and a non-GOT relocation, and
1330 * the relocation is pc-relative, and
1331 * the relocation is against a symbol in same section
1333 if (local
&& !IS_GOT_RELATIVE(rtype
) &&
1334 !IS_GOT_BASED(rtype
) && !IS_GOT_PC(rtype
) &&
1335 IS_PC_RELATIVE(rtype
) &&
1336 ((sdp
->sd_isc
) && (sdp
->sd_isc
->is_osdesc
== isp
->is_osdesc
)))
1337 return (ld_add_actrel(NULL
, rsp
, ofl
));
1340 * If -zredlocsym is in effect, translate all local symbol relocations
1341 * to be against section symbols, since section symbols are the only
1342 * local symbols which will be added to the .symtab.
1344 if (local
&& (((ofl
->ofl_flags
& FLG_OF_REDLSYM
) &&
1345 (ELF_ST_BIND(sdp
->sd_sym
->st_info
) == STB_LOCAL
)) ||
1346 ((sdp
->sd_flags
& FLG_SY_ELIM
) &&
1347 (ofl
->ofl_flags
& FLG_OF_PROCRED
)))) {
1349 * But if this is PIC code, don't allow it for now.
1351 if (IS_GOT_RELATIVE(rsp
->rel_rtype
)) {
1352 Ifl_desc
*ifl
= rsp
->rel_isdesc
->is_file
;
1353 Conv_inv_buf_t inv_buf
;
1355 ld_eprintf(ofl
, ERR_FATAL
, MSG_INTL(MSG_REL_PICREDLOC
),
1356 ld_reloc_sym_name(rsp
), ifl
->ifl_name
,
1357 conv_reloc_type(ifl
->ifl_ehdr
->e_machine
,
1358 rsp
->rel_rtype
, 0, &inv_buf
));
1363 * Indicate that this relocation should be processed the same
1364 * as a section symbol. For RELA, indicate that the addend
1365 * also needs to be applied to this relocation.
1367 if ((rsp
->rel_flags
& FLG_REL_RELA
) == FLG_REL_RELA
)
1368 oflags
= FLG_REL_SCNNDX
| FLG_REL_ADVAL
;
1370 oflags
= FLG_REL_SCNNDX
;
1373 if ((rsp
->rel_flags
& FLG_REL_RELA
) == 0) {
1375 * Intel (Rel) relocations do not contain an addend. Any
1376 * addend is contained within the file at the location
1377 * identified by the relocation offset. Therefore, if we're
1378 * processing a section symbol, or a -zredlocsym relocation
1379 * (that basically transforms a local symbol reference into
1380 * a section reference), perform an active relocation to
1381 * propagate any addend.
1383 if ((ELF_ST_TYPE(sdp
->sd_sym
->st_info
) == STT_SECTION
) ||
1384 (oflags
== FLG_REL_SCNNDX
))
1385 if (ld_add_actrel(NULL
, rsp
, ofl
) == S_ERROR
)
1388 return ((*ld_targ
.t_mr
.mr_add_outrel
)(oflags
, rsp
, ofl
));
1392 * Perform any generic TLS validations before passing control to machine
1393 * specific routines. At this point we know we are dealing with an executable
1394 * or shared object - relocatable objects have already been processed.
1397 reloc_TLS(Boolean local
, Rel_desc
*rsp
, Ofl_desc
*ofl
)
1399 Word rtype
= rsp
->rel_rtype
;
1400 ofl_flag_t flags
= ofl
->ofl_flags
;
1401 Ifl_desc
*ifl
= rsp
->rel_isdesc
->is_file
;
1402 Half mach
= ifl
->ifl_ehdr
->e_machine
;
1403 Sym_desc
*sdp
= rsp
->rel_sym
;
1405 Conv_inv_buf_t inv_buf1
, inv_buf2
;
1408 * All TLS relocations are illegal in a static executable.
1410 if (OFL_IS_STATIC_EXEC(ofl
)) {
1411 ld_eprintf(ofl
, ERR_FATAL
, MSG_INTL(MSG_REL_TLSSTAT
),
1412 conv_reloc_type(mach
, rtype
, 0, &inv_buf1
), ifl
->ifl_name
,
1413 ld_reloc_sym_name(rsp
));
1418 * Any TLS relocation must be against a STT_TLS symbol, all others
1421 if ((type
= ELF_ST_TYPE(sdp
->sd_sym
->st_info
)) != STT_TLS
) {
1422 ld_eprintf(ofl
, ERR_FATAL
, MSG_INTL(MSG_REL_TLSBADSYM
),
1423 conv_reloc_type(mach
, rtype
, 0, &inv_buf1
), ifl
->ifl_name
,
1424 ld_reloc_sym_name(rsp
),
1425 conv_sym_info_type(mach
, type
, 0, &inv_buf2
));
1430 * A dynamic executable can not use the LD or LE reference models to
1431 * reference an external symbol. A shared object can not use the LD
1432 * reference model to reference an external symbol.
1434 if (!local
&& (IS_TLS_LD(rtype
) ||
1435 ((flags
& FLG_OF_EXEC
) && IS_TLS_LE(rtype
)))) {
1436 ld_eprintf(ofl
, ERR_FATAL
, MSG_INTL(MSG_REL_TLSBND
),
1437 conv_reloc_type(mach
, rtype
, 0, &inv_buf1
), ifl
->ifl_name
,
1438 ld_reloc_sym_name(rsp
), sdp
->sd_file
->ifl_name
);
1443 * The TLS LE model is only allowed for dynamic executables. The TLS IE
1444 * model is allowed for shared objects, but this model has restrictions.
1445 * This model can only be used freely in dependencies that are loaded
1446 * immediately as part of process initialization. However, during the
1447 * initial runtime handshake with libc that establishes the thread
1448 * pointer, a small backup TLS reservation is created. This area can
1449 * be used by objects that are loaded after threads are initialized.
1450 * However, this area is limited in size and may have already been
1451 * used. This area is intended for specialized applications, and does
1452 * not provide the degree of flexibility dynamic TLS can offer. Under
1453 * -z verbose indicate this restriction to the user.
1455 if ((flags
& FLG_OF_EXEC
) == 0) {
1456 if (IS_TLS_LE(rtype
)) {
1457 ld_eprintf(ofl
, ERR_FATAL
, MSG_INTL(MSG_REL_TLSLE
),
1458 conv_reloc_type(mach
, rtype
, 0, &inv_buf1
),
1459 ifl
->ifl_name
, ld_reloc_sym_name(rsp
));
1462 } else if ((IS_TLS_IE(rtype
)) &&
1463 (flags
& FLG_OF_VERBOSE
)) {
1464 ld_eprintf(ofl
, ERR_WARNING
, MSG_INTL(MSG_REL_TLSIE
),
1465 conv_reloc_type(mach
, rtype
, 0, &inv_buf1
),
1466 ifl
->ifl_name
, ld_reloc_sym_name(rsp
));
1470 return ((*ld_targ
.t_mr
.mr_reloc_TLS
)(local
, rsp
, ofl
));
1474 ld_process_sym_reloc(Ofl_desc
*ofl
, Rel_desc
*reld
, Rel
*reloc
, Is_desc
*isp
,
1475 const char *isname
, Word isscnndx
)
1477 Word rtype
= reld
->rel_rtype
;
1478 ofl_flag_t flags
= ofl
->ofl_flags
;
1479 Sym_desc
*sdp
= reld
->rel_sym
;
1482 Conv_inv_buf_t inv_buf
;
1484 DBG_CALL(Dbg_reloc_in(ofl
->ofl_lml
, ELF_DBG_LD
, ld_targ
.t_m
.m_mach
,
1485 ld_targ
.t_m
.m_rel_sht_type
, (void *)reloc
, isname
, isscnndx
,
1486 ld_reloc_sym_name(reld
)));
1489 * Indicate this symbol is being used for relocation and therefore must
1490 * have its output address updated accordingly (refer to update_osym()).
1492 sdp
->sd_flags
|= FLG_SY_UPREQD
;
1495 * Indicate the section this symbol is defined in has been referenced,
1496 * therefor it *is not* a candidate for elimination.
1499 sdp
->sd_isc
->is_flags
|= FLG_IS_SECTREF
;
1500 sdp
->sd_isc
->is_file
->ifl_flags
|= FLG_IF_FILEREF
;
1503 if (!ld_reloc_set_aux_usym(ofl
, reld
, sdp
))
1507 * Determine if this symbol is actually an alias to another symbol. If
1508 * so, and the alias is not REF_DYN_SEEN, set ra_usym to point to the
1509 * weak symbols strong counter-part. The one exception is if the
1510 * FLG_SY_MVTOCOMM flag is set on the weak symbol. If this is the case,
1511 * the strong is only here because of its promotion, and the weak symbol
1512 * should still be used for the relocation reference (see reloc_exec()).
1515 if (sap
&& sap
->sa_linkndx
&&
1516 ((ELF_ST_BIND(sdp
->sd_sym
->st_info
) == STB_WEAK
) ||
1517 (sdp
->sd_flags
& FLG_SY_WEAKDEF
)) &&
1518 (!(sdp
->sd_flags
& FLG_SY_MVTOCOMM
))) {
1521 _sdp
= sdp
->sd_file
->ifl_oldndx
[sap
->sa_linkndx
];
1522 if ((_sdp
->sd_ref
!= REF_DYN_SEEN
) &&
1523 !ld_reloc_set_aux_usym(ofl
, reld
, _sdp
))
1528 * Determine whether this symbol should be bound locally or not.
1529 * Symbols are bound locally if one of the following is true:
1531 * - the symbol is of type STB_LOCAL.
1533 * - the output image is not a relocatable object and the relocation
1534 * is relative to the .got.
1536 * - the section being relocated is of type SHT_SUNW_dof. These
1537 * sections must be bound to the functions in the containing
1538 * object and can not be interposed upon.
1540 * - the symbol has been reduced (scoped to a local or symbolic) and
1541 * reductions are being processed.
1543 * - the -Bsymbolic flag is in use when building a shared object,
1544 * and the symbol hasn't explicitly been defined as nodirect.
1546 * - an executable (fixed address) is being created, and the symbol
1547 * is defined in the executable.
1549 * - the relocation is against a segment which will not be loaded
1550 * into memory. In this case, the relocation must be resolved
1551 * now, as ld.so.1 can not process relocations against unmapped
1555 if (ELF_ST_BIND(sdp
->sd_sym
->st_info
) == STB_LOCAL
) {
1557 } else if (!(reld
->rel_flags
& FLG_REL_LOAD
)) {
1559 } else if (sdp
->sd_sym
->st_shndx
!= SHN_UNDEF
) {
1560 if (reld
->rel_isdesc
&&
1561 reld
->rel_isdesc
->is_shdr
->sh_type
== SHT_SUNW_dof
) {
1563 } else if (!(flags
& FLG_OF_RELOBJ
) &&
1564 (IS_LOCALBND(rtype
) || IS_SEG_RELATIVE(rtype
))) {
1566 } else if ((sdp
->sd_ref
== REF_REL_NEED
) &&
1567 ((sdp
->sd_flags
& FLG_SY_CAP
) == 0)) {
1569 * Global symbols may have been individually reduced in
1570 * scope. If the whole object is to be self contained,
1571 * such as when generating an executable or a symbolic
1572 * shared object, make sure all relocation symbol
1573 * references (sections too) are treated locally. Note,
1574 * explicit no-direct symbols should not be bound to
1577 if ((sdp
->sd_flags
&
1578 (FLG_SY_HIDDEN
| FLG_SY_PROTECT
)))
1580 else if ((flags
& FLG_OF_EXEC
) ||
1581 ((flags
& FLG_OF_SYMBOLIC
) &&
1582 ((sdp
->sd_flags
& FLG_SY_NDIR
) == 0))) {
1589 * If this is a PC_RELATIVE relocation, the relocation could be
1590 * compromised if the relocated address is later used as a copy
1591 * relocated symbol (PSARC 1999/636, bugid 4187211). Scan the input
1592 * files symbol table to cross reference this relocation offset.
1594 if ((ofl
->ofl_flags
& FLG_OF_SHAROBJ
) &&
1595 IS_PC_RELATIVE(rtype
) &&
1596 (IS_GOT_PC(rtype
) == 0) &&
1597 (IS_PLT(rtype
) == 0)) {
1598 if (disp_inspect(ofl
, reld
, local
) == S_ERROR
)
1603 * GOT based relocations must bind to the object being built - since
1604 * they are relevant to the current GOT. If not building a relocatable
1605 * object - give a appropriate error message.
1607 if (!local
&& !(flags
& FLG_OF_RELOBJ
) &&
1608 IS_GOT_BASED(rtype
)) {
1609 Ifl_desc
*ifl
= reld
->rel_isdesc
->is_file
;
1611 ld_eprintf(ofl
, ERR_FATAL
, MSG_INTL(MSG_REL_BADGOTBASED
),
1612 conv_reloc_type(ifl
->ifl_ehdr
->e_machine
, rtype
,
1613 0, &inv_buf
), ifl
->ifl_name
, demangle(sdp
->sd_name
));
1618 * TLS symbols can only have TLS relocations.
1620 if ((ELF_ST_TYPE(sdp
->sd_sym
->st_info
) == STT_TLS
) &&
1621 (IS_TLS_INS(rtype
) == 0)) {
1623 * The above test is relaxed if the target section is
1626 if (RELAUX_GET_OSDESC(reld
)->os_shdr
->sh_flags
& SHF_ALLOC
) {
1627 Ifl_desc
*ifl
= reld
->rel_isdesc
->is_file
;
1629 ld_eprintf(ofl
, ERR_FATAL
, MSG_INTL(MSG_REL_BADTLS
),
1630 conv_reloc_type(ifl
->ifl_ehdr
->e_machine
,
1631 rtype
, 0, &inv_buf
), ifl
->ifl_name
,
1632 demangle(sdp
->sd_name
));
1638 * Select the relocation to perform.
1640 if (IS_REGISTER(rtype
)) {
1641 if (ld_targ
.t_mr
.mr_reloc_register
== NULL
) {
1642 ld_eprintf(ofl
, ERR_FATAL
, MSG_INTL(MSG_REL_NOREG
));
1645 return ((*ld_targ
.t_mr
.mr_reloc_register
)(reld
, isp
, ofl
));
1648 if (flags
& FLG_OF_RELOBJ
)
1649 return (reloc_relobj(local
, reld
, ofl
));
1651 if (IS_TLS_INS(rtype
))
1652 return (reloc_TLS(local
, reld
, ofl
));
1654 if (IS_GOT_OPINS(rtype
)) {
1655 if (ld_targ
.t_mr
.mr_reloc_GOTOP
== NULL
) {
1659 return ((*ld_targ
.t_mr
.mr_reloc_GOTOP
)(local
, reld
, ofl
));
1662 if (IS_GOT_RELATIVE(rtype
))
1663 return (ld_reloc_GOT_relative(local
, reld
, ofl
));
1666 return ((*ld_targ
.t_mr
.mr_reloc_local
)(reld
, ofl
));
1668 if ((IS_PLT(rtype
) || ((sdp
->sd_flags
& FLG_SY_CAP
) &&
1669 (ELF_ST_TYPE(sdp
->sd_sym
->st_info
) == STT_FUNC
))) &&
1670 ((flags
& FLG_OF_BFLAG
) == 0))
1671 return (ld_reloc_plt(reld
, ofl
));
1673 if ((sdp
->sd_ref
== REF_REL_NEED
) ||
1674 (flags
& FLG_OF_BFLAG
) || (flags
& FLG_OF_SHAROBJ
) ||
1675 (ELF_ST_TYPE(sdp
->sd_sym
->st_info
) == STT_NOTYPE
))
1676 return ((*ld_targ
.t_mr
.mr_add_outrel
)(NULL
, reld
, ofl
));
1678 if (sdp
->sd_ref
== REF_DYN_NEED
)
1679 return (reloc_exec(reld
, ofl
));
1684 return (reloc_generic(reld
, ofl
));
1688 * Given a relocation that references a local symbol from a discarded COMDAT
1689 * section, replace the symbol with the corresponding symbol from the section
1694 * sdp - Symbol to be replaced. Must be a local symbol (STB_LOCAL).
1695 * reject - Address of variable to receive rejection code
1696 * if no replacement symbol is found.
1699 * Returns address of replacement symbol descriptor if one was
1700 * found, and NULL otherwise. The result is also cached in
1701 * ofl->ofl_sr_cache as an optimization to speed following calls
1702 * for the same value of sdp.
1704 * On success (non-NULL result), *reject is set to RLXREL_REJ_NONE.
1705 * On failure (NULL result), *reject is filled in with a code
1706 * describing the underlying reason.
1709 * The word "COMDAT" is used to refer to actual COMDAT sections, COMDAT
1710 * groups tied together with an SHF_GROUP section, and .gnu.linkonce
1711 * sections which provide a simplified COMDAT requirement. COMDAT
1712 * sections are identified with the FLG_IS_COMDAT section flag.
1714 * In principle, this sort of sloppy relocation remapping is
1715 * a questionable practice. All self-referential sections should
1716 * be in a common SHF_GROUP so that they are all kept or removed
1717 * together. The problem is that there is no way to ensure that the
1718 * two sections are similar enough that the replacement section will
1719 * really supply the correct information. However, we see a couple of
1720 * situations where it is useful to do this: (1) Older Sun C compilers
1721 * generated DWARF sections that would refer to one of the COMDAT
1722 * sections, and (2) gcc, when its GNU linkonce COMDAT feature is enabled.
1723 * It turns out that the GNU ld does these sloppy remappings.
1725 * The GNU ld takes an approach that hard wires special section
1726 * names and treats them specially. We avoid that practice and
1727 * try to get the necessary work done relying only on the ELF
1728 * attributes of the sections and symbols involved. This means
1729 * that our heuristic is somewhat different than theirs, but the
1730 * end result is close enough to solve the same problem.
1732 * gcc is in the process of converting to SHF_GROUP. This will
1733 * eventually phase out the need for sloppy relocations, and
1734 * then this logic won't be needed. In the meantime, relaxed relocation
1735 * processing allows us to interoperate.
1738 sloppy_comdat_reloc(Ofl_desc
*ofl
, Rel_desc
*reld
, Sym_desc
*sdp
,
1745 Conv_inv_buf_t inv_buf
;
1746 Word scnndx
, symscnt
;
1747 Sym_desc
**oldndx
, *rep_sdp
;
1748 const char *is_name
;
1752 * Sloppy relocations are never applied to .eh_frame or
1753 * .gcc_except_table sections. The entries in these sections
1754 * for discarded sections are better left uninitialized.
1756 * We match these sections by name, because on most platforms they
1757 * are SHT_PROGBITS, and cannot be identified otherwise. On amd64
1758 * architectures, .eh_frame is SHT_AMD64_UNWIND, but that is ambiguous
1759 * (.eh_frame_hdr is also SHT_AMD64_UNWIND), so we still match it by
1762 is_name
= reld
->rel_isdesc
->is_name
;
1763 if (((is_name
[1] == 'e') &&
1764 (strcmp(is_name
, MSG_ORIG(MSG_SCN_EHFRAME
)) == 0)) ||
1765 ((is_name
[1] == 'g') &&
1766 (strcmp(is_name
, MSG_ORIG(MSG_SCN_GCC_X_TBL
)) == 0))) {
1767 *reject
= RLXREL_REJ_TARGET
;
1772 * If we looked up the same symbol on the previous call, we can
1773 * return the cached value.
1775 if (sdp
== ofl
->ofl_sr_cache
.sr_osdp
) {
1776 *reject
= ofl
->ofl_sr_cache
.sr_rej
;
1777 return (ofl
->ofl_sr_cache
.sr_rsdp
);
1780 ofl
->ofl_sr_cache
.sr_osdp
= sdp
;
1786 * When a COMDAT section is discarded in favor of another COMDAT
1787 * section, the replacement is recorded in its section descriptor
1788 * (is_comdatkeep). We must validate the replacement before using
1789 * it. The replacement section must:
1790 * - Not have been discarded
1791 * - Have the same size (*)
1792 * - Have the same section type
1793 * - Have the same SHF_GROUP flag setting (either on or off)
1794 * - Must be a COMDAT section of one form or the other.
1796 * (*) One might imagine that the replacement section could be
1797 * larger than the original, rather than the exact size. However,
1798 * we have verified that this is the same policy used by the GNU
1799 * ld. If the sections are not the same size, the chance of them
1800 * being interchangeable drops significantly.
1802 if (((rep_isp
= isp
->is_comdatkeep
) == NULL
) ||
1803 ((rep_isp
->is_flags
& FLG_IS_DISCARD
) != 0) ||
1804 ((rep_isp
->is_flags
& FLG_IS_COMDAT
) == 0) ||
1805 (isp
->is_indata
->d_size
!= rep_isp
->is_indata
->d_size
) ||
1806 (isp
->is_shdr
->sh_type
!= rep_isp
->is_shdr
->sh_type
) ||
1807 ((isp
->is_shdr
->sh_flags
& SHF_GROUP
) !=
1808 (rep_isp
->is_shdr
->sh_flags
& SHF_GROUP
))) {
1809 *reject
= ofl
->ofl_sr_cache
.sr_rej
= RLXREL_REJ_SECTION
;
1810 return (ofl
->ofl_sr_cache
.sr_rsdp
= NULL
);
1814 * We found the kept COMDAT section. Now, look at all of the
1815 * symbols from the input file that contains it to find the
1816 * symbol that corresponds to the one we started with:
1817 * - Hasn't been discarded
1818 * - Has section index of kept section
1819 * - If one symbol has a name, the other must have
1820 * the same name. The st_name field of a symbol
1821 * is 0 if there is no name, and is a string
1822 * table offset otherwise. The string table
1823 * offsets may well not agree --- it is the
1824 * actual string that matters.
1825 * - Type and binding attributes match (st_info)
1826 * - Values match (st_value)
1827 * - Sizes match (st_size)
1828 * - Visibility matches (st_other)
1830 scnndx
= rep_isp
->is_scnndx
;
1831 oldndx
= rep_isp
->is_file
->ifl_oldndx
;
1832 symscnt
= rep_isp
->is_file
->ifl_symscnt
;
1834 rep_sdp
= *oldndx
++;
1835 if ((rep_sdp
== NULL
) || (rep_sdp
->sd_flags
& FLG_SY_ISDISC
) ||
1836 ((rep_sym
= rep_sdp
->sd_sym
)->st_shndx
!= scnndx
) ||
1837 ((sym
->st_name
== 0) != (rep_sym
->st_name
== 0)) ||
1838 ((sym
->st_name
!= 0) &&
1839 (strcmp(sdp
->sd_name
, rep_sdp
->sd_name
) != 0)) ||
1840 (sym
->st_info
!= rep_sym
->st_info
) ||
1841 (sym
->st_value
!= rep_sym
->st_value
) ||
1842 (sym
->st_size
!= rep_sym
->st_size
) ||
1843 (sym
->st_other
!= rep_sym
->st_other
))
1847 if (ofl
->ofl_flags
& FLG_OF_VERBOSE
) {
1848 if (sym
->st_name
!= 0) {
1849 ld_eprintf(ofl
, ERR_WARNING
,
1850 MSG_INTL(MSG_REL_SLOPCDATNAM
),
1851 conv_reloc_type(ifl
->ifl_ehdr
->e_machine
,
1852 reld
->rel_rtype
, 0, &inv_buf
),
1854 EC_WORD(reld
->rel_isdesc
->is_scnndx
),
1855 reld
->rel_isdesc
->is_name
,
1857 EC_WORD(isp
->is_scnndx
), isp
->is_name
,
1858 rep_sdp
->sd_file
->ifl_name
);
1860 ld_eprintf(ofl
, ERR_WARNING
,
1861 MSG_INTL(MSG_REL_SLOPCDATNONAM
),
1862 conv_reloc_type(ifl
->ifl_ehdr
->e_machine
,
1863 reld
->rel_rtype
, 0, &inv_buf
),
1865 EC_WORD(reld
->rel_isdesc
->is_scnndx
),
1866 reld
->rel_isdesc
->is_name
,
1867 EC_WORD(isp
->is_scnndx
), isp
->is_name
,
1868 rep_sdp
->sd_file
->ifl_name
);
1871 DBG_CALL(Dbg_reloc_sloppycomdat(ofl
->ofl_lml
, rep_sdp
));
1872 *reject
= ofl
->ofl_sr_cache
.sr_rej
= RLXREL_REJ_NONE
;
1873 return (ofl
->ofl_sr_cache
.sr_rsdp
= rep_sdp
);
1876 /* If didn't return above, we didn't find it */
1877 *reject
= ofl
->ofl_sr_cache
.sr_rej
= RLXREL_REJ_SYMBOL
;
1878 return (ofl
->ofl_sr_cache
.sr_rsdp
= NULL
);
1882 * Generate relocation descriptor and dispatch
1885 process_reld(Ofl_desc
*ofl
, Is_desc
*isp
, Rel_desc
*reld
, Word rsndx
,
1888 Ifl_desc
*ifl
= isp
->is_file
;
1889 Word rtype
= reld
->rel_rtype
;
1891 Conv_inv_buf_t inv_buf
;
1894 * Make sure the relocation is in the valid range.
1896 if (rtype
>= ld_targ
.t_m
.m_r_num
) {
1897 ld_eprintf(ofl
, ERR_FATAL
, MSG_INTL(MSG_REL_INVALRELT
),
1898 ifl
->ifl_name
, EC_WORD(isp
->is_scnndx
), isp
->is_name
,
1903 ofl
->ofl_entrelscnt
++;
1906 * Special case: a register symbol associated with symbol index 0 is
1907 * initialized (i.e., relocated) to a constant from the r_addend field
1908 * rather than from a symbol value.
1910 if (IS_REGISTER(rtype
) && (rsndx
== 0)) {
1911 reld
->rel_sym
= NULL
;
1912 DBG_CALL(Dbg_reloc_in(ofl
->ofl_lml
, ELF_DBG_LD
,
1913 ld_targ
.t_m
.m_mach
, isp
->is_shdr
->sh_type
,
1914 (void *)reloc
, isp
->is_name
, isp
->is_scnndx
,
1915 ld_reloc_sym_name(reld
)));
1916 if (ld_targ
.t_mr
.mr_reloc_register
== NULL
) {
1917 ld_eprintf(ofl
, ERR_FATAL
, MSG_INTL(MSG_REL_NOREG
));
1920 return ((*ld_targ
.t_mr
.mr_reloc_register
)(reld
, isp
, ofl
));
1924 * If this is a STT_SECTION symbol, make sure the associated
1925 * section has a descriptive non-NULL is_sym_name field that can
1926 * be accessed by ld_reloc_sym_name() to satisfy debugging output
1929 * In principle, we could add this string to every input section
1930 * as it is created, but we defer it until we see a relocation
1931 * symbol that might need it. Not every section will have such
1932 * a relocation, so we create fewer of them this way.
1934 sdp
= reld
->rel_sym
= ifl
->ifl_oldndx
[rsndx
];
1935 if ((sdp
!= NULL
) &&
1936 (ELF_ST_TYPE(sdp
->sd_sym
->st_info
) == STT_SECTION
) &&
1937 (sdp
->sd_isc
!= NULL
) && (sdp
->sd_isc
->is_name
!= NULL
) &&
1938 (sdp
->sd_isc
->is_sym_name
== NULL
) &&
1939 (ld_stt_section_sym_name(sdp
->sd_isc
) == NULL
))
1943 * If for some reason we have a null relocation record issue a
1944 * warning and continue (the compiler folks can get into this
1945 * state some time). Normal users should never see this error.
1947 if (rtype
== ld_targ
.t_m
.m_r_none
) {
1948 DBG_CALL(Dbg_reloc_in(ofl
->ofl_lml
, ELF_DBG_LD
,
1949 ld_targ
.t_m
.m_mach
, ld_targ
.t_m
.m_rel_sht_type
,
1950 (void *)reloc
, isp
->is_name
, isp
->is_scnndx
,
1951 ld_reloc_sym_name(reld
)));
1952 ld_eprintf(ofl
, ERR_WARNING
, MSG_INTL(MSG_REL_NULL
),
1953 ifl
->ifl_name
, EC_WORD(isp
->is_scnndx
), isp
->is_name
);
1957 if (((ofl
->ofl_flags
& FLG_OF_RELOBJ
) == 0) &&
1959 ld_eprintf(ofl
, ERR_FATAL
, MSG_INTL(MSG_REL_NOTSUP
),
1960 conv_reloc_type(ifl
->ifl_ehdr
->e_machine
, rtype
,
1961 0, &inv_buf
), ifl
->ifl_name
, EC_WORD(isp
->is_scnndx
),
1967 * If we are here, we know that the relocation requires reference
1968 * symbol. If no symbol is assigned, this is a fatal error.
1971 ld_eprintf(ofl
, ERR_FATAL
, MSG_INTL(MSG_REL_NOSYMBOL
),
1972 conv_reloc_type(ifl
->ifl_ehdr
->e_machine
, rtype
,
1973 0, &inv_buf
), ifl
->ifl_name
, EC_WORD(isp
->is_scnndx
),
1974 isp
->is_name
, EC_XWORD(reloc
->r_offset
));
1978 if (sdp
->sd_flags
& FLG_SY_IGNORE
)
1982 * If this symbol is part of a DISCARDED section attempt to find another
1985 if (sdp
->sd_flags
& FLG_SY_ISDISC
) {
1986 Sym_desc
*nsdp
= NULL
;
1989 if (ELF_ST_BIND(sdp
->sd_sym
->st_info
) == STB_LOCAL
) {
1991 * If "-z relaxreloc", and the input section is COMDAT
1992 * that has been assigned to an output section, then
1993 * determine if this is a reference to a discarded
1994 * COMDAT section that can be replaced with a COMDAT
1995 * that has been kept.
1997 if ((ofl
->ofl_flags1
& FLG_OF1_RLXREL
) &&
1998 sdp
->sd_isc
->is_osdesc
&&
1999 (sdp
->sd_isc
->is_flags
& FLG_IS_COMDAT
) &&
2000 ((nsdp
= sloppy_comdat_reloc(ofl
, reld
,
2001 sdp
, &reject
)) == NULL
)) {
2002 Shdr
*is_shdr
= reld
->rel_isdesc
->is_shdr
;
2005 * A matching symbol was not found. We will
2006 * ignore this relocation. Determine whether
2007 * or not to issue a warning.
2008 * Warnings are always issued under -z verbose,
2009 * but otherwise, we will follow the lead of
2010 * the GNU ld and suppress them for certain
2013 * - It is a non-allocable debug section.
2014 * The GNU ld tests for these by name,
2015 * but we are willing to extend it to
2016 * any non-allocable section.
2017 * - The target section is excluded from
2018 * sloppy relocations by policy.
2020 if (((ofl
->ofl_flags
& FLG_OF_VERBOSE
) != 0) ||
2021 ((is_shdr
->sh_flags
& SHF_ALLOC
) &&
2022 (reject
!= RLXREL_REJ_TARGET
)))
2023 ld_eprintf(ofl
, ERR_WARNING
,
2024 MSG_INTL(MSG_REL_SLOPCDATNOSYM
),
2026 ifl
->ifl_ehdr
->e_machine
,
2027 reld
->rel_rtype
, 0, &inv_buf
),
2029 EC_WORD(isp
->is_scnndx
),
2031 ld_reloc_sym_name(reld
),
2032 EC_WORD(sdp
->sd_isc
->is_scnndx
),
2033 sdp
->sd_isc
->is_name
);
2036 } else if ((sdp
!= NULL
) && sdp
->sd_name
&& *sdp
->sd_name
)
2037 nsdp
= ld_sym_find(sdp
->sd_name
, SYM_NOHASH
, NULL
, ofl
);
2040 ld_eprintf(ofl
, ERR_FATAL
, MSG_INTL(MSG_REL_SYMDISC
),
2041 conv_reloc_type(ifl
->ifl_ehdr
->e_machine
,
2042 reld
->rel_rtype
, 0, &inv_buf
), ifl
->ifl_name
,
2043 EC_WORD(isp
->is_scnndx
), isp
->is_name
,
2044 ld_reloc_sym_name(reld
),
2045 EC_WORD(sdp
->sd_isc
->is_scnndx
),
2046 sdp
->sd_isc
->is_name
);
2049 ifl
->ifl_oldndx
[rsndx
] = sdp
= nsdp
;
2050 if ((ELF_ST_TYPE(sdp
->sd_sym
->st_info
) == STT_SECTION
) &&
2051 (sdp
->sd_isc
!= NULL
) && (sdp
->sd_isc
->is_name
!= NULL
) &&
2052 (sdp
->sd_isc
->is_sym_name
== NULL
) &&
2053 (ld_stt_section_sym_name(sdp
->sd_isc
) == NULL
))
2058 * If this is a global symbol, determine whether its visibility needs
2061 if (sdp
->sd_aux
&& ((sdp
->sd_flags
& FLG_SY_VISIBLE
) == 0))
2062 ld_sym_adjust_vis(sdp
, ofl
);
2065 * Ignore any relocation against a section that will not be in the
2066 * output file (has been stripped).
2068 if ((sdp
->sd_isc
== 0) &&
2069 (ELF_ST_TYPE(sdp
->sd_sym
->st_info
) == STT_SECTION
))
2073 * If the input section exists, but the section has not been associated
2074 * to an output section, then this is a little suspicious.
2076 if (sdp
->sd_isc
&& (sdp
->sd_isc
->is_osdesc
== 0) &&
2077 (ELF_ST_TYPE(sdp
->sd_sym
->st_info
) == STT_SECTION
)) {
2078 ld_eprintf(ofl
, ERR_WARNING
, MSG_INTL(MSG_RELINVSEC
),
2079 conv_reloc_type(ifl
->ifl_ehdr
->e_machine
, rtype
,
2080 0, &inv_buf
), ifl
->ifl_name
, EC_WORD(isp
->is_scnndx
),
2081 isp
->is_name
, EC_WORD(sdp
->sd_isc
->is_scnndx
),
2082 sdp
->sd_isc
->is_name
);
2087 * If the symbol for this relocation is invalid (which should have
2088 * generated a message during symbol processing), or the relocation
2089 * record's symbol reference is in any other way invalid, then it's
2090 * about time we gave up.
2092 if ((sdp
->sd_flags
& FLG_SY_INVALID
) || (rsndx
== 0) ||
2093 (rsndx
>= ifl
->ifl_symscnt
)) {
2094 ld_eprintf(ofl
, ERR_FATAL
, MSG_INTL(MSG_REL_UNKNWSYM
),
2095 conv_reloc_type(ifl
->ifl_ehdr
->e_machine
, rtype
,
2096 0, &inv_buf
), ifl
->ifl_name
, EC_WORD(isp
->is_scnndx
),
2097 isp
->is_name
, ld_reloc_sym_name(reld
),
2098 EC_XWORD(reloc
->r_offset
), EC_WORD(rsndx
));
2103 * Size relocations against section symbols are presently unsupported.
2104 * There is a question as to whether the input section size, or output
2105 * section size would be used. Until an explicit requirement is
2106 * established for either case, we'll punt.
2108 if (IS_SIZE(rtype
) &&
2109 (ELF_ST_TYPE(sdp
->sd_sym
->st_info
) == STT_SECTION
)) {
2110 ld_eprintf(ofl
, ERR_FATAL
, MSG_INTL(MSG_REL_UNSUPSIZE
),
2111 conv_reloc_type(ifl
->ifl_ehdr
->e_machine
, rtype
,
2112 0, &inv_buf
), ifl
->ifl_name
, EC_WORD(isp
->is_scnndx
),
2117 reld
->rel_sym
= sdp
;
2119 reld
->rel_aux
->ra_usym
= sdp
;
2120 return (ld_process_sym_reloc(ofl
, reld
, reloc
, isp
, isp
->is_name
,
2125 reloc_section(Ofl_desc
*ofl
, Is_desc
*isect
, Is_desc
*rsect
, Os_desc
*osect
)
2127 Rel
*rend
; /* end of relocation section data */
2128 Rel
*reloc
; /* current relocation entry */
2129 Xword rsize
; /* size of relocation section data */
2130 Xword entsize
; /* size of relocation entry */
2131 Rel_desc reld
; /* relocation descriptor */
2137 shdr
= rsect
->is_shdr
;
2138 rsize
= shdr
->sh_size
;
2139 reloc
= (Rel
*)rsect
->is_indata
->d_buf
;
2142 * Decide entry size.
2144 if (((entsize
= shdr
->sh_entsize
) == 0) || (entsize
> rsize
)) {
2145 if (shdr
->sh_type
== SHT_RELA
)
2146 entsize
= sizeof (Rela
);
2148 entsize
= sizeof (Rel
);
2152 * Build up the basic information in for the Rel_desc structure.
2154 reld
.rel_isdesc
= isect
;
2155 reld
.rel_aux
= &rel_aux
;
2156 ld_init_rel_aux(&reld
);
2157 rel_aux
.ra_osdesc
= osect
;
2159 if ((ofl
->ofl_flags
& FLG_OF_RELOBJ
) ||
2160 (osect
&& (osect
->os_sgdesc
->sg_phdr
.p_type
== PT_LOAD
)))
2161 flags
|= FLG_REL_LOAD
;
2163 if (shdr
->sh_info
== 0)
2164 flags
|= FLG_REL_NOINFO
;
2166 DBG_CALL(Dbg_reloc_proc(ofl
->ofl_lml
, osect
, isect
, rsect
));
2168 for (rend
= (Rel
*)((uintptr_t)reloc
+ (uintptr_t)rsize
);
2170 reloc
= (Rel
*)((uintptr_t)reloc
+ (uintptr_t)entsize
)) {
2174 * Initialize the relocation record information and process
2175 * the individual relocation. Reinitialize the flags to
2176 * insure we don't carry any state over from the previous
2177 * relocation records processing.
2179 reld
.rel_flags
= flags
;
2180 rsndx
= (*ld_targ
.t_mr
.mr_init_rel
)(&reld
,
2181 &rel_aux
.ra_typedata
, (void *)reloc
);
2184 * Determine whether or not to pass an auxiliary block
2185 * in with this Rel_desc. It is not needed if both the
2186 * osdesc and typedata fields have default values.
2189 (RELAUX_ISDEFAULT_OSDESC(&reld
, rel_aux
.ra_osdesc
) &&
2190 RELAUX_ISDEFAULT_TYPEDATA(&reld
, rel_aux
.ra_typedata
)) ?
2193 if (process_reld(ofl
, rsect
, &reld
, rsndx
, reloc
) == S_ERROR
)
2200 reloc_segments(int wr_flag
, Ofl_desc
*ofl
)
2206 for (APLIST_TRAVERSE(ofl
->ofl_segs
, idx1
, sgp
)) {
2210 if ((sgp
->sg_phdr
.p_flags
& PF_W
) != wr_flag
)
2213 for (APLIST_TRAVERSE(sgp
->sg_osdescs
, idx2
, osp
)) {
2217 osp
->os_szoutrels
= 0;
2218 for (APLIST_TRAVERSE(osp
->os_relisdescs
, idx3
, risp
)) {
2222 * Determine the input section that this
2223 * relocation information refers to.
2225 indx
= risp
->is_shdr
->sh_info
;
2226 isp
= risp
->is_file
->ifl_isdesc
[indx
];
2229 * Do not process relocations against sections
2230 * which are being discarded (COMDAT)
2232 if (isp
->is_flags
& FLG_IS_DISCARD
)
2235 if (reloc_section(ofl
, isp
, risp
, osp
) ==
2241 * Check for relocations against non-writable
2242 * allocatable sections.
2244 if (osp
->os_szoutrels
&&
2245 (sgp
->sg_phdr
.p_type
== PT_LOAD
) &&
2246 ((sgp
->sg_phdr
.p_flags
& PF_W
) == 0)) {
2247 ofl
->ofl_flags
|= FLG_OF_TEXTREL
;
2248 ofl
->ofl_dtflags
|= DF_TEXTREL
;
2257 * Move Section related function
2261 get_move_entry(Is_desc
*rsect
, Xword roffset
)
2263 Ifl_desc
*ifile
= rsect
->is_file
;
2264 Shdr
*rshdr
= rsect
->is_shdr
;
2271 * Set info for the target move section
2273 misp
= ifile
->ifl_isdesc
[rshdr
->sh_info
];
2274 mshdr
= misp
->is_shdr
;
2276 if (mshdr
->sh_entsize
== 0)
2280 * If this is an invalid entry, return NULL.
2282 midx
= roffset
/ mshdr
->sh_entsize
;
2283 if ((midx
* mshdr
->sh_entsize
) >= mshdr
->sh_size
)
2286 mvp
= (Move
*)misp
->is_indata
->d_buf
;
2292 * Relocation against Move Table.
2295 process_movereloc(Ofl_desc
*ofl
, Is_desc
*rsect
)
2297 Ifl_desc
*file
= rsect
->is_file
;
2299 Xword rsize
, entsize
;
2303 rsize
= rsect
->is_shdr
->sh_size
;
2304 reloc
= (Rel
*)rsect
->is_indata
->d_buf
;
2307 * Decide entry size.
2309 entsize
= rsect
->is_shdr
->sh_entsize
;
2310 if ((entsize
== 0) ||
2311 (entsize
> rsect
->is_shdr
->sh_size
)) {
2312 if (rsect
->is_shdr
->sh_type
== SHT_RELA
)
2313 entsize
= sizeof (Rela
);
2315 entsize
= sizeof (Rel
);
2319 * The requirement for move data ensures that we have to supply a
2320 * Rel_aux auxiliary block.
2322 reld
.rel_aux
= &rel_aux
;
2323 ld_init_rel_aux(&reld
);
2326 * Go through the relocation entries.
2328 for (rend
= (Rel
*)((uintptr_t)reloc
+ (uintptr_t)rsize
);
2330 reloc
= (Rel
*)((uintptr_t)reloc
+ (uintptr_t)entsize
)) {
2336 * Initialize the relocation record information.
2338 reld
.rel_flags
= FLG_REL_LOAD
;
2339 rsndx
= (*ld_targ
.t_mr
.mr_init_rel
)(&reld
,
2340 &rel_aux
.ra_typedata
, (void *)reloc
);
2342 if (((mvp
= get_move_entry(rsect
, reloc
->r_offset
)) == NULL
) ||
2344 libld_malloc(sizeof (Mv_reloc
))) == NULL
))
2347 psdp
= file
->ifl_oldndx
[ELF_M_SYM(mvp
->m_info
)];
2348 rel_aux
.ra_move
->mr_move
= mvp
;
2349 rel_aux
.ra_move
->mr_sym
= psdp
;
2351 if (psdp
->sd_flags
& FLG_SY_PAREXPN
) {
2352 int _num
, num
= mvp
->m_repeat
;
2354 rel_aux
.ra_osdesc
= ofl
->ofl_isparexpn
->is_osdesc
;
2355 reld
.rel_isdesc
= ofl
->ofl_isparexpn
;
2356 reld
.rel_roffset
= mvp
->m_poffset
;
2358 for (_num
= 0; _num
< num
; _num
++) {
2361 (_num
* ELF_M_SIZE(mvp
->m_info
));
2366 if (process_reld(ofl
,
2367 rsect
, &reld
, rsndx
, reloc
) == S_ERROR
)
2374 reld
.rel_flags
|= FLG_REL_MOVETAB
;
2375 rel_aux
.ra_osdesc
= ofl
->ofl_osmove
;
2376 reld
.rel_isdesc
= ld_os_first_isdesc(ofl
->ofl_osmove
);
2378 if (process_reld(ofl
,
2379 rsect
, &reld
, rsndx
, reloc
) == S_ERROR
)
2387 * This function is similar to reloc_init().
2389 * This function is called when the SHT_SUNW_move table is expanded and there
2390 * are relocations against the SHT_SUNW_move section.
2393 reloc_movesections(Ofl_desc
*ofl
)
2400 * Generate/Expand relocation entries
2402 for (APLIST_TRAVERSE(ofl
->ofl_ismoverel
, idx
, risp
)) {
2403 if (process_movereloc(ofl
, risp
) == S_ERROR
)
2411 * Count the number of output relocation entries, global offset table entries,
2412 * and procedure linkage table entries. This function searches the segment and
2413 * outsect lists and passes each input reloc section to process_reloc().
2414 * It allocates space for any output relocations needed. And builds up
2415 * the relocation structures for later processing.
2418 ld_reloc_init(Ofl_desc
*ofl
)
2424 DBG_CALL(Dbg_basic_collect(ofl
->ofl_lml
));
2427 * At this point we have finished processing all input symbols. Make
2428 * sure we add any absolute (internal) symbols before continuing with
2429 * any relocation processing.
2431 if (ld_sym_spec(ofl
) == S_ERROR
)
2434 ofl
->ofl_gotcnt
= ld_targ
.t_m
.m_got_xnumber
;
2437 * Process all of the relocations against NON-writable segments
2438 * followed by relocations against the writable segments.
2440 * This separation is so that when the writable segments are processed
2441 * we know whether or not a COPYRELOC will be produced for any symbols.
2442 * If relocations aren't processed in this order, a COPYRELOC and a
2443 * regular relocation can be produced against the same symbol. The
2444 * regular relocation would be redundant.
2446 if (reloc_segments(0, ofl
) == S_ERROR
)
2449 if (reloc_segments(PF_W
, ofl
) == S_ERROR
)
2453 * Process any extra relocations. These are relocation sections that
2454 * have a NULL sh_info.
2456 for (APLIST_TRAVERSE(ofl
->ofl_extrarels
, idx
, isp
)) {
2457 if (reloc_section(ofl
, NULL
, isp
, NULL
) == S_ERROR
)
2462 * If there were relocation against move table,
2463 * process the relocation sections.
2465 if (reloc_movesections(ofl
) == S_ERROR
)
2469 * Now all the relocations are pre-processed,
2470 * check the validity of copy relocations.
2472 if (ofl
->ofl_copyrels
) {
2475 for (ALIST_TRAVERSE(ofl
->ofl_copyrels
, idx
, crp
)) {
2477 * If there were no displacement relocation
2478 * in this file, don't worry about it.
2480 if (crp
->c_sdp
->sd_file
->ifl_flags
&
2481 (FLG_IF_DISPPEND
| FLG_IF_DISPDONE
))
2482 is_disp_copied(ofl
, crp
);
2487 * GOT sections are created for dynamic executables and shared objects
2488 * if the FLG_OF_BLDGOT is set, or explicit reference has been made to
2491 if (((ofl
->ofl_flags
& FLG_OF_RELOBJ
) == 0) &&
2492 ((ofl
->ofl_flags
& FLG_OF_BLDGOT
) ||
2493 ((((sdp
= ld_sym_find(MSG_ORIG(MSG_SYM_GOFTBL
),
2494 SYM_NOHASH
, NULL
, ofl
)) != NULL
) ||
2495 ((sdp
= ld_sym_find(MSG_ORIG(MSG_SYM_GOFTBL_U
),
2496 SYM_NOHASH
, NULL
, ofl
)) != NULL
)) &&
2497 (sdp
->sd_ref
!= REF_DYN_SEEN
)))) {
2498 if (ld_make_got(ofl
) == S_ERROR
)
2501 /* Allocate the GOT if required by target */
2502 if ((ld_targ
.t_mr
.mr_allocate_got
!= NULL
) &&
2503 ((*ld_targ
.t_mr
.mr_allocate_got
)(ofl
) == S_ERROR
))
2511 * Simple comparison routine to be used by qsort() for
2512 * the sorting of the output relocation list.
2514 * The reloc_compare() routine results in a relocation
2515 * table which is located on:
2517 * file referenced (NEEDED NDX)
2521 * This provides the most efficient traversal of the relocation
2522 * table at run-time.
2525 reloc_compare(Reloc_list
*i
, Reloc_list
*j
)
2529 * first - sort on neededndx
2531 if (i
->rl_key1
> j
->rl_key1
)
2533 if (i
->rl_key1
< j
->rl_key1
)
2537 * Then sort on symbol
2539 if ((uintptr_t)i
->rl_key2
> (uintptr_t)j
->rl_key2
)
2541 if ((uintptr_t)i
->rl_key2
< (uintptr_t)j
->rl_key2
)
2545 * i->key2 == j->key2
2547 * At this point we fall back to key2 (offsets) to
2548 * sort the output relocations. Ideally this will
2549 * make for the most efficient processing of these
2550 * relocations at run-time.
2552 if (i
->rl_key3
> j
->rl_key3
)
2554 if (i
->rl_key3
< j
->rl_key3
)
2560 do_sorted_outrelocs(Ofl_desc
*ofl
)
2565 Reloc_list
*sorted_list
;
2568 uintptr_t error
= 1;
2569 Boolean remain_seen
= FALSE
;
2571 if ((sorted_list
= libld_malloc((size_t)(sizeof (Reloc_list
) *
2572 ofl
->ofl_reloccnt
))) == NULL
)
2576 * All but the PLT output relocations are sorted in the output file
2577 * based upon their sym_desc. By doing this multiple relocations
2578 * against the same symbol are grouped together, thus when the object
2579 * is later relocated by ld.so.1 it will take advantage of the symbol
2580 * cache that ld.so.1 has. This can significantly reduce the runtime
2581 * relocation cost of a dynamic object.
2583 * PLT relocations are not sorted because the order of the PLT
2584 * relocations is used by ld.so.1 to determine what symbol a PLT
2585 * relocation is against.
2587 REL_CACHE_TRAVERSE(&ofl
->ofl_outrels
, idx
, rcbp
, orsp
) {
2589 DBG_CALL(Dbg_reloc_dooutrel(ofl
->ofl_lml
,
2590 ld_targ
.t_m
.m_rel_sht_type
));
2595 * If it's a PLT relocation we output it now in the
2596 * order that it was originally processed.
2598 if (orsp
->rel_flags
& FLG_REL_PLT
) {
2599 if ((*ld_targ
.t_mr
.mr_perform_outreloc
)
2600 (orsp
, ofl
, &remain_seen
) == S_ERROR
)
2605 if ((orsp
->rel_rtype
== ld_targ
.t_m
.m_r_relative
) ||
2606 (orsp
->rel_rtype
== ld_targ
.t_m
.m_r_register
)) {
2607 sorted_list
[index
].rl_key1
= 0;
2608 sorted_list
[index
].rl_key2
=
2610 (Sym_desc
*)(uintptr_t)orsp
->rel_rtype
;
2612 sorted_list
[index
].rl_key1
=
2613 orsp
->rel_sym
->sd_file
->ifl_neededndx
;
2614 sorted_list
[index
].rl_key2
= orsp
->rel_sym
;
2617 if (orsp
->rel_flags
& FLG_REL_GOT
) {
2618 sorted_list
[index
].rl_key3
=
2619 (*ld_targ
.t_mr
.mr_calc_got_offset
)(orsp
, ofl
);
2621 if (orsp
->rel_rtype
== ld_targ
.t_m
.m_r_register
) {
2622 sorted_list
[index
].rl_key3
= 0;
2624 sorted_list
[index
].rl_key3
= orsp
->rel_roffset
+
2625 (Xword
)_elf_getxoff(orsp
->
2626 rel_isdesc
->is_indata
) +
2627 orsp
->rel_isdesc
->is_osdesc
->
2632 sorted_list
[index
++].rl_rsp
= orsp
;
2635 qsort(sorted_list
, (size_t)ofl
->ofl_reloccnt
, sizeof (Reloc_list
),
2636 (int (*)(const void *, const void *))reloc_compare
);
2639 * All output relocations have now been sorted, go through
2640 * and process each relocation.
2642 for (index
= 0; index
< ofl
->ofl_reloccnt
; index
++) {
2643 if ((*ld_targ
.t_mr
.mr_perform_outreloc
)
2644 (sorted_list
[index
].rl_rsp
, ofl
, &remain_seen
) == S_ERROR
)
2648 /* Guidance: Use -z text when building shared objects */
2649 if (remain_seen
&& OFL_GUIDANCE(ofl
, FLG_OFG_NO_TEXT
))
2650 ld_eprintf(ofl
, ERR_GUIDANCE
, MSG_INTL(MSG_GUIDE_TEXT
));
2656 * Process relocations. Finds every input relocation section for each output
2657 * section and invokes reloc_section() to relocate that section.
2660 ld_reloc_process(Ofl_desc
*ofl
)
2665 ofl_flag_t flags
= ofl
->ofl_flags
;
2668 DBG_CALL(Dbg_basic_relocate(ofl
->ofl_lml
));
2671 * Determine the index of the symbol table that will be referenced by
2672 * the relocation entries.
2674 if (OFL_ALLOW_DYNSYM(ofl
))
2676 ndx
= (Word
)elf_ndxscn(ofl
->ofl_osdynsym
->os_scn
);
2677 else if (!(flags
& FLG_OF_STRIP
) || (flags
& FLG_OF_RELOBJ
))
2679 ndx
= (Word
)elf_ndxscn(ofl
->ofl_ossymtab
->os_scn
);
2682 * Re-initialize counters. These are used to provide relocation
2683 * offsets within the output buffers.
2685 ofl
->ofl_relocpltsz
= 0;
2686 ofl
->ofl_relocgotsz
= 0;
2687 ofl
->ofl_relocbsssz
= 0;
2690 * Now that the output file is created and symbol update has occurred,
2691 * process the relocations collected in process_reloc().
2693 if (do_sorted_outrelocs(ofl
) == S_ERROR
)
2696 if ((*ld_targ
.t_mr
.mr_do_activerelocs
)(ofl
) == S_ERROR
)
2699 if ((flags
& FLG_OF_COMREL
) == 0) {
2703 * Process the relocation sections. For each relocation
2704 * section generated for the output image update its shdr
2705 * information to reflect the symbol table it needs (sh_link)
2706 * and the section to which the relocation must be applied
2709 for (APLIST_TRAVERSE(ofl
->ofl_segs
, idx1
, sgp
)) {
2713 for (APLIST_TRAVERSE(sgp
->sg_osdescs
, idx2
, osp
)) {
2714 if (osp
->os_relosdesc
== 0)
2717 shdr
= osp
->os_relosdesc
->os_shdr
;
2718 shdr
->sh_link
= ndx
;
2720 shdr
->sh_info
= (Word
)elf_ndxscn(osp
->os_scn
);
2725 * Since the .rel[a] section is not tied to any specific
2726 * section, we'd not have found it above.
2728 if ((osp
= ofl
->ofl_osrel
) != NULL
) {
2729 shdr
= osp
->os_shdr
;
2730 shdr
->sh_link
= ndx
;
2735 * We only have two relocation sections here, (PLT's,
2736 * coalesced) so just hit them directly instead of stepping
2737 * over the output sections.
2739 if ((osp
= ofl
->ofl_osrelhead
) != NULL
) {
2740 shdr
= osp
->os_shdr
;
2741 shdr
->sh_link
= ndx
;
2744 if (((osp
= ofl
->ofl_osplt
) != NULL
) && osp
->os_relosdesc
) {
2745 shdr
= osp
->os_relosdesc
->os_shdr
;
2746 shdr
->sh_link
= ndx
;
2748 shdr
->sh_info
= (Word
)elf_ndxscn(osp
->os_scn
);
2753 * If the -z text option was given, and we have output relocations
2754 * against a non-writable, allocatable section, issue a diagnostic and
2755 * return (the actual entries that caused this error would have been
2756 * output during the relocating section phase).
2758 if ((flags
& (FLG_OF_PURETXT
| FLG_OF_TEXTREL
)) ==
2759 (FLG_OF_PURETXT
| FLG_OF_TEXTREL
)) {
2760 ld_eprintf(ofl
, ERR_FATAL
, MSG_INTL(MSG_REL_REMAIN_3
));
2765 * Finally, initialize the first got entry with the address of the
2766 * .dynamic section (_DYNAMIC).
2768 if (flags
& FLG_OF_DYNAMIC
) {
2769 if ((*ld_targ
.t_mr
.mr_fillin_gotplt
)(ofl
) == S_ERROR
)
2774 * Now that any GOT information has been written, display the debugging
2775 * information if required.
2777 if ((osp
= ofl
->ofl_osgot
) != NULL
)
2778 DBG_CALL(Dbg_got_display(ofl
, osp
->os_shdr
->sh_addr
, 1,
2779 ld_targ
.t_m
.m_got_xnumber
, ld_targ
.t_m
.m_got_entsize
));
2785 * If the -z text option was given, and we have output relocations against a
2786 * non-writable, allocatable section, issue a diagnostic. Print offending
2787 * symbols in tabular form similar to the way undefined symbols are presented.
2788 * Called from reloc_count(). The actual fatal error condition is triggered on
2789 * in reloc_process() above.
2791 * Note. For historic reasons -ztext is not a default option (however all OS
2792 * shared object builds use this option). It can be argued that this option
2793 * should also be default when generating an a.out (see 1163979). However, if
2794 * an a.out contains text relocations it is either because the user is creating
2795 * something pretty weird (they've used the -b or -znodefs options), or because
2796 * the library against which they're building wasn't constructed correctly (ie.
2797 * a function has a NOTYPE type, in which case the a.out won't generate an
2798 * associated plt). In the latter case the builder of the a.out can't do
2799 * anything to fix the error - thus we've chosen not to give the user an error,
2800 * or warning, for this case.
2803 ld_reloc_remain_entry(Rel_desc
*orsp
, Os_desc
*osp
, Ofl_desc
*ofl
,
2804 Boolean
*remain_seen
)
2810 if (ofl
->ofl_flags1
& FLG_OF1_TEXTOFF
)
2814 * Only give relocation errors against loadable read-only segments.
2816 if ((orsp
->rel_rtype
== ld_targ
.t_m
.m_r_register
) || (!osp
) ||
2817 (osp
->os_sgdesc
->sg_phdr
.p_type
!= PT_LOAD
) ||
2818 (osp
->os_sgdesc
->sg_phdr
.p_flags
& PF_W
))
2822 * If we are in -ztextwarn mode, it's a silent error if a relocation is
2823 * due to a 'WEAK REFERENCE'. This is because if the symbol is not
2824 * provided at run-time we will not perform a text-relocation.
2826 if (((ofl
->ofl_flags
& FLG_OF_PURETXT
) == 0) &&
2827 (ELF_ST_BIND(orsp
->rel_sym
->sd_sym
->st_info
) == STB_WEAK
) &&
2828 (orsp
->rel_sym
->sd_sym
->st_shndx
== SHN_UNDEF
))
2831 if (*remain_seen
== FALSE
) {
2833 * If building with '-ztext' then emit a fatal error. If
2834 * building a executable then only emit a 'warning'.
2836 const char *str1
= (ofl
->ofl_flags
& FLG_OF_PURETXT
) ?
2837 MSG_INTL(MSG_REL_RMN_ITM_11
) : MSG_INTL(MSG_REL_RMN_ITM_13
);
2839 ld_eprintf(ofl
, ERR_NONE
, MSG_INTL(MSG_REL_REMAIN_FMT_1
), str1
,
2840 MSG_INTL(MSG_REL_RMN_ITM_31
), MSG_INTL(MSG_REL_RMN_ITM_12
),
2841 MSG_INTL(MSG_REL_RMN_ITM_2
), MSG_INTL(MSG_REL_RMN_ITM_32
));
2843 *remain_seen
= TRUE
;
2846 ld_eprintf(ofl
, ERR_NONE
, MSG_INTL(MSG_REL_REMAIN_2
),
2847 ld_reloc_sym_name(orsp
), EC_OFF(orsp
->rel_roffset
),
2848 orsp
->rel_isdesc
->is_file
->ifl_name
);
2852 * Generic encapsulation for generating a TLS got index.
2855 ld_assign_got_TLS(Boolean local
, Rel_desc
*rsp
, Ofl_desc
*ofl
, Sym_desc
*sdp
,
2856 Gotndx
*gnp
, Gotref gref
, Word rflag
, Word ortype
, Word rtype1
, Word rtype2
)
2860 if ((*ld_targ
.t_mr
.mr_assign_got_ndx
)(&(sdp
->sd_GOTndxs
), gnp
,
2861 gref
, ofl
, rsp
, sdp
) == S_ERROR
)
2864 rflags
= FLG_REL_GOT
| rflag
;
2866 rflags
|= FLG_REL_SCNNDX
;
2867 rsp
->rel_rtype
= rtype1
;
2869 if ((*ld_targ
.t_mr
.mr_add_outrel
)(rflags
, rsp
, ofl
) == S_ERROR
)
2872 if (local
&& (gref
== GOT_REF_TLSIE
)) {
2874 * If this is a local LE TLS symbol, then the symbol won't be
2875 * available at runtime. The value of the local symbol will
2876 * be placed in the associated got entry, and the got
2877 * relocation is reassigned to a section symbol.
2879 if (ld_add_actrel(rflags
, rsp
, ofl
) == S_ERROR
)
2884 rflags
= FLG_REL_GOT
| rflag
;
2885 rsp
->rel_rtype
= rtype2
;
2888 if (ld_add_actrel(rflags
, rsp
, ofl
) == S_ERROR
)
2891 if ((*ld_targ
.t_mr
.mr_add_outrel
)(rflags
, rsp
, ofl
) ==
2897 rsp
->rel_rtype
= ortype
;
2903 * Move Section related function
2906 newroffset_for_move(Sym_desc
*sdp
, Move
*mvp
, Xword offset1
, Xword
*offset2
)
2912 * Search for matching move entry.
2914 for (ALIST_TRAVERSE(sdp
->sd_move
, idx
, mdp
)) {
2915 if (mdp
->md_move
== mvp
) {
2919 *offset2
= (Xword
)((mdp
->md_oidx
- 1) * sizeof (Move
) +
2920 offset1
% sizeof (Move
));
2927 ld_adj_movereloc(Ofl_desc
*ofl
, Rel_desc
*arsp
)
2929 Move
*move
= arsp
->rel_aux
->ra_move
->mr_move
;
2930 Sym_desc
*psdp
= arsp
->rel_aux
->ra_move
->mr_sym
;
2933 if (arsp
->rel_flags
& FLG_REL_MOVETAB
) {
2935 * We are relocating the move table itself.
2937 newroffset_for_move(psdp
, move
, arsp
->rel_roffset
,
2939 DBG_CALL(Dbg_move_adjmovereloc(ofl
->ofl_lml
, arsp
->rel_roffset
,
2940 newoffset
, psdp
->sd_name
));
2941 arsp
->rel_roffset
= newoffset
;
2944 * We are expanding the partial symbol. So we are generating
2945 * the relocation entry relocating the expanded partial symbol.
2947 arsp
->rel_roffset
+= psdp
->sd_sym
->st_value
-
2948 ofl
->ofl_isparexpn
->is_osdesc
->os_shdr
->sh_addr
;
2949 DBG_CALL(Dbg_move_adjexpandreloc(ofl
->ofl_lml
,
2950 arsp
->rel_roffset
, psdp
->sd_name
));
2955 * Partially Initialized Symbol Handling routines
2956 * For RELA architecture, the second argument is reld->rel_raddend. For REL
2957 * architecure, the second argument is the value stored at the relocation
2961 ld_am_I_partial(Rel_desc
*reld
, Xword val
)
2963 Ifl_desc
*ifile
= reld
->rel_sym
->sd_isc
->is_file
;
2964 int nlocs
= ifile
->ifl_locscnt
, i
;
2966 for (i
= 1; i
< nlocs
; i
++) {
2968 Sym_desc
*symd
= ifile
->ifl_oldndx
[i
];
2970 if ((osym
= symd
->sd_osym
) == 0)
2972 if ((symd
->sd_flags
& FLG_SY_PAREXPN
) == 0)
2974 if ((osym
->st_value
<= val
) &&
2975 (osym
->st_value
+ osym
->st_size
> val
))
2982 * Return True (1) if the code processing the given relocation
2983 * needs to perform byte swapping when accessing the section data.
2986 ld_swap_reloc_data(Ofl_desc
*ofl
, Rel_desc
*rsp
)
2989 * In a cross-link situation where the linker host and target
2990 * have opposite byte orders, it can be necessary to swap bytes
2991 * when doing relocation processing. This is indicated by the
2992 * presence of the FLG_OF1_ENCDIFF flag bit. However, swapping
2993 * is only needed for the section types that libelf doesn't
2994 * automatically xlate.
2996 if ((ofl
->ofl_flags1
& FLG_OF1_ENCDIFF
) != 0) {
2997 switch (RELAUX_GET_OSDESC(rsp
)->os_shdr
->sh_type
) {
3001 case SHT_SPARC_GOTDATA
:
3002 if (ld_targ
.t_m
.m_mach
==
3003 LD_TARG_BYCLASS(EM_SPARC
, EM_SPARCV9
))
3007 case SHT_AMD64_UNWIND
:
3008 if (ld_targ
.t_m
.m_mach
== EM_AMD64
)
3015 * If FLG_OF1_ENCDIFF isn't set, or the section isn't
3016 * progbits (or similar), then no swapping is needed.
3024 * Obtain the current value at the given relocation target.
3027 * ofl - Output file descriptor
3028 * rsp - Relocation record
3029 * data - Pointer to relocation target
3030 * value - Address of variable to recieve value
3033 * The value of the data at the relocation target has
3034 * been stored in value.
3037 ld_reloc_targval_get(Ofl_desc
*ofl
, Rel_desc
*rsp
, uchar_t
*data
, Xword
*value
)
3039 const Rel_entry
*rep
;
3041 rep
= &ld_targ
.t_mr
.mr_reloc_table
[rsp
->rel_rtype
];
3043 switch (rep
->re_fsize
) {
3046 *value
= (Xword
) *((uchar_t
*)data
);
3051 uchar_t
*v_bytes
= (uchar_t
*)&v
;
3053 if (OFL_SWAP_RELOC_DATA(ofl
, rsp
)) {
3054 UL_ASSIGN_BSWAP_HALF(v_bytes
, data
);
3056 UL_ASSIGN_HALF(v_bytes
, data
);
3064 uchar_t
*v_bytes
= (uchar_t
*)&v
;
3066 if (OFL_SWAP_RELOC_DATA(ofl
, rsp
)) {
3067 UL_ASSIGN_BSWAP_WORD(v_bytes
, data
);
3069 UL_ASSIGN_WORD(v_bytes
, data
);
3076 Conv_inv_buf_t inv_buf
;
3077 ld_eprintf(ofl
, ERR_FATAL
, MSG_INTL(MSG_REL_UNSUPSZ
),
3078 conv_reloc_type(ld_targ
.t_m
.m_mach
, rsp
->rel_rtype
,
3079 0, &inv_buf
), rsp
->rel_isdesc
->is_file
->ifl_name
,
3080 ld_reloc_sym_name(rsp
), (int)rep
->re_fsize
);
3089 * Set the value at the given relocation target.
3092 * ofl - Output file descriptor
3093 * rsp - Relocation record
3094 * data - Pointer to relocation target
3095 * value - Address of variable to recieve value
3098 * The value of the data at the relocation target has
3099 * been stored in value.
3102 ld_reloc_targval_set(Ofl_desc
*ofl
, Rel_desc
*rsp
, uchar_t
*data
, Xword value
)
3104 const Rel_entry
*rep
;
3106 rep
= &ld_targ
.t_mr
.mr_reloc_table
[rsp
->rel_rtype
];
3108 switch (rep
->re_fsize
) {
3111 *((uchar_t
*)data
) = (uchar_t
)value
;
3115 Half v
= (Half
)value
;
3116 uchar_t
*v_bytes
= (uchar_t
*)&v
;
3118 if (OFL_SWAP_RELOC_DATA(ofl
, rsp
)) {
3119 UL_ASSIGN_BSWAP_HALF(data
, v_bytes
);
3121 UL_ASSIGN_HALF(data
, v_bytes
);
3127 Word v
= (Word
)value
;
3128 uchar_t
*v_bytes
= (uchar_t
*)&v
;
3130 if (OFL_SWAP_RELOC_DATA(ofl
, rsp
)) {
3131 UL_ASSIGN_BSWAP_WORD(data
, v_bytes
);
3133 UL_ASSIGN_WORD(data
, v_bytes
);
3139 Conv_inv_buf_t inv_buf
;
3140 ld_eprintf(ofl
, ERR_FATAL
, MSG_INTL(MSG_REL_UNSUPSZ
),
3141 conv_reloc_type(ld_targ
.t_m
.m_mach
, rsp
->rel_rtype
,
3142 0, &inv_buf
), rsp
->rel_isdesc
->is_file
->ifl_name
,
3143 ld_reloc_sym_name(rsp
), (int)rep
->re_fsize
);
3152 * Because of the combinations of 32-bit lib providing 64-bit support, and
3153 * visa-versa, the use of krtld's dorelocs can result in differing message
3154 * requirements that make msg.c/msg.h creation and chkmsg "interesting".
3155 * Thus the actual message files contain a couple of entries to satisfy
3156 * each architectures build. Here we add dummy calls to quieten chkmsg.
3158 * chkmsg: MSG_INTL(MSG_REL_NOFIT)
3159 * chkmsg: MSG_INTL(MSG_REL_NONALIGN)