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) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
24 * Copyright 2014 Nexenta Systems, Inc.
29 #include <sys/types.h>
37 * A EH_FRAME_HDR consists of the following:
40 * --------------------------------
41 * unsigned byte version
42 * unsigned byte eh_frame_ptr_enc
43 * unsigned byte fde_count_enc
44 * unsigned byte table_enc
45 * encoded eh_frame_ptr
47 * [ binary search table ]
49 * The binary search table entries each consists of:
51 * encoded initial_func_loc
54 * The entries in the binary search table are sorted
55 * in a increasing order by the initial location.
60 * Version of the .eh_frame_hdr format. This value shall be 1.
64 * The encoding format of the eh_frame_ptr field. For shared
65 * libraries the encoding must be
66 * DW_EH_PE_sdata4|DW_EH_PE_pcrel or
67 * DW_EH_PE_sdata4|DW_EH_PE_datarel.
72 * The encoding format of the fde_count field. A value of
73 * DW_EH_PE_omit indicates the binary search table is not
78 * The encoding format of the entries in the binary search
79 * table. A value of DW_EH_PE_omit indicates the binary search
80 * table is not present. For shared libraries the encoding
81 * must be DW_EH_PE_sdata4|DW_EH_PE_pcrel or
82 * DW_EH_PE_sdata4|DW_EH_PE_datarel.
87 * The encoded value of the pointer to the start of the
92 * The encoded value of the count of entries in the binary
97 * A binary search table containing fde_count entries. Each
98 * entry of the table consist of two encoded values, the
99 * initial location of the function to which an FDE applies,
100 * and the address of the FDE. The entries are sorted in an
101 * increasing order by the initial location value.
110 * The call frame information needed for unwinding the stack is output in
111 * an ELF section(s) of type SHT_AMD64_UNWIND (amd64) or SHT_PROGBITS (other).
112 * In the simplest case there will be one such section per object file and it
113 * will be named ".eh_frame". An .eh_frame section consists of one or more
114 * subsections. Each subsection contains a CIE (Common Information Entry)
115 * followed by varying number of FDEs (Frame Descriptor Entry). A FDE
116 * corresponds to an explicit or compiler generated function in a
117 * compilation unit, all FDEs can access the CIE that begins their
118 * subsection for data.
120 * If an object file contains C++ template instantiations, there shall be
121 * a separate CIE immediately preceding each FDE corresponding to an
124 * Using the preferred encoding specified below, the .eh_frame section can
125 * be entirely resolved at link time and thus can become part of the
128 * .eh_frame Section Layout
129 * ------------------------
131 * EH_PE encoding below refers to the pointer encoding as specified in the
132 * enhanced LSB Chapter 7 for Eh_Frame_Hdr.
134 * Common Information Entry (CIE)
135 * ------------------------------
136 * CIE has the following format:
140 * Field Byte Description
141 * ----- ------ -----------
142 * 1. Length 4 Length of CIE (not including
143 * this 4-byte field).
145 * 2. CIE id 4 Value Zero (0) for .eh_frame
146 * (used to distinguish CIEs and
147 * FDEs when scanning the section)
149 * 3. Version 1 Value One (1)
151 * 4. CIE Augmentation string Null-terminated string with legal
152 * values being "" or 'z' optionally
153 * followed by single occurrences of
154 * 'P', 'L', or 'R' in any order.
155 * String The presence of character(s) in the
156 * string dictates the content of
157 * field 8, the Augmentation Section.
158 * Each character has one or two
159 * associated operands in the AS.
160 * Operand order depends on
161 * position in the string ('z' must
164 * 5. Code Align Factor uleb128 To be multiplied with the
165 * "Advance Location" instructions in
166 * the Call Frame Instructions
168 * 6. Data Align Factor sleb128 To be multiplied with all offset
169 * in the Call Frame Instructions
171 * 7. Ret Address Reg 1 A "virtual" register representation
172 * of the return address. In Dwarf V2,
173 * this is a byte, otherwise it is
174 * uleb128. It is a byte in gcc 3.3.x
176 * 8. Optional CIE varying Present if Augmentation String in
177 * Augmentation Section field 4 is not 0.
180 * size uleb128 Length of the remainder of the
181 * Augmentation Section
184 * personality_enc 1 Encoding specifier - preferred
185 * value is a pc-relative, signed
189 * personality routine (encoded) Encoded pointer to personality
190 * routine (actually to the PLT
191 * entry for the personality
194 * code_enc 1 Non-default encoding for the
195 * code-pointers (FDE members
196 * "initial_location" and "address_range"
197 * and the operand for DW_CFA_set_loc)
198 * - preferred value is pc-relative,
201 * lsda_enc 1 FDE augmentation bodies may contain
202 * LSDA pointers. If so they are
203 * encoded as specified here -
204 * preferred value is pc-relative,
205 * signed 4-byte possibly indirect
209 * 9. Optional Call Frame varying
212 * The size of the optional call frame instruction area must be computed
213 * based on the overall size and the offset reached while scanning the
214 * preceding fields of the CIE.
217 * Frame Descriptor Entry (FDE)
218 * ----------------------------
219 * FDE has the following format:
223 * Field Byte Description
224 * ----- ------ -----------
225 * 1. Length 4 Length of remainder of this FDE
227 * 2. CIE Pointer 4 Distance from this field to the
228 * nearest preceding CIE
229 * (uthe value is subtracted from the
230 * current address). This value
231 * can never be zero and thus can
232 * be used to distinguish CIE's and
233 * FDE's when scanning the
236 * 3. Initial Location varying Reference to the function code
237 * corresponding to this FDE.
238 * If 'R' is missing from the CIE
239 * Augmentation String, the field is an
240 * 8-byte absolute pointer. Otherwise,
241 * the corresponding EH_PE encoding in the
242 * CIE Augmentation Section is used to
243 * interpret the reference.
245 * 4. Address Range varying Size of the function code corresponding
247 * If 'R' is missing from the CIE
248 * Augmentation String, the field is an
249 * 8-byte unsigned number. Otherwise,
250 * the size is determined by the
251 * corresponding EH_PE encoding in the
252 * CIE Augmentation Section (the
253 * value is always absolute).
255 * 5. Optional FDE varying present if CIE augmentation
256 * Augmentation Section string is non-empty.
260 * length uleb128 length of the remainder of the
261 * FDE augmentation section
264 * 'L' (and length > 0):
265 * LSDA varying LSDA pointer, encoded in the
266 * format specified by the
267 * corresponding operand in the CIE's
270 * 6. Optional Call varying
273 * The size of the optional call frame instruction area must be computed
274 * based on the overall size and the offset reached while scanning the
275 * preceding fields of the FDE.
277 * The overall size of a .eh_frame section is given in the ELF section
278 * header. The only way to determine the number of entries is to scan
279 * the section till the end and count.
287 extract_uint(const uchar_t
*data
, uint64_t *ndx
, int do_swap
)
290 uchar_t
*p
= (uchar_t
*)&r
;
294 UL_ASSIGN_BSWAP_WORD(p
, data
);
296 UL_ASSIGN_WORD(p
, data
);
303 * Create an unwind header (.eh_frame_hdr) output section.
304 * The section is created and space reserved, but the data
305 * is not copied into place. That is done by a later call
306 * to ld_unwind_populate(), after active relocations have been
309 * When GNU linkonce processing is in effect, we can end up in a situation
310 * where the FDEs related to discarded sections remain in the eh_frame
311 * section. Ideally, we would remove these dead entries from eh_frame.
312 * However, that optimization has not yet been implemented. In the current
313 * implementation, the number of dead FDEs cannot be determined until
314 * active relocations are processed, and that processing follows the
315 * call to this function. This means that we are unable to detect dead FDEs
316 * here, and the section created by this routine is sized for maximum case
317 * where all FDEs are valid.
320 ld_unwind_make_hdr(Ofl_desc
*ofl
)
322 int bswap
= (ofl
->ofl_flags1
& FLG_OF1_ENCDIFF
) != 0;
332 * we only build a unwind header if we have
333 * some unwind information in the file.
335 if (ofl
->ofl_unwind
== NULL
)
339 * Allocate and initialize the Elf_Data structure.
341 if ((elfdata
= libld_calloc(sizeof (Elf_Data
), 1)) == NULL
)
343 elfdata
->d_type
= ELF_T_BYTE
;
344 elfdata
->d_align
= ld_targ
.t_m
.m_word_align
;
345 elfdata
->d_version
= ofl
->ofl_dehdr
->e_version
;
348 * Allocate and initialize the Shdr structure.
350 if ((shdr
= libld_calloc(sizeof (Shdr
), 1)) == NULL
)
352 shdr
->sh_type
= ld_targ
.t_m
.m_sht_unwind
;
353 shdr
->sh_flags
= SHF_ALLOC
;
354 shdr
->sh_addralign
= ld_targ
.t_m
.m_word_align
;
355 shdr
->sh_entsize
= 0;
358 * Allocate and initialize the Is_desc structure.
360 if ((isp
= libld_calloc(1, sizeof (Is_desc
))) == NULL
)
362 isp
->is_name
= MSG_ORIG(MSG_SCN_UNWINDHDR
);
364 isp
->is_indata
= elfdata
;
366 if ((ofl
->ofl_unwindhdr
= ld_place_section(ofl
, isp
, NULL
,
367 ld_targ
.t_id
.id_unwindhdr
, NULL
)) == (Os_desc
*)S_ERROR
)
371 * Scan through all of the input Frame information, counting each FDE
372 * that requires an index. Each fde_entry gets a corresponding entry
373 * in the binary search table.
376 for (APLIST_TRAVERSE(ofl
->ofl_unwind
, idx1
, osp
)) {
380 OS_ISDESCS_TRAVERSE(os_isdescs_idx
, osp
, idx2
, isp
) {
384 data
= isp
->is_indata
->d_buf
;
385 size
= isp
->is_indata
->d_size
;
392 * Extract length in lsb format. A zero length
393 * indicates that this CIE is a terminator and
394 * that processing for unwind information is
397 length
= extract_uint(data
+ off
, &ndx
, bswap
);
402 * Extract CIE id in lsb format.
404 id
= extract_uint(data
+ off
, &ndx
, bswap
);
407 * A CIE record has a id of '0', otherwise
408 * this is a FDE entry and the 'id' is the
413 cieversion
= data
[off
+ ndx
];
416 if (cieversion
!= 1 && cieversion
!= 3) {
417 ld_eprintf(ofl
, ERR_FATAL
,
418 MSG_INTL(MSG_UNW_BADCIEVERS
),
419 isp
->is_file
->ifl_name
,
435 * byte eh_frame_ptr_enc +1
436 * byte fde_count_enc +1
438 * 4 bytes eh_frame_ptr +4
439 * 4 bytes fde_count +4
440 * [4 bytes] [4bytes] * fde_count ...
442 size
= 12 + (8 * fde_cnt
);
444 if ((elfdata
->d_buf
= libld_calloc(size
, 1)) == NULL
)
446 elfdata
->d_size
= size
;
447 shdr
->sh_size
= (Xword
)size
;
453 * the comparator function needs to calculate
454 * the actual 'initloc' of a bintab entry - to
455 * do this we initialize the following global to point
458 static Addr framehdr_addr
;
461 bintabcompare(const void *p1
, const void *p2
)
463 uint_t
*bintab1
, *bintab2
;
466 bintab1
= (uint_t
*)p1
;
467 bintab2
= (uint_t
*)p2
;
469 assert(bintab1
!= 0);
470 assert(bintab2
!= 0);
472 ent1
= *bintab1
+ framehdr_addr
;
473 ent2
= *bintab2
+ framehdr_addr
;
483 ld_unwind_populate_hdr(Ofl_desc
*ofl
)
492 Os_desc
*first_unwind
;
495 int bswap
= (ofl
->ofl_flags1
& FLG_OF1_ENCDIFF
) != 0;
498 * Are we building the unwind hdr?
500 if ((hdrosp
= ofl
->ofl_unwindhdr
) == 0)
503 hdrdata
= hdrosp
->os_outdata
->d_buf
;
504 hdraddr
= hdrosp
->os_shdr
->sh_addr
;
510 hdrdata
[hdroff
++] = 1;
514 * eh_frameptr_enc sdata4 | pcrel
515 * fde_count_enc udata4
516 * table_enc sdata4 | datarel
518 hdrdata
[hdroff
++] = DW_EH_PE_sdata4
| DW_EH_PE_pcrel
;
519 hdrdata
[hdroff
++] = DW_EH_PE_udata4
;
520 hdrdata
[hdroff
++] = DW_EH_PE_sdata4
| DW_EH_PE_datarel
;
524 * -----------------------------------
526 * byte eh_frame_ptr_enc +1
527 * byte fde_count_enc +1
529 * 4 bytes eh_frame_ptr +4
530 * 4 bytes fde_count +4
533 binarytable
= (uint_t
*)(hdrdata
+ 12);
537 for (APLIST_TRAVERSE(ofl
->ofl_unwind
, idx
, osp
)) {
540 uint64_t off
= 0, ujunk
;
542 uint_t cieRflag
= 0, ciePflag
= 0;
546 * remember first UNWIND section to
547 * point to in the frame_ptr entry.
549 if (first_unwind
== 0)
552 data
= osp
->os_outdata
->d_buf
;
554 size
= shdr
->sh_size
;
561 * Extract length in lsb format. A zero length
562 * indicates that this CIE is a terminator and that
563 * processing of unwind information is complete.
565 length
= extract_uint(data
+ off
, &ndx
, bswap
);
570 * Extract CIE id in lsb format.
572 id
= extract_uint(data
+ off
, &ndx
, bswap
);
575 * A CIE record has a id of '0'; otherwise
576 * this is a FDE entry and the 'id' is the
587 * We need to drill through the CIE
588 * to find the Rflag. It's the Rflag
589 * which describes how the FDE code-pointers
593 cieversion
= data
[off
+ ndx
];
599 cieaugstr
= (char *)(&data
[off
+ ndx
]);
600 ndx
+= strlen(cieaugstr
) + 1;
605 if (uleb_extract(&data
[off
], &ndx
,
606 size
- off
, &ujunk
) == DW_OVERFLOW
) {
607 ld_eprintf(ofl
, ERR_FATAL
,
608 MSG_INTL(MSG_SCN_DWFOVRFLW
),
614 if (sleb_extract(&data
[off
], &ndx
,
615 size
- off
, &sjunk
) == DW_OVERFLOW
) {
616 ld_eprintf(ofl
, ERR_FATAL
,
617 MSG_INTL(MSG_SCN_DWFOVRFLW
),
626 if (cieversion
== 1) {
629 if (uleb_extract(&data
[off
], &ndx
,
630 size
- off
, &ujunk
) ==
632 ld_eprintf(ofl
, ERR_FATAL
,
633 MSG_INTL(MSG_SCN_DWFOVRFLW
),
640 * we walk through the augmentation
641 * section now looking for the Rflag
643 for (cieaugndx
= 0; cieaugstr
[cieaugndx
];
646 switch (cieaugstr
[cieaugndx
]) {
649 if (uleb_extract(&data
[off
],
650 &ndx
, size
- off
, &ujunk
) ==
652 ld_eprintf(ofl
, ERR_FATAL
,
653 MSG_INTL(MSG_SCN_DWFOVRFLW
),
661 ciePflag
= data
[off
+ ndx
];
664 * Just need to extract the
665 * value to move on to the next
668 switch (dwarf_ehe_extract(
669 &data
[off
], size
- off
,
670 &ndx
, &ujunk
, ciePflag
,
671 ofl
->ofl_dehdr
->e_ident
, B_FALSE
,
672 shdr
->sh_addr
, off
+ ndx
, 0)) {
674 ld_eprintf(ofl
, ERR_FATAL
,
675 MSG_INTL(MSG_SCN_DWFOVRFLW
),
679 case DW_BAD_ENCODING
:
680 ld_eprintf(ofl
, ERR_FATAL
,
681 MSG_INTL(MSG_SCN_DWFBADENC
),
683 osp
->os_name
, ciePflag
);
691 cieRflag
= data
[off
+ ndx
];
705 uint64_t gotaddr
= 0;
707 if (ofl
->ofl_osgot
!= NULL
)
709 ofl
->ofl_osgot
->os_shdr
->sh_addr
;
711 switch (dwarf_ehe_extract(&data
[off
],
712 size
- off
, &ndx
, &initloc
, cieRflag
,
713 ofl
->ofl_dehdr
->e_ident
, B_FALSE
,
714 shdr
->sh_addr
, off
+ ndx
, gotaddr
)) {
716 ld_eprintf(ofl
, ERR_FATAL
,
717 MSG_INTL(MSG_SCN_DWFOVRFLW
),
721 case DW_BAD_ENCODING
:
722 ld_eprintf(ofl
, ERR_FATAL
,
723 MSG_INTL(MSG_SCN_DWFBADENC
),
725 osp
->os_name
, cieRflag
);
732 * Ignore FDEs with initloc set to 0.
733 * initloc will not be 0 unless this FDE was
734 * abandoned due to GNU linkonce processing.
735 * The 0 value occurs because we don't resolve
736 * sloppy relocations for unwind header target
740 bintabndx
= fde_count
* 2;
744 * FDEaddr is adjusted
745 * to account for the length & id which
746 * have already been consumed.
748 fdeaddr
= shdr
->sh_addr
+ off
;
750 binarytable
[bintabndx
] =
751 (uint_t
)(initloc
- hdraddr
);
752 binarytable
[bintabndx
+ 1] =
753 (uint_t
)(fdeaddr
- hdraddr
);
758 * the length does not include the length
759 * itself - so account for that too.
767 * Do a quicksort on the binary table. If this is a cross
768 * link from a system with the opposite byte order, xlate
769 * the resulting values into LSB order.
771 framehdr_addr
= hdraddr
;
772 qsort((void *)binarytable
, (size_t)fde_count
,
773 (size_t)(sizeof (uint_t
) * 2), bintabcompare
);
775 uint_t
*btable
= binarytable
;
778 for (cnt
= fde_count
* 2; cnt
-- > 0; btable
++)
779 *btable
= ld_bswap_Word(*btable
);
789 uint_ptr
= (uint_t
*)(&hdrdata
[hdroff
]);
790 *uint_ptr
= first_unwind
->os_shdr
->sh_addr
-
791 (hdrosp
->os_shdr
->sh_addr
+ hdroff
);
793 *uint_ptr
= ld_bswap_Word(*uint_ptr
);
797 uint_ptr
= (uint_t
*)&hdrdata
[hdroff
];
798 *uint_ptr
= fde_count
;
800 *uint_ptr
= ld_bswap_Word(*uint_ptr
);
803 * If relaxed relocations are active, then there is a chance
804 * that we didn't use all the space reserved for this section.
805 * For details, see the note at head of ld_unwind_make_hdr() above.
807 * Find the PT_SUNW_UNWIND program header, and change the size values
808 * to the size of the subset of the section that was actually used.
810 if (ofl
->ofl_flags1
& FLG_OF1_RLXREL
) {
811 Word phnum
= ofl
->ofl_nehdr
->e_phnum
;
812 Phdr
*phdr
= ofl
->ofl_phdr
;
814 for (; phnum
-- > 0; phdr
++) {
815 if (phdr
->p_type
== PT_SUNW_UNWIND
) {
816 phdr
->p_memsz
= 12 + (8 * fde_count
);
817 phdr
->p_filesz
= phdr
->p_memsz
;
827 * Append an .eh_frame section to our output list if not already present.
829 * Usually, there is a single .eh_frame output section. However, there can
830 * be more if there are incompatible section flags on incoming sections.
831 * If this does happen, the frame_ptr field of the eh_frame_hdr section
832 * will point at the base of the first output section, and the other
833 * sections will not be accessible via frame_ptr. However, the .eh_frame_hdr
834 * will be able to access all the data in the different .eh_frame sections,
835 * because the entries in sorted table are all encoded as DW_EH_PE_datarel.
838 ld_unwind_register(Os_desc
*osp
, Ofl_desc
* ofl
)
843 * Check to see if this output section is already
846 for (APLIST_TRAVERSE(ofl
->ofl_unwind
, idx
, _osp
))
851 * Append output section to unwind list
853 if (aplist_append(&ofl
->ofl_unwind
, osp
, AL_CNT_OFL_UNWIND
) == NULL
)