#include <stdio.h>
#include <string.h>
#include "msg.h"
#include "_libld.h"
static Boolean symbol_title = TRUE;
static void
sym_muldef_title()
{
(void) printf(MSG_INTL(MSG_ENT_MUL_FMT_TIL_0),
MSG_INTL(MSG_ENT_MUL_TIL_0));
(void) printf(MSG_INTL(MSG_ENT_MUL_FMT_TIL_1),
MSG_INTL(MSG_ENT_MUL_ITM_SYM),
MSG_INTL(MSG_ENT_MUL_ITM_DEF_0),
MSG_INTL(MSG_ENT_MUL_ITM_DEF_1));
symbol_title = FALSE;
}
void
ld_map_out(Ofl_desc *ofl)
{
Sg_desc *sgp;
Is_desc *isp;
Sym_avlnode *sav;
Aliste idx1;
(void) printf(MSG_INTL(MSG_ENT_MAP_FMT_TIL_1),
MSG_INTL(MSG_ENT_MAP_TITLE_1));
if (ofl->ofl_flags & FLG_OF_RELOBJ)
(void) printf(MSG_INTL(MSG_ENT_MAP_FMT_TIL_2),
MSG_INTL(MSG_ENT_ITM_OUTPUT),
MSG_INTL(MSG_ENT_ITM_INPUT),
MSG_INTL(MSG_ENT_ITM_NEW),
MSG_INTL(MSG_ENT_ITM_SECTION),
MSG_INTL(MSG_ENT_ITM_SECTION),
MSG_INTL(MSG_ENT_ITM_DISPMNT),
MSG_INTL(MSG_ENT_ITM_SIZE));
else
(void) printf(MSG_INTL(MSG_ENT_MAP_FMT_TIL_3),
MSG_INTL(MSG_ENT_ITM_OUTPUT),
MSG_INTL(MSG_ENT_ITM_INPUT),
MSG_INTL(MSG_ENT_ITM_VIRTUAL),
MSG_INTL(MSG_ENT_ITM_SECTION),
MSG_INTL(MSG_ENT_ITM_SECTION),
MSG_INTL(MSG_ENT_ITM_ADDRESS),
MSG_INTL(MSG_ENT_ITM_SIZE));
for (APLIST_TRAVERSE(ofl->ofl_segs, idx1, sgp)) {
Os_desc *osp;
Aliste idx2;
if (sgp->sg_phdr.p_type != PT_LOAD)
continue;
for (APLIST_TRAVERSE(sgp->sg_osdescs, idx2, osp)) {
int os_isdescs_idx;
Aliste idx3;
(void) printf(MSG_INTL(MSG_ENT_MAP_ENTRY_1),
osp->os_name, EC_ADDR(osp->os_shdr->sh_addr),
EC_XWORD(osp->os_shdr->sh_size));
OS_ISDESCS_TRAVERSE(os_isdescs_idx, osp, idx3, isp) {
Addr addr;
if (isp->is_flags & FLG_IS_DISCARD) {
addr = 0;
} else {
addr = (Addr)
_elf_getxoff(isp->is_indata);
if (!(ofl->ofl_flags & FLG_OF_RELOBJ))
addr += isp->is_osdesc->
os_shdr->sh_addr;
}
(void) printf(MSG_INTL(MSG_ENT_MAP_ENTRY_2),
isp->is_name, EC_ADDR(addr),
EC_XWORD(isp->is_shdr->sh_size),
((isp->is_file != NULL) ?
(char *)(isp->is_file->ifl_name) :
MSG_INTL(MSG_STR_NULL)));
}
}
}
if (ofl->ofl_flags & FLG_OF_RELOBJ)
return;
for (sav = avl_first(&ofl->ofl_symavl); sav;
sav = AVL_NEXT(&ofl->ofl_symavl, sav)) {
Sym_desc *sdp = sav->sav_sdp;
const char *name = sdp->sd_name, *ducp, *adcp;
APlist *dfiles;
Aliste idx;
if (((dfiles = sdp->sd_aux->sa_dfiles) == NULL) ||
(aplist_nitems(dfiles) <= 1))
continue;
if ((sdp->sd_ref == REF_DYN_SEEN) ||
(sdp->sd_aux->sa_symspec) ||
(strcmp(MSG_ORIG(MSG_SYM_FINI_U), name) == 0) ||
(strcmp(MSG_ORIG(MSG_SYM_INIT_U), name) == 0) ||
(strcmp(MSG_ORIG(MSG_SYM_LIBVER_U), name) == 0))
continue;
if (symbol_title)
sym_muldef_title();
ducp = sdp->sd_file->ifl_name;
(void) printf(MSG_INTL(MSG_ENT_MUL_ENTRY_1), demangle(name),
ducp);
for (APLIST_TRAVERSE(dfiles, idx, adcp)) {
if (strcmp(adcp, ducp) != 0)
(void) printf(MSG_INTL(MSG_ENT_MUL_ENTRY_2),
adcp);
}
}
}
void
ld_ent_check(Ofl_desc * ofl)
{
Ent_desc *enp;
Aliste ndx;
for (APLIST_TRAVERSE(ofl->ofl_ents, ndx, enp)) {
if (((enp->ec_segment->sg_flags & FLG_SG_IS_ORDER) == 0) ||
(enp->ec_flags & FLG_EC_USED) || (enp->ec_ordndx == 0))
continue;
if (alist_nitems(enp->ec_files) > 0) {
ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_ENT_NOSEC_1),
enp->ec_segment->sg_name, enp->ec_is_name);
} else {
ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_ENT_NOSEC_2),
enp->ec_segment->sg_name, enp->ec_is_name);
}
}
}