#include <_libelf.h>
#include <dwarf.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <strings.h>
#include <debug.h>
#include <conv.h>
#include <msg.h>
#include <_elfdump.h>
typedef struct {
const char *file;
const char *sh_name;
Half e_machine;
uchar_t *e_ident;
uint64_t sh_addr;
int do_swap;
int cieRflag;
uint64_t ciecalign;
int64_t ciedalign;
uint64_t fdeinitloc;
uint64_t gotaddr;
} dump_cfi_state_t;
static dwarf_error_t
dwarf_extract_uint(uchar_t *data, size_t len, uint64_t *ndx, int size,
int do_swap, uint64_t *ret)
{
if (((*ndx + size) > len) ||
((*ndx + size) < *ndx))
return (DW_OVERFLOW);
switch (size) {
case 1:
*ret = (data[(*ndx)++]);
return (DW_SUCCESS);
case 2:
{
Half r;
uchar_t *p = (uchar_t *)&r;
data += *ndx;
if (do_swap)
UL_ASSIGN_BSWAP_HALF(p, data);
else
UL_ASSIGN_HALF(p, data);
(*ndx) += 2;
*ret = r;
return (DW_SUCCESS);
}
case 4:
{
Word r;
uchar_t *p = (uchar_t *)&r;
data += *ndx;
if (do_swap)
UL_ASSIGN_BSWAP_WORD(p, data);
else
UL_ASSIGN_WORD(p, data);
(*ndx) += 4;
*ret = r;
return (DW_SUCCESS);
}
case 8:
{
uint64_t r;
uchar_t *p = (uchar_t *)&r;
data += *ndx;
if (do_swap)
UL_ASSIGN_BSWAP_LWORD(p, data);
else
UL_ASSIGN_LWORD(p, data);
(*ndx) += 8;
*ret = r;
return (DW_SUCCESS);
}
default:
return (DW_BAD_ENCODING);
}
}
static const char *
dwarf_regname(Half mach, int regno, char *buf, size_t bufsize)
{
Conv_inv_buf_t inv_buf;
const char *name;
int good_name;
name = conv_dwarf_regname(mach, regno, 0, &good_name, &inv_buf);
if (good_name)
(void) snprintf(buf, bufsize, MSG_ORIG(MSG_REG_FMT_NAME),
regno, name);
else
(void) snprintf(buf, bufsize, MSG_ORIG(MSG_REG_FMT_BASIC),
regno);
return (buf);
}
static void
dump_cfi(uchar_t *data, uint64_t off, uint64_t *ndx, uint_t len,
dump_cfi_state_t *state, const char *msg, int indent)
{
#define PREFIX indent, MSG_ORIG(MSG_STR_EMPTY), opname
#define REGNAME(_rnum, _buf) \
dwarf_regname(state->e_machine, _rnum, _buf, sizeof (_buf))
#define LOW_OP(_op) (_op & 0x3f)
char rbuf1[32], rbuf2[32];
Conv_inv_buf_t inv_buf;
uchar_t op;
const char *opname;
uint64_t oper1, oper2, cur_pc;
int64_t soper;
const char *loc_str;
int i;
dbg_print(0, msg);
len += 4;
cur_pc = state->fdeinitloc;
loc_str = MSG_ORIG(MSG_STR_INITLOC);
while (*ndx < len) {
op = data[off + (*ndx)++];
opname = conv_dwarf_cfa(op, 0, &inv_buf);
switch (op >> 6) {
case 0x1:
oper1 = state->ciecalign * LOW_OP(op);
cur_pc += oper1;
dbg_print(0, MSG_ORIG(MSG_CFA_ADV_LOC), PREFIX,
loc_str, EC_XWORD(oper1), EC_XWORD(cur_pc));
loc_str = MSG_ORIG(MSG_STR_LOC);
continue;
case 0x2:
if (uleb_extract(&data[off], ndx, len, &oper1) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
oper1 *= state->ciedalign;
dbg_print(0, MSG_ORIG(MSG_CFA_CFAOFF), PREFIX,
REGNAME(LOW_OP(op), rbuf1), EC_XWORD(oper1));
continue;
case 0x3:
dbg_print(0, MSG_ORIG(MSG_CFA_REG), PREFIX,
REGNAME(LOW_OP(op), rbuf1));
continue;
}
switch (op) {
case 0x00:
for (i = 1;
(*ndx < len) && (data[off + *ndx] == 0);
i++, (*ndx)++)
;
dbg_print(0, MSG_ORIG(MSG_CFA_SIMPLEREP), PREFIX, i);
break;
case 0x0a:
case 0x0b:
case 0x2d:
dbg_print(0, MSG_ORIG(MSG_CFA_SIMPLE), PREFIX);
break;
case 0x01:
switch (dwarf_ehe_extract(&data[off], len, ndx,
&cur_pc, state->cieRflag, state->e_ident, B_FALSE,
state->sh_addr, off + *ndx, state->gotaddr)) {
case DW_OVERFLOW:
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
case DW_BAD_ENCODING:
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWBADENC),
state->file, state->sh_name,
state->cieRflag);
return;
case DW_SUCCESS:
break;
}
dbg_print(0, MSG_ORIG(MSG_CFA_CFASET), PREFIX,
EC_XWORD(cur_pc));
break;
case 0x02:
case 0x03:
case 0x04:
i = 1 << (op - 0x02);
switch (dwarf_extract_uint(data + off, len,
ndx, i, state->do_swap, &oper1)) {
case DW_BAD_ENCODING:
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWBADENC),
state->file, state->sh_name,
i);
return;
case DW_OVERFLOW:
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
case DW_SUCCESS:
break;
}
oper1 *= state->ciecalign;
cur_pc += oper1;
dbg_print(0, MSG_ORIG(MSG_CFA_ADV_LOC), PREFIX,
loc_str, EC_XWORD(oper1), EC_XWORD(cur_pc));
loc_str = MSG_ORIG(MSG_STR_LOC);
break;
case 0x05:
if (uleb_extract(&data[off], ndx, len, &oper1) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
if (sleb_extract(&data[off], ndx, len, &soper) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
soper *= state->ciedalign;
dbg_print(0, MSG_ORIG(MSG_CFA_CFAOFF), PREFIX,
REGNAME(oper1, rbuf1), EC_SXWORD(soper));
break;
case 0x06:
case 0x0d:
case 0x08:
case 0x07:
if (uleb_extract(&data[off], ndx, len, &oper1) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
dbg_print(0, MSG_ORIG(MSG_CFA_REG), PREFIX,
REGNAME(oper1, rbuf1));
break;
case 0x09:
if (uleb_extract(&data[off], ndx, len, &oper1) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
if (uleb_extract(&data[off], ndx, len, &oper2) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
dbg_print(0, MSG_ORIG(MSG_CFA_REG_REG), PREFIX,
REGNAME(oper1, rbuf1), REGNAME(oper2, rbuf2));
break;
case 0x0c:
if (uleb_extract(&data[off], ndx, len, &oper1) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
if (uleb_extract(&data[off], ndx, len, &oper2) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
dbg_print(0, MSG_ORIG(MSG_CFA_REG_OFFLLU), PREFIX,
REGNAME(oper1, rbuf1), EC_XWORD(oper2));
break;
case 0x0e:
if (uleb_extract(&data[off], ndx, len, &oper1) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
dbg_print(0, MSG_ORIG(MSG_CFA_LLU), PREFIX,
EC_XWORD(oper1));
break;
case 0x0f:
if (uleb_extract(&data[off], ndx, len, &oper1) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
dbg_print(0, MSG_ORIG(MSG_CFA_EBLK), PREFIX,
EC_XWORD(oper1));
*ndx += oper1;
break;
case 0x10:
case 0x16:
if (uleb_extract(&data[off], ndx, len, &oper1) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
if (uleb_extract(&data[off], ndx, len, &oper2) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
dbg_print(0, MSG_ORIG(MSG_CFA_REG_EBLK), PREFIX,
REGNAME(oper1, rbuf1), EC_XWORD(oper2));
*ndx += oper2;
break;
case 0x11:
if (uleb_extract(&data[off], ndx, len, &oper1) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
if (sleb_extract(&data[off], ndx, len, &soper) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
soper *= state->ciedalign;
dbg_print(0, MSG_ORIG(MSG_CFA_CFAOFF), PREFIX,
REGNAME(oper1, rbuf1), EC_SXWORD(soper));
break;
case 0x12:
if (uleb_extract(&data[off], ndx, len, &oper1) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
if (sleb_extract(&data[off], ndx, len, &soper) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
soper *= state->ciedalign;
dbg_print(0, MSG_ORIG(MSG_CFA_REG_OFFLLD), PREFIX,
REGNAME(oper1, rbuf1), EC_SXWORD(soper));
break;
case 0x13:
if (sleb_extract(&data[off], ndx, len, &soper) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
soper *= state->ciedalign;
dbg_print(0, MSG_ORIG(MSG_CFA_LLD), PREFIX,
EC_SXWORD(soper));
break;
case 0x14:
if (uleb_extract(&data[off], ndx, len, &oper1) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
if (sleb_extract(&data[off], ndx, len, &soper) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
soper *= state->ciedalign;
dbg_print(0, MSG_ORIG(MSG_CFA_REG_OFFLLD), PREFIX,
REGNAME(oper1, rbuf1), EC_SXWORD(soper));
break;
case 0x15:
if (uleb_extract(&data[off], ndx, len, &oper1) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
if (sleb_extract(&data[off], ndx, len, &soper) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
soper *= state->ciedalign;
dbg_print(0, MSG_ORIG(MSG_CFA_REG_OFFLLD), PREFIX,
REGNAME(oper1, rbuf1), EC_SXWORD(soper));
break;
case 0x1d:
switch (dwarf_extract_uint(data + off, len,
ndx, 8, state->do_swap, &oper1)) {
case DW_BAD_ENCODING:
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWBADENC),
state->file, state->sh_name,
8);
return;
case DW_OVERFLOW:
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
case DW_SUCCESS:
break;
}
oper1 *= state->ciecalign;
cur_pc += oper1;
dbg_print(0, MSG_ORIG(MSG_CFA_ADV_LOC), PREFIX,
loc_str, EC_XWORD(oper1), EC_XWORD(cur_pc));
loc_str = MSG_ORIG(MSG_STR_LOC);
break;
case 0x2e:
if (uleb_extract(&data[off], ndx, len, &oper1) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
dbg_print(0, MSG_ORIG(MSG_CFA_LLU), PREFIX,
EC_XWORD(oper1));
break;
case 0x2f:
if (uleb_extract(&data[off], ndx, len, &oper1) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
if (sleb_extract(&data[off], ndx, len, &soper) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
state->file, state->sh_name);
return;
}
soper = -soper * state->ciedalign;
soper *= state->ciedalign;
dbg_print(0, MSG_ORIG(MSG_CFA_CFAOFF), PREFIX,
REGNAME(oper1, rbuf1), EC_SXWORD(soper));
break;
default:
(*ndx)--;
dump_hex_bytes(data + off + *ndx, len - *ndx,
indent, 8, 1);
(*ndx) = len;
break;
}
}
#undef PREFIX
#undef REGNAME
#undef LOW_OP
}
void
dump_eh_frame(const char *file, char *sh_name, uchar_t *data, size_t datasize,
uint64_t sh_addr, Half e_machine, uchar_t *e_ident, uint64_t gotaddr)
{
Conv_dwarf_ehe_buf_t dwarf_ehe_buf;
dump_cfi_state_t cfi_state;
uint64_t off, ndx, length, id;
uint_t cieid, cielength, cieversion, cieretaddr;
int ciePflag = 0, cieZflag = 0, cieLflag = 0;
int cieLflag_present = 0;
uint_t cieaugndx;
char *cieaugstr = NULL;
boolean_t have_cie = B_FALSE;
cfi_state.file = file;
cfi_state.sh_name = sh_name;
cfi_state.e_machine = e_machine;
cfi_state.e_ident = e_ident;
cfi_state.sh_addr = sh_addr;
cfi_state.do_swap = _elf_sys_encoding() != e_ident[EI_DATA];
cfi_state.gotaddr = gotaddr;
off = 0;
while (off < datasize) {
ndx = 0;
if (dwarf_extract_uint(data + off, datasize - off,
&ndx, 4, cfi_state.do_swap, &length) == DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
file, sh_name);
return;
}
if (length == 0) {
dbg_print(0, MSG_ORIG(MSG_UNW_ZEROTERM));
off += 4;
continue;
}
if (length > (datasize - off)) {
(void) fprintf(stderr, MSG_INTL(MSG_ERR_BADCIEFDELEN),
file, sh_name, EC_XWORD(length),
EC_XWORD(sh_addr + off));
return;
}
if (dwarf_extract_uint(data + off, datasize - off, &ndx,
4, cfi_state.do_swap, &id) == DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
file, sh_name);
return;
}
if (id == 0) {
uint64_t persVal, ndx_save = 0;
uint64_t axsize;
have_cie = B_TRUE;
cielength = length;
cieid = id;
ciePflag = cfi_state.cieRflag = cieZflag = 0;
cieLflag = cieLflag_present = 0;
dbg_print(0, MSG_ORIG(MSG_UNW_CIE),
EC_XWORD(sh_addr + off));
dbg_print(0, MSG_ORIG(MSG_UNW_CIELNGTH),
cielength, cieid);
cieversion = data[off + ndx];
ndx += 1;
cieaugstr = (char *)(&data[off + ndx]);
ndx += strlen(cieaugstr) + 1;
dbg_print(0, MSG_ORIG(MSG_UNW_CIEVERS),
cieversion, cieaugstr);
if (uleb_extract(&data[off], &ndx, datasize - off,
&cfi_state.ciecalign) == DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
file, sh_name);
return;
}
if (sleb_extract(&data[off], &ndx, datasize - off,
&cfi_state.ciedalign) == DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
file, sh_name);
return;
}
cieretaddr = data[off + ndx];
ndx += 1;
dbg_print(0, MSG_ORIG(MSG_UNW_CIECALGN),
EC_XWORD(cfi_state.ciecalign),
EC_XWORD(cfi_state.ciedalign), cieretaddr);
if (cieaugstr[0])
dbg_print(0, MSG_ORIG(MSG_UNW_CIEAXVAL));
for (cieaugndx = 0; cieaugstr[cieaugndx]; cieaugndx++) {
switch (cieaugstr[cieaugndx]) {
case 'z':
if (uleb_extract(&data[off], &ndx,
datasize - off, &axsize) ==
DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
file, sh_name);
return;
}
dbg_print(0, MSG_ORIG(MSG_UNW_CIEAXSIZ),
EC_XWORD(axsize));
cieZflag = 1;
ndx_save = ndx;
break;
case 'P':
ciePflag = data[off + ndx];
ndx += 1;
switch (dwarf_ehe_extract(&data[off],
datasize - off, &ndx, &persVal,
ciePflag, e_ident, B_FALSE, sh_addr,
off + ndx, gotaddr)) {
case DW_OVERFLOW:
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
file, sh_name);
return;
case DW_BAD_ENCODING:
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWBADENC),
file, sh_name, ciePflag);
return;
case DW_SUCCESS:
break;
}
dbg_print(0,
MSG_ORIG(MSG_UNW_CIEAXPERS));
dbg_print(0,
MSG_ORIG(MSG_UNW_CIEAXPERSENC),
ciePflag, conv_dwarf_ehe(ciePflag,
&dwarf_ehe_buf));
dbg_print(0,
MSG_ORIG(MSG_UNW_CIEAXPERSRTN),
EC_XWORD(persVal));
break;
case 'R':
cfi_state.cieRflag = data[off + ndx];
ndx += 1;
dbg_print(0,
MSG_ORIG(MSG_UNW_CIEAXCENC),
cfi_state.cieRflag,
conv_dwarf_ehe(cfi_state.cieRflag,
&dwarf_ehe_buf));
break;
case 'L':
cieLflag_present = 1;
cieLflag = data[off + ndx];
ndx += 1;
dbg_print(0,
MSG_ORIG(MSG_UNW_CIEAXLSDA),
cieLflag, conv_dwarf_ehe(
cieLflag, &dwarf_ehe_buf));
break;
default:
dbg_print(0,
MSG_ORIG(MSG_UNW_CIEAXUNEC),
cieaugstr[cieaugndx]);
break;
}
}
if (cieZflag)
ndx = ndx_save + axsize;
if ((cielength + 4) > ndx)
dump_cfi(data, off, &ndx, cielength, &cfi_state,
MSG_ORIG(MSG_UNW_CIECFI), 3);
off += cielength + 4;
} else {
uint_t fdelength = length;
int fdecieptr = id;
uint64_t fdeaddrrange;
if (!have_cie) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWNOCIE), file, sh_name);
return;
}
dbg_print(0, MSG_ORIG(MSG_UNW_FDE),
EC_XWORD(sh_addr + off));
dbg_print(0, MSG_ORIG(MSG_UNW_FDELNGTH),
fdelength, fdecieptr);
switch (dwarf_ehe_extract(&data[off], datasize - off,
&ndx, &cfi_state.fdeinitloc, cfi_state.cieRflag,
e_ident, B_FALSE, sh_addr, off + ndx, gotaddr)) {
case DW_OVERFLOW:
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW), file, sh_name);
return;
case DW_BAD_ENCODING:
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWBADENC), file, sh_name,
cfi_state.cieRflag);
return;
case DW_SUCCESS:
break;
}
switch (dwarf_ehe_extract(&data[off], datasize - off,
&ndx, &fdeaddrrange,
(cfi_state.cieRflag & ~DW_EH_PE_pcrel), e_ident,
B_FALSE, sh_addr, off + ndx, gotaddr)) {
case DW_OVERFLOW:
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW), file, sh_name);
return;
case DW_BAD_ENCODING:
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWBADENC), file, sh_name,
(cfi_state.cieRflag & ~DW_EH_PE_pcrel));
return;
case DW_SUCCESS:
break;
}
dbg_print(0, MSG_ORIG(MSG_UNW_FDEINITLOC),
EC_XWORD(cfi_state.fdeinitloc),
EC_XWORD(fdeaddrrange),
EC_XWORD(cfi_state.fdeinitloc + fdeaddrrange - 1));
if ((cieaugstr != NULL) && (cieaugstr[0] != '\0'))
dbg_print(0, MSG_ORIG(MSG_UNW_FDEAXVAL));
if (cieZflag) {
uint64_t val;
uint64_t lndx;
if (uleb_extract(&data[off], &ndx,
datasize - off, &val) == DW_OVERFLOW) {
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
file, sh_name);
return;
}
lndx = ndx;
ndx += val;
dbg_print(0, MSG_ORIG(MSG_UNW_FDEAXSIZE),
EC_XWORD(val));
if (val && cieLflag_present) {
uint64_t lsda;
switch (dwarf_ehe_extract(&data[off],
datasize - off, &lndx, &lsda,
cieLflag, e_ident, B_FALSE, sh_addr,
off + lndx, gotaddr)) {
case DW_OVERFLOW:
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWOVRFLW),
file, sh_name);
return;
case DW_BAD_ENCODING:
(void) fprintf(stderr,
MSG_INTL(MSG_ERR_DWBADENC),
file, sh_name, cieLflag);
return;
case DW_SUCCESS:
break;
}
dbg_print(0,
MSG_ORIG(MSG_UNW_FDEAXLSDA),
EC_XWORD(lsda));
}
}
if ((fdelength + 4) > ndx)
dump_cfi(data, off, &ndx, fdelength, &cfi_state,
MSG_ORIG(MSG_UNW_FDECFI), 6);
off += fdelength + 4;
}
}
}