1*7c478bd9Sstevel@tonic-gate /* 2*7c478bd9Sstevel@tonic-gate * CDDL HEADER START 3*7c478bd9Sstevel@tonic-gate * 4*7c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*7c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 6*7c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 7*7c478bd9Sstevel@tonic-gate * with the License. 8*7c478bd9Sstevel@tonic-gate * 9*7c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*7c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 11*7c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 12*7c478bd9Sstevel@tonic-gate * and limitations under the License. 13*7c478bd9Sstevel@tonic-gate * 14*7c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 15*7c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*7c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 17*7c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 18*7c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 19*7c478bd9Sstevel@tonic-gate * 20*7c478bd9Sstevel@tonic-gate * CDDL HEADER END 21*7c478bd9Sstevel@tonic-gate */ 22*7c478bd9Sstevel@tonic-gate /* 23*7c478bd9Sstevel@tonic-gate * Copyright (c) 1999 by Sun Microsystems, Inc. 24*7c478bd9Sstevel@tonic-gate * All rights reserved. 25*7c478bd9Sstevel@tonic-gate */ 26*7c478bd9Sstevel@tonic-gate 27*7c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 28*7c478bd9Sstevel@tonic-gate 29*7c478bd9Sstevel@tonic-gate #include <assert.h> 30*7c478bd9Sstevel@tonic-gate #include <stdio.h> 31*7c478bd9Sstevel@tonic-gate #include <stdlib.h> 32*7c478bd9Sstevel@tonic-gate #include <strings.h> 33*7c478bd9Sstevel@tonic-gate #include <unistd.h> 34*7c478bd9Sstevel@tonic-gate #include <fcntl.h> 35*7c478bd9Sstevel@tonic-gate #include <errno.h> 36*7c478bd9Sstevel@tonic-gate #include <inttypes.h> 37*7c478bd9Sstevel@tonic-gate #include <sys/types.h> 38*7c478bd9Sstevel@tonic-gate #include <sys/stat.h> 39*7c478bd9Sstevel@tonic-gate #include <libintl.h> 40*7c478bd9Sstevel@tonic-gate 41*7c478bd9Sstevel@tonic-gate #include "itmcomp.h" 42*7c478bd9Sstevel@tonic-gate 43*7c478bd9Sstevel@tonic-gate struct itm_opt_outer *itm_op_outer = NULL; 44*7c478bd9Sstevel@tonic-gate 45*7c478bd9Sstevel@tonic-gate #if defined(ENABLE_TRACE) 46*7c478bd9Sstevel@tonic-gate static char *itmc_obj_names[] = { 47*7c478bd9Sstevel@tonic-gate "ITMC_OBJ_NONE(0)", 48*7c478bd9Sstevel@tonic-gate "ITMC_OBJ_ITM(1)", 49*7c478bd9Sstevel@tonic-gate "ITMC_OBJ_STRING(2)", 50*7c478bd9Sstevel@tonic-gate "ITMC_OBJ_DIREC(3)", 51*7c478bd9Sstevel@tonic-gate "ITMC_OBJ_COND(4)", 52*7c478bd9Sstevel@tonic-gate "ITMC_OBJ_MAP(5)", 53*7c478bd9Sstevel@tonic-gate "ITMC_OBJ_OP(6)", 54*7c478bd9Sstevel@tonic-gate "ITMC_OBJ_EXPR(7)", 55*7c478bd9Sstevel@tonic-gate "ITMC_OBJ_DATA(8)", 56*7c478bd9Sstevel@tonic-gate "ITMC_OBJ_ACTION(9)", 57*7c478bd9Sstevel@tonic-gate "ITMC_OBJ_RANGE(10)", 58*7c478bd9Sstevel@tonic-gate "ITMC_OBJ_RAGISTER(11)", 59*7c478bd9Sstevel@tonic-gate "ITMC_OBJ_ESCAPESEQ(12)" 60*7c478bd9Sstevel@tonic-gate }; 61*7c478bd9Sstevel@tonic-gate #endif 62*7c478bd9Sstevel@tonic-gate 63*7c478bd9Sstevel@tonic-gate #define TRACE_FMT(comment) \ 64*7c478bd9Sstevel@tonic-gate comment ## " size=%4ld(0x%4lx); 64d=0x%16" PRIx64 "; ptr=%4p(%c...)\n" 65*7c478bd9Sstevel@tonic-gate #define TRACE_DT(data, refer) \ 66*7c478bd9Sstevel@tonic-gate data.size, data.size, data.place.itm_64d, \ 67*7c478bd9Sstevel@tonic-gate data.place.itm_ptr,\ 68*7c478bd9Sstevel@tonic-gate (((refer) == 0) ? (not_refer): \ 69*7c478bd9Sstevel@tonic-gate (((sizeof (itm_place_t) < data.size))? \ 70*7c478bd9Sstevel@tonic-gate *((char *)(((char *)itm_header) + data.place.itm_ptr)): \ 71*7c478bd9Sstevel@tonic-gate (not_refer))) 72*7c478bd9Sstevel@tonic-gate enum { 73*7c478bd9Sstevel@tonic-gate NOREFER = 0, 74*7c478bd9Sstevel@tonic-gate REFER = 1 75*7c478bd9Sstevel@tonic-gate }; 76*7c478bd9Sstevel@tonic-gate #define NAMETRACE(comment) \ 77*7c478bd9Sstevel@tonic-gate { itmc_name_t *name;\ 78*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('p', (#comment "\n")); \ 79*7c478bd9Sstevel@tonic-gate for (name = name_first; name; name = name->next) {\ 80*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('p', \ 81*7c478bd9Sstevel@tonic-gate (TRACE_FMT(" "),\ 82*7c478bd9Sstevel@tonic-gate TRACE_DT(name->name, NOREFER)));\ 83*7c478bd9Sstevel@tonic-gate }\ 84*7c478bd9Sstevel@tonic-gate } 85*7c478bd9Sstevel@tonic-gate 86*7c478bd9Sstevel@tonic-gate /* static int not_refer = (~0); */ 87*7c478bd9Sstevel@tonic-gate 88*7c478bd9Sstevel@tonic-gate 89*7c478bd9Sstevel@tonic-gate 90*7c478bd9Sstevel@tonic-gate static void relocation_I(itm_hdr_t *, itm_info_hdr_t *); 91*7c478bd9Sstevel@tonic-gate static void relocation_II(itm_hdr_t *, itm_info_hdr_t *); 92*7c478bd9Sstevel@tonic-gate 93*7c478bd9Sstevel@tonic-gate static void fix_itmc_ref_reloc(itmc_ref_t *, itm_place2_t); 94*7c478bd9Sstevel@tonic-gate static void analysis(itm_info_hdr_t *); 95*7c478bd9Sstevel@tonic-gate static void analysis2(void); 96*7c478bd9Sstevel@tonic-gate static void output(itm_hdr_t *, itm_info_hdr_t *); 97*7c478bd9Sstevel@tonic-gate 98*7c478bd9Sstevel@tonic-gate 99*7c478bd9Sstevel@tonic-gate 100*7c478bd9Sstevel@tonic-gate 101*7c478bd9Sstevel@tonic-gate /* 102*7c478bd9Sstevel@tonic-gate * Assemble main function 103*7c478bd9Sstevel@tonic-gate */ 104*7c478bd9Sstevel@tonic-gate 105*7c478bd9Sstevel@tonic-gate int 106*7c478bd9Sstevel@tonic-gate assemble(itm_hdr_t *itm_header) 107*7c478bd9Sstevel@tonic-gate { 108*7c478bd9Sstevel@tonic-gate int i; 109*7c478bd9Sstevel@tonic-gate int j; 110*7c478bd9Sstevel@tonic-gate itmc_ref_t *ref; 111*7c478bd9Sstevel@tonic-gate itm_info_hdr_t *info_header; 112*7c478bd9Sstevel@tonic-gate union { 113*7c478bd9Sstevel@tonic-gate long longval; 114*7c478bd9Sstevel@tonic-gate char charval[8]; 115*7c478bd9Sstevel@tonic-gate } mach_spec; 116*7c478bd9Sstevel@tonic-gate 117*7c478bd9Sstevel@tonic-gate if (0 < error_deferred) { 118*7c478bd9Sstevel@tonic-gate itm_error(gettext("number of deferred error: %d\n"), 119*7c478bd9Sstevel@tonic-gate error_deferred); 120*7c478bd9Sstevel@tonic-gate exit(ITMC_STATUS_BT); 121*7c478bd9Sstevel@tonic-gate } 122*7c478bd9Sstevel@tonic-gate 123*7c478bd9Sstevel@tonic-gate itm_header->ident[0] = ITM_IDENT_0; 124*7c478bd9Sstevel@tonic-gate itm_header->ident[1] = ITM_IDENT_1; 125*7c478bd9Sstevel@tonic-gate itm_header->ident[2] = ITM_IDENT_2; 126*7c478bd9Sstevel@tonic-gate itm_header->ident[3] = ITM_IDENT_3; 127*7c478bd9Sstevel@tonic-gate 128*7c478bd9Sstevel@tonic-gate itm_header->spec[0] = ITM_SPEC_0; 129*7c478bd9Sstevel@tonic-gate itm_header->spec[1] = ITM_SPEC_1; 130*7c478bd9Sstevel@tonic-gate itm_header->spec[2] = ITM_SPEC_2; 131*7c478bd9Sstevel@tonic-gate mach_spec.longval = 1; 132*7c478bd9Sstevel@tonic-gate switch (sizeof (long)) { 133*7c478bd9Sstevel@tonic-gate case 4: 134*7c478bd9Sstevel@tonic-gate if (0 == mach_spec.charval[0]) { 135*7c478bd9Sstevel@tonic-gate itm_header->spec[3] = ITM_SPEC_3_32_BIG_ENDIAN; 136*7c478bd9Sstevel@tonic-gate } else { 137*7c478bd9Sstevel@tonic-gate itm_header->spec[3] = ITM_SPEC_3_32_LITTLE_ENDIAN; 138*7c478bd9Sstevel@tonic-gate } 139*7c478bd9Sstevel@tonic-gate break; 140*7c478bd9Sstevel@tonic-gate case 8: 141*7c478bd9Sstevel@tonic-gate if (0 == mach_spec.charval[0]) { 142*7c478bd9Sstevel@tonic-gate itm_header->spec[3] = ITM_SPEC_3_64_BIG_ENDIAN; 143*7c478bd9Sstevel@tonic-gate } else { 144*7c478bd9Sstevel@tonic-gate itm_header->spec[3] = ITM_SPEC_3_64_LITTLE_ENDIAN; 145*7c478bd9Sstevel@tonic-gate } 146*7c478bd9Sstevel@tonic-gate break; 147*7c478bd9Sstevel@tonic-gate } 148*7c478bd9Sstevel@tonic-gate 149*7c478bd9Sstevel@tonic-gate itm_header->version[0] = ITM_VER_0; 150*7c478bd9Sstevel@tonic-gate itm_header->version[1] = ITM_VER_1; 151*7c478bd9Sstevel@tonic-gate itm_header->version[2] = ITM_VER_2; 152*7c478bd9Sstevel@tonic-gate itm_header->version[3] = ITM_VER_3; 153*7c478bd9Sstevel@tonic-gate 154*7c478bd9Sstevel@tonic-gate itm_header->itm_size.itm_ptr = 0; 155*7c478bd9Sstevel@tonic-gate 156*7c478bd9Sstevel@tonic-gate itm_header->reg_num = reg_id; 157*7c478bd9Sstevel@tonic-gate 158*7c478bd9Sstevel@tonic-gate itm_header->itm_hdr_size = (sizeof (itm_hdr_t)); 159*7c478bd9Sstevel@tonic-gate 160*7c478bd9Sstevel@tonic-gate info_header = malloc_vital(sizeof (itm_info_hdr_t)); 161*7c478bd9Sstevel@tonic-gate (void) memset(info_header, 0, sizeof (itm_info_hdr_t)); 162*7c478bd9Sstevel@tonic-gate 163*7c478bd9Sstevel@tonic-gate relocation_I(itm_header, info_header); 164*7c478bd9Sstevel@tonic-gate relocation_II(itm_header, info_header); 165*7c478bd9Sstevel@tonic-gate 166*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('r', 167*7c478bd9Sstevel@tonic-gate (" ref name referencee reloc(10)" 168*7c478bd9Sstevel@tonic-gate "size(10) referencer next\n")); 169*7c478bd9Sstevel@tonic-gate for (i = ITMC_OBJ_FIRST; i <= ITMC_OBJ_LAST; i++) { 170*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('r', ("%s\n", itmc_obj_names[i])); 171*7c478bd9Sstevel@tonic-gate for (ref = ref_first[i], j = 0; ref; ref = ref->next, j++) { 172*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('r', 173*7c478bd9Sstevel@tonic-gate (" %2d:%08p:%08p:%08p:%8p:%8ld:%08p:%08p\n", 174*7c478bd9Sstevel@tonic-gate j, ref, 175*7c478bd9Sstevel@tonic-gate ref->name, ref->referencee, 176*7c478bd9Sstevel@tonic-gate ref->reloc.itm_ptr, ref->size, 177*7c478bd9Sstevel@tonic-gate ref->referencer, ref->next)); 178*7c478bd9Sstevel@tonic-gate } 179*7c478bd9Sstevel@tonic-gate } 180*7c478bd9Sstevel@tonic-gate 181*7c478bd9Sstevel@tonic-gate analysis(info_header); 182*7c478bd9Sstevel@tonic-gate analysis2(); 183*7c478bd9Sstevel@tonic-gate if (0 < error_deferred) { 184*7c478bd9Sstevel@tonic-gate itm_error(gettext("number of deferred error: %d\n"), 185*7c478bd9Sstevel@tonic-gate error_deferred); 186*7c478bd9Sstevel@tonic-gate exit(ITMC_STATUS_BT); 187*7c478bd9Sstevel@tonic-gate } 188*7c478bd9Sstevel@tonic-gate 189*7c478bd9Sstevel@tonic-gate output(itm_header, info_header); 190*7c478bd9Sstevel@tonic-gate return (0); 191*7c478bd9Sstevel@tonic-gate } 192*7c478bd9Sstevel@tonic-gate 193*7c478bd9Sstevel@tonic-gate 194*7c478bd9Sstevel@tonic-gate /* 195*7c478bd9Sstevel@tonic-gate * Fix reloc of itmc_ref_t, and fix reloc of itmc_name_t 196*7c478bd9Sstevel@tonic-gate */ 197*7c478bd9Sstevel@tonic-gate 198*7c478bd9Sstevel@tonic-gate static void 199*7c478bd9Sstevel@tonic-gate relocation_I(itm_hdr_t *itm_header, itm_info_hdr_t *info_header) 200*7c478bd9Sstevel@tonic-gate { 201*7c478bd9Sstevel@tonic-gate itmc_ref_t *ref; 202*7c478bd9Sstevel@tonic-gate itmc_name_t *name; 203*7c478bd9Sstevel@tonic-gate itm_num_t sec_num; 204*7c478bd9Sstevel@tonic-gate itm_num_t sec_num2; 205*7c478bd9Sstevel@tonic-gate itm_size_t sec_size; 206*7c478bd9Sstevel@tonic-gate 207*7c478bd9Sstevel@tonic-gate /* 208*7c478bd9Sstevel@tonic-gate * determin section size 209*7c478bd9Sstevel@tonic-gate */ 210*7c478bd9Sstevel@tonic-gate 211*7c478bd9Sstevel@tonic-gate /* string section */ 212*7c478bd9Sstevel@tonic-gate for (sec_num = 0, sec_size = 0, ref = ref_first[ITMC_OBJ_STRING]; 213*7c478bd9Sstevel@tonic-gate ref; sec_num += 1, sec_size += ref->size, ref = ref->next) {} 214*7c478bd9Sstevel@tonic-gate sec_size = ITMROUNDUP(sec_size); 215*7c478bd9Sstevel@tonic-gate info_header->str_plc_tbl.size = ((sizeof (itm_data_t)) * sec_num); 216*7c478bd9Sstevel@tonic-gate info_header->str_plc_tbl.number = sec_num; 217*7c478bd9Sstevel@tonic-gate info_header->str_sec.size = sec_size; 218*7c478bd9Sstevel@tonic-gate info_header->str_sec.number = sec_num; 219*7c478bd9Sstevel@tonic-gate 220*7c478bd9Sstevel@tonic-gate /* direction */ 221*7c478bd9Sstevel@tonic-gate for (sec_num = 0, sec_size = 0, ref = ref_first[ITMC_OBJ_DIREC]; 222*7c478bd9Sstevel@tonic-gate ref; sec_num += 1, sec_size += ref->size, ref = ref->next) {} 223*7c478bd9Sstevel@tonic-gate sec_size = ITMROUNDUP(sec_size); 224*7c478bd9Sstevel@tonic-gate info_header->direc_plc_tbl.size = sec_num * (sizeof (itm_place_t)); 225*7c478bd9Sstevel@tonic-gate info_header->direc_plc_tbl.number = sec_num; 226*7c478bd9Sstevel@tonic-gate info_header->direc_tbl_sec.size = sec_size; 227*7c478bd9Sstevel@tonic-gate info_header->direc_tbl_sec.number = sec_num; 228*7c478bd9Sstevel@tonic-gate 229*7c478bd9Sstevel@tonic-gate /* condition */ 230*7c478bd9Sstevel@tonic-gate for (sec_num = 0, sec_size = 0, ref = ref_first[ITMC_OBJ_COND]; 231*7c478bd9Sstevel@tonic-gate ref; sec_num += 1, sec_size += ref->size, ref = ref->next) {} 232*7c478bd9Sstevel@tonic-gate sec_size = ITMROUNDUP(sec_size); 233*7c478bd9Sstevel@tonic-gate info_header->cond_plc_tbl.size = sec_num * (sizeof (itm_place_t)); 234*7c478bd9Sstevel@tonic-gate info_header->cond_plc_tbl.number = sec_num; 235*7c478bd9Sstevel@tonic-gate info_header->cond_tbl_sec.size = sec_size; 236*7c478bd9Sstevel@tonic-gate info_header->cond_tbl_sec.number = sec_num; 237*7c478bd9Sstevel@tonic-gate 238*7c478bd9Sstevel@tonic-gate /* map */ 239*7c478bd9Sstevel@tonic-gate for (sec_num = 0, sec_size = 0, ref = ref_first[ITMC_OBJ_MAP]; 240*7c478bd9Sstevel@tonic-gate ref; sec_num += 1, sec_size += ref->size, ref = ref->next) { 241*7c478bd9Sstevel@tonic-gate } 242*7c478bd9Sstevel@tonic-gate sec_size = ITMROUNDUP(sec_size); 243*7c478bd9Sstevel@tonic-gate info_header->map_plc_tbl.size = sec_num * (sizeof (itm_place_t)); 244*7c478bd9Sstevel@tonic-gate info_header->map_plc_tbl.number = sec_num; 245*7c478bd9Sstevel@tonic-gate info_header->map_tbl_sec.size = sec_size; 246*7c478bd9Sstevel@tonic-gate info_header->map_tbl_sec.number = sec_num; 247*7c478bd9Sstevel@tonic-gate 248*7c478bd9Sstevel@tonic-gate /* operation */ 249*7c478bd9Sstevel@tonic-gate for (sec_num = 0, sec_size = 0, ref = ref_first[ITMC_OBJ_OP]; 250*7c478bd9Sstevel@tonic-gate ref; sec_num += 1, sec_size += ref->size, ref = ref->next) { 251*7c478bd9Sstevel@tonic-gate } 252*7c478bd9Sstevel@tonic-gate sec_size = ITMROUNDUP(sec_size); 253*7c478bd9Sstevel@tonic-gate info_header->op_plc_tbl.size = sec_num * (sizeof (itm_place_t)); 254*7c478bd9Sstevel@tonic-gate info_header->op_plc_tbl.number = sec_num; 255*7c478bd9Sstevel@tonic-gate info_header->op_tbl_sec.size = sec_size; 256*7c478bd9Sstevel@tonic-gate info_header->op_tbl_sec.number = sec_num; 257*7c478bd9Sstevel@tonic-gate 258*7c478bd9Sstevel@tonic-gate /* range section */ 259*7c478bd9Sstevel@tonic-gate for (sec_num = 0, sec_size = 0, ref = ref_first[ITMC_OBJ_RANGE]; 260*7c478bd9Sstevel@tonic-gate ref; sec_num += 1, sec_size += ref->size, ref = ref->next) {} 261*7c478bd9Sstevel@tonic-gate sec_size = ITMROUNDUP(sec_size); 262*7c478bd9Sstevel@tonic-gate info_header->range_plc_tbl.size = sec_num * (sizeof (itm_place_t)); 263*7c478bd9Sstevel@tonic-gate info_header->range_plc_tbl.number = sec_num; 264*7c478bd9Sstevel@tonic-gate info_header->range_tbl_sec.size = sec_size; 265*7c478bd9Sstevel@tonic-gate info_header->range_tbl_sec.number = sec_num; 266*7c478bd9Sstevel@tonic-gate 267*7c478bd9Sstevel@tonic-gate /* escapeseq section */ 268*7c478bd9Sstevel@tonic-gate for (sec_num = 0, sec_size = 0, ref = ref_first[ITMC_OBJ_ESCAPESEQ]; 269*7c478bd9Sstevel@tonic-gate ref; sec_num += 1, sec_size += ref->size, ref = ref->next) {} 270*7c478bd9Sstevel@tonic-gate sec_size = ITMROUNDUP(sec_size); 271*7c478bd9Sstevel@tonic-gate info_header->escapeseq_plc_tbl.size = sec_num * (sizeof (itm_place_t)); 272*7c478bd9Sstevel@tonic-gate info_header->escapeseq_plc_tbl.number = sec_num; 273*7c478bd9Sstevel@tonic-gate info_header->escapeseq_tbl_sec.size = sec_size; 274*7c478bd9Sstevel@tonic-gate info_header->escapeseq_tbl_sec.number = sec_num; 275*7c478bd9Sstevel@tonic-gate 276*7c478bd9Sstevel@tonic-gate /* data section */ 277*7c478bd9Sstevel@tonic-gate for (sec_num = 0, sec_size = 0, ref = ref_first[ITMC_OBJ_DATA]; 278*7c478bd9Sstevel@tonic-gate ref; sec_num += 1, sec_size += ref->size, ref = ref->next) {} 279*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_EXPR]; 280*7c478bd9Sstevel@tonic-gate ref; sec_num += 1, sec_size += ref->size, ref = ref->next) {} 281*7c478bd9Sstevel@tonic-gate sec_size = ITMROUNDUP(sec_size); 282*7c478bd9Sstevel@tonic-gate info_header->data_plc_tbl.size = ((sizeof (itm_place_t)) * sec_num); 283*7c478bd9Sstevel@tonic-gate info_header->data_plc_tbl.number = sec_num; 284*7c478bd9Sstevel@tonic-gate info_header->data_sec.size = sec_size; 285*7c478bd9Sstevel@tonic-gate info_header->data_sec.number = sec_num; 286*7c478bd9Sstevel@tonic-gate 287*7c478bd9Sstevel@tonic-gate 288*7c478bd9Sstevel@tonic-gate /* name section */ 289*7c478bd9Sstevel@tonic-gate sec_num2 = 0; 290*7c478bd9Sstevel@tonic-gate for (sec_num = 0, sec_size = 0, name = name_first; 291*7c478bd9Sstevel@tonic-gate name; name = name->next) { 292*7c478bd9Sstevel@tonic-gate if ((ITMC_OBJ_REGISTER != name->type) && 293*7c478bd9Sstevel@tonic-gate (0 != name->name.size)) { 294*7c478bd9Sstevel@tonic-gate if ((sizeof (itm_place_t)) < name->name.size) { 295*7c478bd9Sstevel@tonic-gate sec_size += name->name.size; 296*7c478bd9Sstevel@tonic-gate sec_num2 += 1; 297*7c478bd9Sstevel@tonic-gate } 298*7c478bd9Sstevel@tonic-gate sec_num += 1; 299*7c478bd9Sstevel@tonic-gate } 300*7c478bd9Sstevel@tonic-gate } 301*7c478bd9Sstevel@tonic-gate info_header->name_plc_tbl.size = ((sizeof (itm_data_t)) * sec_num); 302*7c478bd9Sstevel@tonic-gate info_header->name_plc_tbl.number = sec_num; 303*7c478bd9Sstevel@tonic-gate 304*7c478bd9Sstevel@tonic-gate for (sec_num = 0, name = name_first; name; name = name->next) { 305*7c478bd9Sstevel@tonic-gate if ((ITMC_OBJ_REGISTER == name->type) && 306*7c478bd9Sstevel@tonic-gate (0 != name->name.size)) { 307*7c478bd9Sstevel@tonic-gate if ((sizeof (itm_place_t)) < name->name.size) { 308*7c478bd9Sstevel@tonic-gate sec_size += name->name.size; 309*7c478bd9Sstevel@tonic-gate sec_num2 += 1; 310*7c478bd9Sstevel@tonic-gate } 311*7c478bd9Sstevel@tonic-gate sec_num += 1; 312*7c478bd9Sstevel@tonic-gate } 313*7c478bd9Sstevel@tonic-gate } 314*7c478bd9Sstevel@tonic-gate sec_size = ITMROUNDUP(sec_size); 315*7c478bd9Sstevel@tonic-gate info_header->reg_plc_tbl.size = 316*7c478bd9Sstevel@tonic-gate ((sizeof (itm_data_t)) * (itm_header->reg_num)); 317*7c478bd9Sstevel@tonic-gate info_header->reg_plc_tbl.number = itm_header->reg_num; 318*7c478bd9Sstevel@tonic-gate 319*7c478bd9Sstevel@tonic-gate info_header->name_sec.size = sec_size; 320*7c478bd9Sstevel@tonic-gate info_header->name_sec.number = sec_num2; 321*7c478bd9Sstevel@tonic-gate 322*7c478bd9Sstevel@tonic-gate /* 323*7c478bd9Sstevel@tonic-gate * adjust place 324*7c478bd9Sstevel@tonic-gate */ 325*7c478bd9Sstevel@tonic-gate info_header->str_sec.place.itm_ptr = 326*7c478bd9Sstevel@tonic-gate 0 + 327*7c478bd9Sstevel@tonic-gate (sizeof (itm_hdr_t)); 328*7c478bd9Sstevel@tonic-gate info_header->direc_tbl_sec.place.itm_ptr = 329*7c478bd9Sstevel@tonic-gate info_header->str_sec.place.itm_ptr + 330*7c478bd9Sstevel@tonic-gate info_header->str_sec.size; 331*7c478bd9Sstevel@tonic-gate info_header->cond_tbl_sec.place.itm_ptr = 332*7c478bd9Sstevel@tonic-gate info_header->direc_tbl_sec.place.itm_ptr + 333*7c478bd9Sstevel@tonic-gate info_header->direc_tbl_sec.size; 334*7c478bd9Sstevel@tonic-gate info_header->map_tbl_sec.place.itm_ptr = 335*7c478bd9Sstevel@tonic-gate info_header->cond_tbl_sec.place.itm_ptr + 336*7c478bd9Sstevel@tonic-gate info_header->cond_tbl_sec.size; 337*7c478bd9Sstevel@tonic-gate info_header->op_tbl_sec.place.itm_ptr = 338*7c478bd9Sstevel@tonic-gate info_header->map_tbl_sec.place.itm_ptr + 339*7c478bd9Sstevel@tonic-gate info_header->map_tbl_sec.size; 340*7c478bd9Sstevel@tonic-gate 341*7c478bd9Sstevel@tonic-gate info_header->range_tbl_sec.place.itm_ptr = 342*7c478bd9Sstevel@tonic-gate info_header->op_tbl_sec.place.itm_ptr + 343*7c478bd9Sstevel@tonic-gate info_header->op_tbl_sec.size; 344*7c478bd9Sstevel@tonic-gate 345*7c478bd9Sstevel@tonic-gate info_header->escapeseq_tbl_sec.place.itm_ptr = 346*7c478bd9Sstevel@tonic-gate info_header->range_tbl_sec.place.itm_ptr + 347*7c478bd9Sstevel@tonic-gate info_header->range_tbl_sec.size; 348*7c478bd9Sstevel@tonic-gate 349*7c478bd9Sstevel@tonic-gate info_header->data_sec.place.itm_ptr = 350*7c478bd9Sstevel@tonic-gate info_header->escapeseq_tbl_sec.place.itm_ptr + 351*7c478bd9Sstevel@tonic-gate info_header->escapeseq_tbl_sec.size; 352*7c478bd9Sstevel@tonic-gate 353*7c478bd9Sstevel@tonic-gate /* 354*7c478bd9Sstevel@tonic-gate * adjust place: optional 355*7c478bd9Sstevel@tonic-gate */ 356*7c478bd9Sstevel@tonic-gate 357*7c478bd9Sstevel@tonic-gate if (0 == cmd_opt.strip) { 358*7c478bd9Sstevel@tonic-gate itm_header->info_hdr.itm_ptr = 359*7c478bd9Sstevel@tonic-gate info_header->data_sec.place.itm_ptr + 360*7c478bd9Sstevel@tonic-gate info_header->data_sec.size; 361*7c478bd9Sstevel@tonic-gate 362*7c478bd9Sstevel@tonic-gate info_header->direc_plc_tbl.place.itm_ptr = 363*7c478bd9Sstevel@tonic-gate itm_header->info_hdr.itm_ptr + 364*7c478bd9Sstevel@tonic-gate (sizeof (itm_info_hdr_t)); 365*7c478bd9Sstevel@tonic-gate info_header->cond_plc_tbl.place.itm_ptr = 366*7c478bd9Sstevel@tonic-gate info_header->direc_plc_tbl.place.itm_ptr + 367*7c478bd9Sstevel@tonic-gate info_header->direc_plc_tbl.size; 368*7c478bd9Sstevel@tonic-gate info_header->map_plc_tbl.place.itm_ptr = 369*7c478bd9Sstevel@tonic-gate info_header->cond_plc_tbl.place.itm_ptr + 370*7c478bd9Sstevel@tonic-gate info_header->cond_plc_tbl.size; 371*7c478bd9Sstevel@tonic-gate info_header->op_plc_tbl.place.itm_ptr = 372*7c478bd9Sstevel@tonic-gate info_header->map_plc_tbl.place.itm_ptr + 373*7c478bd9Sstevel@tonic-gate info_header->map_plc_tbl.size; 374*7c478bd9Sstevel@tonic-gate 375*7c478bd9Sstevel@tonic-gate info_header->str_plc_tbl.place.itm_ptr = 376*7c478bd9Sstevel@tonic-gate info_header->op_plc_tbl.place.itm_ptr + 377*7c478bd9Sstevel@tonic-gate info_header->op_plc_tbl.size; 378*7c478bd9Sstevel@tonic-gate info_header->range_plc_tbl.place.itm_ptr = 379*7c478bd9Sstevel@tonic-gate info_header->str_plc_tbl.place.itm_ptr + 380*7c478bd9Sstevel@tonic-gate info_header->str_plc_tbl.size; 381*7c478bd9Sstevel@tonic-gate info_header->escapeseq_plc_tbl.place.itm_ptr = 382*7c478bd9Sstevel@tonic-gate info_header->range_plc_tbl.place.itm_ptr + 383*7c478bd9Sstevel@tonic-gate info_header->range_plc_tbl.size; 384*7c478bd9Sstevel@tonic-gate info_header->data_plc_tbl.place.itm_ptr = 385*7c478bd9Sstevel@tonic-gate info_header->escapeseq_plc_tbl.place.itm_ptr + 386*7c478bd9Sstevel@tonic-gate info_header->escapeseq_plc_tbl.size; 387*7c478bd9Sstevel@tonic-gate info_header->name_plc_tbl.place.itm_ptr = 388*7c478bd9Sstevel@tonic-gate info_header->data_plc_tbl.place.itm_ptr + 389*7c478bd9Sstevel@tonic-gate info_header->data_plc_tbl.size; 390*7c478bd9Sstevel@tonic-gate info_header->reg_plc_tbl.place.itm_ptr = 391*7c478bd9Sstevel@tonic-gate info_header->name_plc_tbl.place.itm_ptr + 392*7c478bd9Sstevel@tonic-gate info_header->name_plc_tbl.size; 393*7c478bd9Sstevel@tonic-gate 394*7c478bd9Sstevel@tonic-gate /* name SECTION */ 395*7c478bd9Sstevel@tonic-gate info_header->name_sec.place.itm_ptr = 396*7c478bd9Sstevel@tonic-gate info_header->reg_plc_tbl.place.itm_ptr + 397*7c478bd9Sstevel@tonic-gate info_header->reg_plc_tbl.size; 398*7c478bd9Sstevel@tonic-gate } 399*7c478bd9Sstevel@tonic-gate 400*7c478bd9Sstevel@tonic-gate /* 401*7c478bd9Sstevel@tonic-gate * size of ITM 402*7c478bd9Sstevel@tonic-gate */ 403*7c478bd9Sstevel@tonic-gate 404*7c478bd9Sstevel@tonic-gate if (0 == cmd_opt.strip) { 405*7c478bd9Sstevel@tonic-gate itm_header->itm_size.itm_ptr = 406*7c478bd9Sstevel@tonic-gate info_header->name_sec.place.itm_ptr + 407*7c478bd9Sstevel@tonic-gate info_header->name_sec.size; 408*7c478bd9Sstevel@tonic-gate } else { 409*7c478bd9Sstevel@tonic-gate itm_header->itm_size.itm_ptr = 410*7c478bd9Sstevel@tonic-gate info_header->data_sec.place.itm_ptr + 411*7c478bd9Sstevel@tonic-gate info_header->data_sec.size; 412*7c478bd9Sstevel@tonic-gate } 413*7c478bd9Sstevel@tonic-gate 414*7c478bd9Sstevel@tonic-gate 415*7c478bd9Sstevel@tonic-gate /* 416*7c478bd9Sstevel@tonic-gate * trace 417*7c478bd9Sstevel@tonic-gate */ 418*7c478bd9Sstevel@tonic-gate 419*7c478bd9Sstevel@tonic-gate #if defined(ENABLE_TRACE) 420*7c478bd9Sstevel@tonic-gate dump_itm_header(itm_header, info_header); 421*7c478bd9Sstevel@tonic-gate #endif 422*7c478bd9Sstevel@tonic-gate } 423*7c478bd9Sstevel@tonic-gate 424*7c478bd9Sstevel@tonic-gate 425*7c478bd9Sstevel@tonic-gate /* 426*7c478bd9Sstevel@tonic-gate * Fix referencer of itmc_ref_t 427*7c478bd9Sstevel@tonic-gate */ 428*7c478bd9Sstevel@tonic-gate 429*7c478bd9Sstevel@tonic-gate static void 430*7c478bd9Sstevel@tonic-gate relocation_II(itm_hdr_t *itm_header, itm_info_hdr_t *info_header) 431*7c478bd9Sstevel@tonic-gate { 432*7c478bd9Sstevel@tonic-gate itmc_ref_t *ref; 433*7c478bd9Sstevel@tonic-gate itmc_name_t *name; 434*7c478bd9Sstevel@tonic-gate itmc_ref_link_t *rl; 435*7c478bd9Sstevel@tonic-gate itm_place2_t place; 436*7c478bd9Sstevel@tonic-gate itm_place2_t n_plc; 437*7c478bd9Sstevel@tonic-gate 438*7c478bd9Sstevel@tonic-gate /* 439*7c478bd9Sstevel@tonic-gate * reloc 440*7c478bd9Sstevel@tonic-gate */ 441*7c478bd9Sstevel@tonic-gate 442*7c478bd9Sstevel@tonic-gate /* string section */ 443*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('3', ("string section\n")); 444*7c478bd9Sstevel@tonic-gate place = info_header->str_sec.place.itm_ptr; 445*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_STRING]; 446*7c478bd9Sstevel@tonic-gate ref; place += ref->size, ref = ref->next) { 447*7c478bd9Sstevel@tonic-gate fix_itmc_ref_reloc(ref, place); 448*7c478bd9Sstevel@tonic-gate } 449*7c478bd9Sstevel@tonic-gate 450*7c478bd9Sstevel@tonic-gate /* direction */ 451*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('3', ("direction\n")); 452*7c478bd9Sstevel@tonic-gate place = info_header->direc_tbl_sec.place.itm_ptr; 453*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_DIREC]; 454*7c478bd9Sstevel@tonic-gate ref; place += ref->size, ref = ref->next) { 455*7c478bd9Sstevel@tonic-gate fix_itmc_ref_reloc(ref, place); 456*7c478bd9Sstevel@tonic-gate } 457*7c478bd9Sstevel@tonic-gate 458*7c478bd9Sstevel@tonic-gate /* condition */ 459*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('3', ("condition\n")); 460*7c478bd9Sstevel@tonic-gate place = info_header->cond_tbl_sec.place.itm_ptr; 461*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_COND]; 462*7c478bd9Sstevel@tonic-gate ref; place += ref->size, ref = ref->next) { 463*7c478bd9Sstevel@tonic-gate fix_itmc_ref_reloc(ref, place); 464*7c478bd9Sstevel@tonic-gate } 465*7c478bd9Sstevel@tonic-gate 466*7c478bd9Sstevel@tonic-gate /* map */ 467*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('3', ("map\n")); 468*7c478bd9Sstevel@tonic-gate place = info_header->map_tbl_sec.place.itm_ptr; 469*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_MAP]; 470*7c478bd9Sstevel@tonic-gate ref; place += ref->size, ref = ref->next) { 471*7c478bd9Sstevel@tonic-gate fix_itmc_ref_reloc(ref, place); 472*7c478bd9Sstevel@tonic-gate } 473*7c478bd9Sstevel@tonic-gate 474*7c478bd9Sstevel@tonic-gate /* operation */ 475*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('3', ("operation\n")); 476*7c478bd9Sstevel@tonic-gate place = info_header->op_tbl_sec.place.itm_ptr; 477*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_OP]; 478*7c478bd9Sstevel@tonic-gate ref; place += ref->size, ref = ref->next) { 479*7c478bd9Sstevel@tonic-gate fix_itmc_ref_reloc(ref, place); 480*7c478bd9Sstevel@tonic-gate } 481*7c478bd9Sstevel@tonic-gate 482*7c478bd9Sstevel@tonic-gate /* range */ 483*7c478bd9Sstevel@tonic-gate place = info_header->range_tbl_sec.place.itm_ptr; 484*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_RANGE]; 485*7c478bd9Sstevel@tonic-gate ref; place += ref->size, ref = ref->next) { 486*7c478bd9Sstevel@tonic-gate fix_itmc_ref_reloc(ref, place); 487*7c478bd9Sstevel@tonic-gate } 488*7c478bd9Sstevel@tonic-gate 489*7c478bd9Sstevel@tonic-gate /* escape sequence */ 490*7c478bd9Sstevel@tonic-gate place = info_header->escapeseq_tbl_sec.place.itm_ptr; 491*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_ESCAPESEQ]; 492*7c478bd9Sstevel@tonic-gate ref; place += ref->size, ref = ref->next) { 493*7c478bd9Sstevel@tonic-gate fix_itmc_ref_reloc(ref, place); 494*7c478bd9Sstevel@tonic-gate } 495*7c478bd9Sstevel@tonic-gate /* data section */ 496*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('3', ("data section\n")); 497*7c478bd9Sstevel@tonic-gate place = info_header->data_sec.place.itm_ptr; 498*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_DATA]; 499*7c478bd9Sstevel@tonic-gate ref; place += ref->size, ref = ref->next) { 500*7c478bd9Sstevel@tonic-gate fix_itmc_ref_reloc(ref, place); 501*7c478bd9Sstevel@tonic-gate } 502*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_EXPR]; 503*7c478bd9Sstevel@tonic-gate ref; place += ref->size, ref = ref->next) { 504*7c478bd9Sstevel@tonic-gate fix_itmc_ref_reloc(ref, place); 505*7c478bd9Sstevel@tonic-gate } 506*7c478bd9Sstevel@tonic-gate 507*7c478bd9Sstevel@tonic-gate /* name section */ 508*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('3', ("name section\n")); 509*7c478bd9Sstevel@tonic-gate place = info_header->name_plc_tbl.place.itm_ptr; 510*7c478bd9Sstevel@tonic-gate n_plc = info_header->name_sec.place.itm_ptr; 511*7c478bd9Sstevel@tonic-gate for (name = name_first; name; name = name->next) { 512*7c478bd9Sstevel@tonic-gate if ((NULL == name->object) || 513*7c478bd9Sstevel@tonic-gate (ITMC_OBJ_REGISTER == name->type) || 514*7c478bd9Sstevel@tonic-gate (0 == name->name.size)) { 515*7c478bd9Sstevel@tonic-gate continue; 516*7c478bd9Sstevel@tonic-gate } 517*7c478bd9Sstevel@tonic-gate if ((sizeof (itm_place_t)) < name->name.size) { 518*7c478bd9Sstevel@tonic-gate name->reloc.itm_ptr = n_plc; 519*7c478bd9Sstevel@tonic-gate n_plc += name->name.size; 520*7c478bd9Sstevel@tonic-gate } 521*7c478bd9Sstevel@tonic-gate if (name->object->referencee) { 522*7c478bd9Sstevel@tonic-gate ((itm_tbl_hdr_t *)(name->object->referencee))-> 523*7c478bd9Sstevel@tonic-gate name.itm_ptr = place; 524*7c478bd9Sstevel@tonic-gate } 525*7c478bd9Sstevel@tonic-gate place += (intptr_t)(sizeof (itm_data_t)); 526*7c478bd9Sstevel@tonic-gate } 527*7c478bd9Sstevel@tonic-gate place = info_header->reg_plc_tbl.place.itm_ptr; 528*7c478bd9Sstevel@tonic-gate for (name = name_first; name; name = name->next) { 529*7c478bd9Sstevel@tonic-gate if ((ITMC_OBJ_REGISTER != name->type) || 530*7c478bd9Sstevel@tonic-gate (0 == name->name.size)) { 531*7c478bd9Sstevel@tonic-gate continue; 532*7c478bd9Sstevel@tonic-gate } 533*7c478bd9Sstevel@tonic-gate if ((sizeof (itm_place_t)) < name->name.size) { 534*7c478bd9Sstevel@tonic-gate #if !defined(_LP64) 535*7c478bd9Sstevel@tonic-gate name->reloc.itm_pad = 0; 536*7c478bd9Sstevel@tonic-gate #endif 537*7c478bd9Sstevel@tonic-gate name->reloc.itm_ptr = n_plc; 538*7c478bd9Sstevel@tonic-gate n_plc += name->name.size; 539*7c478bd9Sstevel@tonic-gate } 540*7c478bd9Sstevel@tonic-gate place += (sizeof (itm_data_t)); 541*7c478bd9Sstevel@tonic-gate } 542*7c478bd9Sstevel@tonic-gate for (name = name_first; name; name = name->next) { 543*7c478bd9Sstevel@tonic-gate if (ITMC_OBJ_REGISTER == name->type) { 544*7c478bd9Sstevel@tonic-gate assert(NULL == name->object); 545*7c478bd9Sstevel@tonic-gate continue; 546*7c478bd9Sstevel@tonic-gate } 547*7c478bd9Sstevel@tonic-gate if (NULL == name->object) { 548*7c478bd9Sstevel@tonic-gate itm_error( 549*7c478bd9Sstevel@tonic-gate gettext( 550*7c478bd9Sstevel@tonic-gate "reference to %1$s \"%2$s\" is not resolved\n"), 551*7c478bd9Sstevel@tonic-gate itm_name_type_name[name->type], 552*7c478bd9Sstevel@tonic-gate name_to_str(&(name->name))); 553*7c478bd9Sstevel@tonic-gate error_deferred += 1; 554*7c478bd9Sstevel@tonic-gate continue; 555*7c478bd9Sstevel@tonic-gate } /* else */ 556*7c478bd9Sstevel@tonic-gate assert(0 != name->name.size); 557*7c478bd9Sstevel@tonic-gate for (rl = name->ref_first; rl; rl = rl->next) { 558*7c478bd9Sstevel@tonic-gate fix_itmc_ref_reloc(rl->ref, 559*7c478bd9Sstevel@tonic-gate name->object->reloc.itm_ptr); 560*7c478bd9Sstevel@tonic-gate } 561*7c478bd9Sstevel@tonic-gate if (NULL == name->object->referencee) { 562*7c478bd9Sstevel@tonic-gate itm_error( 563*7c478bd9Sstevel@tonic-gate gettext( 564*7c478bd9Sstevel@tonic-gate "reference to %1$s \"%2$s\" is not resolved\n"), 565*7c478bd9Sstevel@tonic-gate itm_name_type_name[name->type], 566*7c478bd9Sstevel@tonic-gate name_to_str(&(name->name))); 567*7c478bd9Sstevel@tonic-gate error_deferred += 1; 568*7c478bd9Sstevel@tonic-gate } 569*7c478bd9Sstevel@tonic-gate if (((ITMC_OBJ_REGISTER != name->type) && 570*7c478bd9Sstevel@tonic-gate (ITMC_OBJ_DIREC != name->type) && 571*7c478bd9Sstevel@tonic-gate ((ITMC_OBJ_MAP != name->type) || 572*7c478bd9Sstevel@tonic-gate (NULL != ref_first[ITMC_OBJ_DIREC]))) && 573*7c478bd9Sstevel@tonic-gate (NULL == name->ref_first)) { 574*7c478bd9Sstevel@tonic-gate itm_error( 575*7c478bd9Sstevel@tonic-gate gettext( 576*7c478bd9Sstevel@tonic-gate "%1$s \"%2$s\" is defined, but not referred\n"), 577*7c478bd9Sstevel@tonic-gate itm_name_type_name[name->type], 578*7c478bd9Sstevel@tonic-gate name_to_str(&(name->name))); 579*7c478bd9Sstevel@tonic-gate error_deferred += 1; 580*7c478bd9Sstevel@tonic-gate } 581*7c478bd9Sstevel@tonic-gate } 582*7c478bd9Sstevel@tonic-gate 583*7c478bd9Sstevel@tonic-gate 584*7c478bd9Sstevel@tonic-gate /* 585*7c478bd9Sstevel@tonic-gate * initial direction table 586*7c478bd9Sstevel@tonic-gate */ 587*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('3', ("initial direction table\n")); 588*7c478bd9Sstevel@tonic-gate if (NULL != ref_first[ITMC_OBJ_DIREC]) { 589*7c478bd9Sstevel@tonic-gate itm_header->direc_init_tbl = ref_first[ITMC_OBJ_DIREC]->reloc; 590*7c478bd9Sstevel@tonic-gate } else if (NULL != ref_first[ITMC_OBJ_MAP]) { 591*7c478bd9Sstevel@tonic-gate itm_header->direc_init_tbl = ref_first[ITMC_OBJ_MAP]->reloc; 592*7c478bd9Sstevel@tonic-gate } else { 593*7c478bd9Sstevel@tonic-gate itm_error(gettext("No direction nor map\n")); 594*7c478bd9Sstevel@tonic-gate exit(ITMC_STATUS_BT); 595*7c478bd9Sstevel@tonic-gate } 596*7c478bd9Sstevel@tonic-gate 597*7c478bd9Sstevel@tonic-gate /* 598*7c478bd9Sstevel@tonic-gate * init operation and reset operation 599*7c478bd9Sstevel@tonic-gate */ 600*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_OP]; 601*7c478bd9Sstevel@tonic-gate ref; place += ref->size, ref = ref->next) { 602*7c478bd9Sstevel@tonic-gate switch (((itm_tbl_hdr_t *)(ref->referencee))->type) { 603*7c478bd9Sstevel@tonic-gate case ITM_TBL_OP_INIT: 604*7c478bd9Sstevel@tonic-gate itm_header->op_init_tbl = ref->reloc; 605*7c478bd9Sstevel@tonic-gate break; 606*7c478bd9Sstevel@tonic-gate case ITM_TBL_OP_RESET: 607*7c478bd9Sstevel@tonic-gate itm_header->op_reset_tbl = ref->reloc; 608*7c478bd9Sstevel@tonic-gate break; 609*7c478bd9Sstevel@tonic-gate default: 610*7c478bd9Sstevel@tonic-gate break; 611*7c478bd9Sstevel@tonic-gate } 612*7c478bd9Sstevel@tonic-gate } 613*7c478bd9Sstevel@tonic-gate } 614*7c478bd9Sstevel@tonic-gate 615*7c478bd9Sstevel@tonic-gate 616*7c478bd9Sstevel@tonic-gate /* 617*7c478bd9Sstevel@tonic-gate * Fix reloc and referencer 618*7c478bd9Sstevel@tonic-gate */ 619*7c478bd9Sstevel@tonic-gate static void 620*7c478bd9Sstevel@tonic-gate fix_itmc_ref_reloc(itmc_ref_t *ref, itm_place2_t place) 621*7c478bd9Sstevel@tonic-gate { 622*7c478bd9Sstevel@tonic-gate itmc_ref_link_t *rl; 623*7c478bd9Sstevel@tonic-gate 624*7c478bd9Sstevel@tonic-gate ref->reloc.itm_ptr = place; 625*7c478bd9Sstevel@tonic-gate #if !defined(_LP64) 626*7c478bd9Sstevel@tonic-gate ref->reloc.itm_pad = 0; 627*7c478bd9Sstevel@tonic-gate #endif 628*7c478bd9Sstevel@tonic-gate 629*7c478bd9Sstevel@tonic-gate if (NULL != ref->referencer) { 630*7c478bd9Sstevel@tonic-gate ref->referencer->itm_ptr = place; 631*7c478bd9Sstevel@tonic-gate } 632*7c478bd9Sstevel@tonic-gate 633*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('f', ("fix_itmc_ref_reloc: 0x%08p 0x%08p %p\n", 634*7c478bd9Sstevel@tonic-gate ref, ref->referencer, place)); 635*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('F', ("fix_itmc_ref_reloc: \"%s\"\n", 636*7c478bd9Sstevel@tonic-gate name_to_str(ref->name ? &(ref->name->name) : NULL))); 637*7c478bd9Sstevel@tonic-gate 638*7c478bd9Sstevel@tonic-gate if (NULL != ref->name) { 639*7c478bd9Sstevel@tonic-gate for (rl = ref->name->ref_first; rl; rl = rl->next) { 640*7c478bd9Sstevel@tonic-gate if ((NULL != rl->ref) && 641*7c478bd9Sstevel@tonic-gate (NULL != rl->ref->referencer)) { 642*7c478bd9Sstevel@tonic-gate rl->ref->referencer->itm_ptr = place; 643*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('f', 644*7c478bd9Sstevel@tonic-gate ("fix_itmc_ref_reloc: " 645*7c478bd9Sstevel@tonic-gate "0x%08p 0x%08p\n", 646*7c478bd9Sstevel@tonic-gate rl->ref, rl->ref->referencer)); 647*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('F', 648*7c478bd9Sstevel@tonic-gate ("fix_itmc_ref_reloc: \"%s\"\n", 649*7c478bd9Sstevel@tonic-gate name_to_str(ref->name ? 650*7c478bd9Sstevel@tonic-gate &(ref->name->name) : 651*7c478bd9Sstevel@tonic-gate NULL))); 652*7c478bd9Sstevel@tonic-gate } 653*7c478bd9Sstevel@tonic-gate } 654*7c478bd9Sstevel@tonic-gate } 655*7c478bd9Sstevel@tonic-gate } 656*7c478bd9Sstevel@tonic-gate 657*7c478bd9Sstevel@tonic-gate /* 658*7c478bd9Sstevel@tonic-gate * Analysis 659*7c478bd9Sstevel@tonic-gate */ 660*7c478bd9Sstevel@tonic-gate static void 661*7c478bd9Sstevel@tonic-gate analysis(itm_info_hdr_t *info_header) 662*7c478bd9Sstevel@tonic-gate { 663*7c478bd9Sstevel@tonic-gate itmc_ref_t *ref; 664*7c478bd9Sstevel@tonic-gate itm_place2_t place; 665*7c478bd9Sstevel@tonic-gate itm_type_t obj_type; 666*7c478bd9Sstevel@tonic-gate enum { ONEMAP, ZEROMAP} onemap = ZEROMAP; 667*7c478bd9Sstevel@tonic-gate 668*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('4', ("Analysis\n")); 669*7c478bd9Sstevel@tonic-gate 670*7c478bd9Sstevel@tonic-gate place = info_header->str_sec.place.itm_ptr; 671*7c478bd9Sstevel@tonic-gate for (obj_type = ITMC_OBJ_FIRST; obj_type <= ITMC_OBJ_LAST; obj_type++) { 672*7c478bd9Sstevel@tonic-gate if (ITMC_OBJ_DIREC == obj_type) { 673*7c478bd9Sstevel@tonic-gate continue; 674*7c478bd9Sstevel@tonic-gate } 675*7c478bd9Sstevel@tonic-gate 676*7c478bd9Sstevel@tonic-gate for (ref = ref_first[obj_type]; 677*7c478bd9Sstevel@tonic-gate ref; place += ref->size, ref = ref->next) { 678*7c478bd9Sstevel@tonic-gate if ((NULL == ref->name) && 679*7c478bd9Sstevel@tonic-gate (NULL == ref->referencer)) { 680*7c478bd9Sstevel@tonic-gate itm_tbl_hdr_t *tbl_hdr; 681*7c478bd9Sstevel@tonic-gate char *tbl_type; 682*7c478bd9Sstevel@tonic-gate tbl_hdr = (itm_tbl_hdr_t *)(ref->referencee); 683*7c478bd9Sstevel@tonic-gate if ((ITM_TBL_OP_RESET == tbl_hdr->type) || 684*7c478bd9Sstevel@tonic-gate (ITM_TBL_OP_INIT == tbl_hdr->type)) { 685*7c478bd9Sstevel@tonic-gate continue; 686*7c478bd9Sstevel@tonic-gate } else if ((ITM_TBL_MAP == 687*7c478bd9Sstevel@tonic-gate (ITM_TBL_MASK & tbl_hdr->type)) && 688*7c478bd9Sstevel@tonic-gate (NULL == ref_first[ITMC_OBJ_DIREC])) { 689*7c478bd9Sstevel@tonic-gate if (ZEROMAP == onemap) { 690*7c478bd9Sstevel@tonic-gate onemap = ONEMAP; 691*7c478bd9Sstevel@tonic-gate continue; 692*7c478bd9Sstevel@tonic-gate } else { 693*7c478bd9Sstevel@tonic-gate itm_error( 694*7c478bd9Sstevel@tonic-gate gettext("multiple unamed map's " 695*7c478bd9Sstevel@tonic-gate "defined\n")); 696*7c478bd9Sstevel@tonic-gate error_deferred += 1; 697*7c478bd9Sstevel@tonic-gate continue; 698*7c478bd9Sstevel@tonic-gate } 699*7c478bd9Sstevel@tonic-gate } 700*7c478bd9Sstevel@tonic-gate switch (ITM_TBL_MASK & tbl_hdr->type) { 701*7c478bd9Sstevel@tonic-gate case ITM_TBL_ITM: 702*7c478bd9Sstevel@tonic-gate tbl_type = 703*7c478bd9Sstevel@tonic-gate itm_name_type_name[ITMC_OBJ_ITM]; 704*7c478bd9Sstevel@tonic-gate break; 705*7c478bd9Sstevel@tonic-gate case ITM_TBL_DIREC: 706*7c478bd9Sstevel@tonic-gate tbl_type = 707*7c478bd9Sstevel@tonic-gate itm_name_type_name[ITMC_OBJ_DIREC]; 708*7c478bd9Sstevel@tonic-gate break; 709*7c478bd9Sstevel@tonic-gate case ITM_TBL_COND: 710*7c478bd9Sstevel@tonic-gate tbl_type = 711*7c478bd9Sstevel@tonic-gate itm_name_type_name[ITMC_OBJ_COND]; 712*7c478bd9Sstevel@tonic-gate break; 713*7c478bd9Sstevel@tonic-gate case ITM_TBL_OP: 714*7c478bd9Sstevel@tonic-gate tbl_type = 715*7c478bd9Sstevel@tonic-gate itm_name_type_name[ITMC_OBJ_OP]; 716*7c478bd9Sstevel@tonic-gate break; 717*7c478bd9Sstevel@tonic-gate case ITM_TBL_MAP: 718*7c478bd9Sstevel@tonic-gate tbl_type = 719*7c478bd9Sstevel@tonic-gate itm_name_type_name[ITMC_OBJ_MAP]; 720*7c478bd9Sstevel@tonic-gate break; 721*7c478bd9Sstevel@tonic-gate case ITM_TBL_RANGE: 722*7c478bd9Sstevel@tonic-gate tbl_type = 723*7c478bd9Sstevel@tonic-gate itm_name_type_name[ITMC_OBJ_RANGE]; 724*7c478bd9Sstevel@tonic-gate break; 725*7c478bd9Sstevel@tonic-gate case ITM_TBL_ESCAPESEQ: 726*7c478bd9Sstevel@tonic-gate tbl_type = 727*7c478bd9Sstevel@tonic-gate itm_name_type_name[ITMC_OBJ_ESCAPESEQ]; 728*7c478bd9Sstevel@tonic-gate break; 729*7c478bd9Sstevel@tonic-gate default: 730*7c478bd9Sstevel@tonic-gate tbl_type = 731*7c478bd9Sstevel@tonic-gate itm_name_type_name[ITMC_OBJ_NONE]; 732*7c478bd9Sstevel@tonic-gate break; 733*7c478bd9Sstevel@tonic-gate } 734*7c478bd9Sstevel@tonic-gate itm_error( 735*7c478bd9Sstevel@tonic-gate gettext("unnamed %1$s-type object is " 736*7c478bd9Sstevel@tonic-gate "defined, but not referenced\n"), 737*7c478bd9Sstevel@tonic-gate tbl_type); 738*7c478bd9Sstevel@tonic-gate error_deferred += 1; 739*7c478bd9Sstevel@tonic-gate } 740*7c478bd9Sstevel@tonic-gate } 741*7c478bd9Sstevel@tonic-gate } 742*7c478bd9Sstevel@tonic-gate } 743*7c478bd9Sstevel@tonic-gate 744*7c478bd9Sstevel@tonic-gate /* 745*7c478bd9Sstevel@tonic-gate * Analysis2 (check #nest of operation) 746*7c478bd9Sstevel@tonic-gate */ 747*7c478bd9Sstevel@tonic-gate #define NIL -1 748*7c478bd9Sstevel@tonic-gate static void 749*7c478bd9Sstevel@tonic-gate analysis2(void) 750*7c478bd9Sstevel@tonic-gate { 751*7c478bd9Sstevel@tonic-gate int i, j, k, n_op; 752*7c478bd9Sstevel@tonic-gate itmc_ref_t *ref; 753*7c478bd9Sstevel@tonic-gate itm_op_outer_t *o, *o_prev; 754*7c478bd9Sstevel@tonic-gate itm_op_inner_t *in, *in_prev; 755*7c478bd9Sstevel@tonic-gate int indegree_zero; 756*7c478bd9Sstevel@tonic-gate struct op_nest_vertex { 757*7c478bd9Sstevel@tonic-gate itmc_ref_t *ref; /* corresponding object's ref */ 758*7c478bd9Sstevel@tonic-gate int indegree; /* indegree */ 759*7c478bd9Sstevel@tonic-gate struct op_nest_edge *e; /* link of edge list */ 760*7c478bd9Sstevel@tonic-gate int z_link; /* index of indegree zero */ 761*7c478bd9Sstevel@tonic-gate int n_nest; 762*7c478bd9Sstevel@tonic-gate }; 763*7c478bd9Sstevel@tonic-gate struct op_nest_edge { 764*7c478bd9Sstevel@tonic-gate struct op_nest_edge *e; /* link of edge list */ 765*7c478bd9Sstevel@tonic-gate int index; /* index of edge */ 766*7c478bd9Sstevel@tonic-gate }; 767*7c478bd9Sstevel@tonic-gate struct op_nest_vertex *vertexes; 768*7c478bd9Sstevel@tonic-gate struct op_nest_edge *e, *e_prev; 769*7c478bd9Sstevel@tonic-gate 770*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('5', ("Analysis2\n")); 771*7c478bd9Sstevel@tonic-gate 772*7c478bd9Sstevel@tonic-gate #ifdef ENABLE_TRACE 773*7c478bd9Sstevel@tonic-gate for (o = itm_op_outer; o != NULL; o = o->link) { 774*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('L', ("op(table)%x\n", o->optbl)); 775*7c478bd9Sstevel@tonic-gate } 776*7c478bd9Sstevel@tonic-gate #endif 777*7c478bd9Sstevel@tonic-gate i = 0; 778*7c478bd9Sstevel@tonic-gate for (o = itm_op_outer; o != NULL; o = o->link) { 779*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_OP]; ref != NULL; 780*7c478bd9Sstevel@tonic-gate ref = ref->next) { 781*7c478bd9Sstevel@tonic-gate if (o->optbl == ref->referencee) { 782*7c478bd9Sstevel@tonic-gate if (ref->name != NULL) { 783*7c478bd9Sstevel@tonic-gate o->ref = ref->name->object; 784*7c478bd9Sstevel@tonic-gate } else { 785*7c478bd9Sstevel@tonic-gate o->ref = ref; 786*7c478bd9Sstevel@tonic-gate } 787*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('l', ("op(table)%x<-ref(%x)\n", 788*7c478bd9Sstevel@tonic-gate o->optbl, o->ref)); 789*7c478bd9Sstevel@tonic-gate o->ref->vertex_index = i; 790*7c478bd9Sstevel@tonic-gate i++; 791*7c478bd9Sstevel@tonic-gate break; 792*7c478bd9Sstevel@tonic-gate } 793*7c478bd9Sstevel@tonic-gate } 794*7c478bd9Sstevel@tonic-gate } 795*7c478bd9Sstevel@tonic-gate 796*7c478bd9Sstevel@tonic-gate n_op = i; 797*7c478bd9Sstevel@tonic-gate if (n_op == 0) 798*7c478bd9Sstevel@tonic-gate return; 799*7c478bd9Sstevel@tonic-gate vertexes = (struct op_nest_vertex *)(malloc_vital( 800*7c478bd9Sstevel@tonic-gate sizeof (struct op_nest_vertex) * n_op)); 801*7c478bd9Sstevel@tonic-gate 802*7c478bd9Sstevel@tonic-gate for (o = itm_op_outer; o != NULL; o = o->link) { 803*7c478bd9Sstevel@tonic-gate if (o->ref == NULL) { 804*7c478bd9Sstevel@tonic-gate continue; 805*7c478bd9Sstevel@tonic-gate } 806*7c478bd9Sstevel@tonic-gate vertexes[o->ref->vertex_index].ref = o->ref; 807*7c478bd9Sstevel@tonic-gate vertexes[o->ref->vertex_index].e = NULL; 808*7c478bd9Sstevel@tonic-gate } 809*7c478bd9Sstevel@tonic-gate 810*7c478bd9Sstevel@tonic-gate for (o = itm_op_outer; o != NULL; o_prev = o, 811*7c478bd9Sstevel@tonic-gate o = o->link, free(o_prev)) { 812*7c478bd9Sstevel@tonic-gate if (o->ref == NULL) { 813*7c478bd9Sstevel@tonic-gate continue; 814*7c478bd9Sstevel@tonic-gate } 815*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('l', ("vertexes[%d].ref=%x (optbl=%x(%s))\n", 816*7c478bd9Sstevel@tonic-gate o->ref->vertex_index, o->ref, o->ref->referencee, 817*7c478bd9Sstevel@tonic-gate name_to_str(o->ref->name == NULL ? NULL : 818*7c478bd9Sstevel@tonic-gate &(o->ref->name->name)))); 819*7c478bd9Sstevel@tonic-gate for (in = o->in; in != NULL; 820*7c478bd9Sstevel@tonic-gate in_prev = in, in = in->in, free(in_prev)) { 821*7c478bd9Sstevel@tonic-gate /* make edge */ 822*7c478bd9Sstevel@tonic-gate i = o->ref->vertex_index; 823*7c478bd9Sstevel@tonic-gate j = in->ref->name->object->vertex_index; 824*7c478bd9Sstevel@tonic-gate e = malloc_vital(sizeof (struct op_nest_edge)); 825*7c478bd9Sstevel@tonic-gate e->index = j; 826*7c478bd9Sstevel@tonic-gate e->e = vertexes[i].e; 827*7c478bd9Sstevel@tonic-gate vertexes[i].e = e; 828*7c478bd9Sstevel@tonic-gate vertexes[j].indegree++; 829*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('l', 830*7c478bd9Sstevel@tonic-gate (" edge: vertexes[%d]:(%s) ->vertex[%d]:(%s)\n", 831*7c478bd9Sstevel@tonic-gate i, 832*7c478bd9Sstevel@tonic-gate name_to_str( 833*7c478bd9Sstevel@tonic-gate (vertexes[i].ref->name == NULL) ? NULL : 834*7c478bd9Sstevel@tonic-gate &(vertexes[i].ref->name->name)), 835*7c478bd9Sstevel@tonic-gate j, 836*7c478bd9Sstevel@tonic-gate name_to_str( 837*7c478bd9Sstevel@tonic-gate (vertexes[j].ref->name == NULL) ? NULL : 838*7c478bd9Sstevel@tonic-gate &(vertexes[j].ref->name->name)))); 839*7c478bd9Sstevel@tonic-gate } 840*7c478bd9Sstevel@tonic-gate } 841*7c478bd9Sstevel@tonic-gate 842*7c478bd9Sstevel@tonic-gate indegree_zero = NIL; 843*7c478bd9Sstevel@tonic-gate for (i = 0; i < n_op; i++) { 844*7c478bd9Sstevel@tonic-gate if (vertexes[i].indegree == 0) { 845*7c478bd9Sstevel@tonic-gate vertexes[i].z_link = indegree_zero; 846*7c478bd9Sstevel@tonic-gate indegree_zero = i; 847*7c478bd9Sstevel@tonic-gate } 848*7c478bd9Sstevel@tonic-gate } 849*7c478bd9Sstevel@tonic-gate 850*7c478bd9Sstevel@tonic-gate for (i = 0; i < n_op; i++) { 851*7c478bd9Sstevel@tonic-gate if (indegree_zero == NIL) { 852*7c478bd9Sstevel@tonic-gate itm_error( 853*7c478bd9Sstevel@tonic-gate gettext("operation loop detected\n")); 854*7c478bd9Sstevel@tonic-gate exit(ITMC_STATUS_BT2); 855*7c478bd9Sstevel@tonic-gate } 856*7c478bd9Sstevel@tonic-gate k = indegree_zero; 857*7c478bd9Sstevel@tonic-gate indegree_zero = vertexes[indegree_zero].z_link; 858*7c478bd9Sstevel@tonic-gate 859*7c478bd9Sstevel@tonic-gate if (vertexes[k].n_nest > MAXOPNEST) { 860*7c478bd9Sstevel@tonic-gate itm_error( 861*7c478bd9Sstevel@tonic-gate gettext("operation nested more than %d\n"), 862*7c478bd9Sstevel@tonic-gate MAXOPNEST); 863*7c478bd9Sstevel@tonic-gate exit(ITMC_STATUS_BT2); 864*7c478bd9Sstevel@tonic-gate } 865*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('l', 866*7c478bd9Sstevel@tonic-gate ("take out first vertex: vertexes[%d] (i.e.%s) " 867*7c478bd9Sstevel@tonic-gate "#depth=%d\n", k, name_to_str( 868*7c478bd9Sstevel@tonic-gate (vertexes[k].ref->name == NULL) ? NULL : 869*7c478bd9Sstevel@tonic-gate &(vertexes[k].ref->name->name)), 870*7c478bd9Sstevel@tonic-gate vertexes[k].n_nest)); 871*7c478bd9Sstevel@tonic-gate 872*7c478bd9Sstevel@tonic-gate for (e = vertexes[k].e; e != NULL; 873*7c478bd9Sstevel@tonic-gate e_prev = e, e = e->e, free(e_prev)) { 874*7c478bd9Sstevel@tonic-gate j = e->index; 875*7c478bd9Sstevel@tonic-gate if (vertexes[j].n_nest < vertexes[k].n_nest + 1) { 876*7c478bd9Sstevel@tonic-gate vertexes[j].n_nest = 877*7c478bd9Sstevel@tonic-gate vertexes[k].n_nest + 1; 878*7c478bd9Sstevel@tonic-gate } 879*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('l', (" +->vertexes[%d]:(%s) " 880*7c478bd9Sstevel@tonic-gate "(#indegree=%d,#depth = %d)\n", 881*7c478bd9Sstevel@tonic-gate j, name_to_str(&(vertexes[j].ref->name->name)), 882*7c478bd9Sstevel@tonic-gate vertexes[j].indegree, vertexes[j].n_nest)); 883*7c478bd9Sstevel@tonic-gate vertexes[j].indegree--; 884*7c478bd9Sstevel@tonic-gate if (vertexes[j].indegree == 0) { 885*7c478bd9Sstevel@tonic-gate vertexes[j].z_link = indegree_zero; 886*7c478bd9Sstevel@tonic-gate indegree_zero = j; 887*7c478bd9Sstevel@tonic-gate } 888*7c478bd9Sstevel@tonic-gate } 889*7c478bd9Sstevel@tonic-gate } 890*7c478bd9Sstevel@tonic-gate free(vertexes); 891*7c478bd9Sstevel@tonic-gate } 892*7c478bd9Sstevel@tonic-gate #undef NIL 893*7c478bd9Sstevel@tonic-gate 894*7c478bd9Sstevel@tonic-gate /* 895*7c478bd9Sstevel@tonic-gate * Output ITM compiled data 896*7c478bd9Sstevel@tonic-gate */ 897*7c478bd9Sstevel@tonic-gate void 898*7c478bd9Sstevel@tonic-gate output(itm_hdr_t *itm_header, itm_info_hdr_t *info_header) 899*7c478bd9Sstevel@tonic-gate { 900*7c478bd9Sstevel@tonic-gate itmc_ref_t *ref; 901*7c478bd9Sstevel@tonic-gate itmc_name_t *name; 902*7c478bd9Sstevel@tonic-gate itm_size_t sec_size; 903*7c478bd9Sstevel@tonic-gate struct stat st_buf; 904*7c478bd9Sstevel@tonic-gate int fd; 905*7c478bd9Sstevel@tonic-gate FILE *fp; 906*7c478bd9Sstevel@tonic-gate 907*7c478bd9Sstevel@tonic-gate if (cmd_opt.no_output) { 908*7c478bd9Sstevel@tonic-gate return; 909*7c478bd9Sstevel@tonic-gate } else if (NULL == itm_output_file) { 910*7c478bd9Sstevel@tonic-gate fd = 1; 911*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('o', ("file=(stdout)\n")); 912*7c478bd9Sstevel@tonic-gate } else { 913*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('o', ("file=%s\n", itm_output_file)); 914*7c478bd9Sstevel@tonic-gate switch (stat(itm_output_file, &st_buf)) { 915*7c478bd9Sstevel@tonic-gate case 0: 916*7c478bd9Sstevel@tonic-gate if (0 == cmd_opt.force_overwrite) { 917*7c478bd9Sstevel@tonic-gate itm_error( 918*7c478bd9Sstevel@tonic-gate gettext("target file exists\n")); 919*7c478bd9Sstevel@tonic-gate exit(ITMC_STATUS_CMD2); 920*7c478bd9Sstevel@tonic-gate } 921*7c478bd9Sstevel@tonic-gate break; 922*7c478bd9Sstevel@tonic-gate case -1: 923*7c478bd9Sstevel@tonic-gate if (ENOENT != errno) { 924*7c478bd9Sstevel@tonic-gate PERROR(gettext("stat")); 925*7c478bd9Sstevel@tonic-gate exit(ITMC_STATUS_CMD2); 926*7c478bd9Sstevel@tonic-gate } 927*7c478bd9Sstevel@tonic-gate break; 928*7c478bd9Sstevel@tonic-gate default: 929*7c478bd9Sstevel@tonic-gate PERROR(gettext("stat")); 930*7c478bd9Sstevel@tonic-gate exit(ITMC_STATUS_SYS); 931*7c478bd9Sstevel@tonic-gate break; 932*7c478bd9Sstevel@tonic-gate } 933*7c478bd9Sstevel@tonic-gate 934*7c478bd9Sstevel@tonic-gate fd = open(itm_output_file, O_CREAT|O_WRONLY|O_TRUNC, 0666); 935*7c478bd9Sstevel@tonic-gate if (fd == -1) { 936*7c478bd9Sstevel@tonic-gate PERROR(gettext("open")); 937*7c478bd9Sstevel@tonic-gate exit(ITMC_STATUS_SYS); 938*7c478bd9Sstevel@tonic-gate } 939*7c478bd9Sstevel@tonic-gate } 940*7c478bd9Sstevel@tonic-gate fp = fdopen(fd, "w"); 941*7c478bd9Sstevel@tonic-gate if (NULL == fp) { 942*7c478bd9Sstevel@tonic-gate PERROR(gettext("fdopen")); 943*7c478bd9Sstevel@tonic-gate exit(ITMC_STATUS_SYS); 944*7c478bd9Sstevel@tonic-gate } 945*7c478bd9Sstevel@tonic-gate 946*7c478bd9Sstevel@tonic-gate if (1 == cmd_opt.strip) { 947*7c478bd9Sstevel@tonic-gate itm_header->info_hdr.itm_ptr = 0; 948*7c478bd9Sstevel@tonic-gate } 949*7c478bd9Sstevel@tonic-gate 950*7c478bd9Sstevel@tonic-gate /* ITM header */ 951*7c478bd9Sstevel@tonic-gate (void) fseek(fp, 0, SEEK_SET); 952*7c478bd9Sstevel@tonic-gate (void) fwrite(itm_header, sizeof (itm_hdr_t), 1, fp); 953*7c478bd9Sstevel@tonic-gate 954*7c478bd9Sstevel@tonic-gate /* string section */ 955*7c478bd9Sstevel@tonic-gate (void) fseek(fp, info_header->str_sec.place.itm_ptr, SEEK_SET); 956*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('P', ("str_sec.place.place=%p:\n", 957*7c478bd9Sstevel@tonic-gate info_header->str_sec.place.itm_ptr)); 958*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_STRING]; ref; ref = ref->next) { 959*7c478bd9Sstevel@tonic-gate (void) fwrite((void *)(ref->referencee), 1, ref->size, fp); 960*7c478bd9Sstevel@tonic-gate } 961*7c478bd9Sstevel@tonic-gate 962*7c478bd9Sstevel@tonic-gate /* direction */ 963*7c478bd9Sstevel@tonic-gate (void) fseek(fp, info_header->direc_tbl_sec.place.itm_ptr, SEEK_SET); 964*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('P', ("direc_tbl_sec.place=%p:\n", 965*7c478bd9Sstevel@tonic-gate info_header->direc_tbl_sec.place.itm_ptr)); 966*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_DIREC]; ref; ref = ref->next) { 967*7c478bd9Sstevel@tonic-gate (void) fwrite((void *)(ref->referencee), ref->size, 1, fp); 968*7c478bd9Sstevel@tonic-gate } 969*7c478bd9Sstevel@tonic-gate 970*7c478bd9Sstevel@tonic-gate /* condition */ 971*7c478bd9Sstevel@tonic-gate (void) fseek(fp, info_header->cond_tbl_sec.place.itm_ptr, SEEK_SET); 972*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('P', ("cond_tbl_sec.place=%p:\n", 973*7c478bd9Sstevel@tonic-gate info_header->cond_tbl_sec.place.itm_ptr)); 974*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_COND]; ref; ref = ref->next) { 975*7c478bd9Sstevel@tonic-gate (void) fwrite((void *)(ref->referencee), ref->size, 1, fp); 976*7c478bd9Sstevel@tonic-gate } 977*7c478bd9Sstevel@tonic-gate 978*7c478bd9Sstevel@tonic-gate /* map */ 979*7c478bd9Sstevel@tonic-gate (void) fseek(fp, info_header->map_tbl_sec.place.itm_ptr, SEEK_SET); 980*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('P', ("map_tbl_sec.place=%p:\n", 981*7c478bd9Sstevel@tonic-gate info_header->map_tbl_sec.place.itm_ptr)); 982*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_MAP]; ref; ref = ref->next) { 983*7c478bd9Sstevel@tonic-gate (void) fwrite((void *)(ref->referencee), ref->size, 1, fp); 984*7c478bd9Sstevel@tonic-gate } 985*7c478bd9Sstevel@tonic-gate 986*7c478bd9Sstevel@tonic-gate /* operation */ 987*7c478bd9Sstevel@tonic-gate (void) fseek(fp, info_header->op_tbl_sec.place.itm_ptr, SEEK_SET); 988*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('P', ("op_tbl_sec.place=%p:\n", 989*7c478bd9Sstevel@tonic-gate info_header->op_tbl_sec.place.itm_ptr)); 990*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_OP]; ref; ref = ref->next) { 991*7c478bd9Sstevel@tonic-gate (void) fwrite((void *)(ref->referencee), ref->size, 1, fp); 992*7c478bd9Sstevel@tonic-gate } 993*7c478bd9Sstevel@tonic-gate 994*7c478bd9Sstevel@tonic-gate /* range */ 995*7c478bd9Sstevel@tonic-gate (void) fseek(fp, info_header->range_tbl_sec.place.itm_ptr, SEEK_SET); 996*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('P', ("range_tbl_sec.place=%p:\n", 997*7c478bd9Sstevel@tonic-gate info_header->range_tbl_sec.place.itm_ptr)); 998*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_RANGE]; ref; ref = ref->next) { 999*7c478bd9Sstevel@tonic-gate (void) fwrite((void *)(ref->referencee), ref->size, 1, fp); 1000*7c478bd9Sstevel@tonic-gate } 1001*7c478bd9Sstevel@tonic-gate 1002*7c478bd9Sstevel@tonic-gate /* escape sequence */ 1003*7c478bd9Sstevel@tonic-gate (void) fseek(fp, info_header->escapeseq_tbl_sec.place.itm_ptr, 1004*7c478bd9Sstevel@tonic-gate SEEK_SET); 1005*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('P', ("escapeseq_tbl_sec.place=%p:\n", 1006*7c478bd9Sstevel@tonic-gate info_header->escapeseq_tbl_sec.place.itm_ptr)); 1007*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_ESCAPESEQ]; ref; ref = ref->next) { 1008*7c478bd9Sstevel@tonic-gate (void) fwrite((void *)(ref->referencee), ref->size, 1, fp); 1009*7c478bd9Sstevel@tonic-gate } 1010*7c478bd9Sstevel@tonic-gate 1011*7c478bd9Sstevel@tonic-gate /* data section */ 1012*7c478bd9Sstevel@tonic-gate sec_size = 0; 1013*7c478bd9Sstevel@tonic-gate (void) fseek(fp, info_header->data_sec.place.itm_ptr, SEEK_SET); 1014*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('P', ("data_sec.place=%p:\n", 1015*7c478bd9Sstevel@tonic-gate info_header->data_sec.place.itm_ptr)); 1016*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_DATA]; ref; ref = ref->next) { 1017*7c478bd9Sstevel@tonic-gate (void) fwrite((void *)(ref->referencee), ref->size, 1, fp); 1018*7c478bd9Sstevel@tonic-gate sec_size += ref->size; 1019*7c478bd9Sstevel@tonic-gate } 1020*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_EXPR]; ref; ref = ref->next) { 1021*7c478bd9Sstevel@tonic-gate (void) fwrite((void *)(ref->referencee), ref->size, 1, fp); 1022*7c478bd9Sstevel@tonic-gate sec_size += ref->size; 1023*7c478bd9Sstevel@tonic-gate } 1024*7c478bd9Sstevel@tonic-gate if (0 != cmd_opt.strip) { 1025*7c478bd9Sstevel@tonic-gate if (sec_size < info_header->data_sec.size) { 1026*7c478bd9Sstevel@tonic-gate (void) fwrite("\0\0\0\0", 1, 1027*7c478bd9Sstevel@tonic-gate info_header->data_sec.size - sec_size, fp); 1028*7c478bd9Sstevel@tonic-gate } 1029*7c478bd9Sstevel@tonic-gate } else { 1030*7c478bd9Sstevel@tonic-gate 1031*7c478bd9Sstevel@tonic-gate /* ITM Info header */ 1032*7c478bd9Sstevel@tonic-gate (void) fseek(fp, itm_header->info_hdr.itm_ptr, SEEK_SET); 1033*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('P', ("info_hdr=%p:\n", 1034*7c478bd9Sstevel@tonic-gate itm_header->info_hdr.itm_ptr)); 1035*7c478bd9Sstevel@tonic-gate (void) fwrite(info_header, sizeof (itm_info_hdr_t), 1, fp); 1036*7c478bd9Sstevel@tonic-gate 1037*7c478bd9Sstevel@tonic-gate (void) fseek(fp, info_header->direc_plc_tbl.place.itm_ptr, 1038*7c478bd9Sstevel@tonic-gate SEEK_SET); 1039*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('P', ("direc_plc_tbl.place=%p:\n", 1040*7c478bd9Sstevel@tonic-gate info_header->direc_plc_tbl.place.itm_ptr)); 1041*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_DIREC]; ref; ref = ref->next) { 1042*7c478bd9Sstevel@tonic-gate (void) fwrite(&(ref->reloc), 1043*7c478bd9Sstevel@tonic-gate sizeof (itm_place_t), 1, fp); 1044*7c478bd9Sstevel@tonic-gate } 1045*7c478bd9Sstevel@tonic-gate 1046*7c478bd9Sstevel@tonic-gate (void) fseek(fp, info_header->cond_plc_tbl.place.itm_ptr, 1047*7c478bd9Sstevel@tonic-gate SEEK_SET); 1048*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('P', ("cond_plc_tbl.place=%p:\n", 1049*7c478bd9Sstevel@tonic-gate info_header->cond_plc_tbl.place.itm_ptr)); 1050*7c478bd9Sstevel@tonic-gate 1051*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_COND]; ref; ref = ref->next) { 1052*7c478bd9Sstevel@tonic-gate (void) fwrite(&(ref->reloc), 1053*7c478bd9Sstevel@tonic-gate sizeof (itm_place_t), 1, fp); 1054*7c478bd9Sstevel@tonic-gate } 1055*7c478bd9Sstevel@tonic-gate 1056*7c478bd9Sstevel@tonic-gate (void) fseek(fp, info_header->map_plc_tbl.place.itm_ptr, 1057*7c478bd9Sstevel@tonic-gate SEEK_SET); 1058*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('P', ("map_plc_tbl.place=%p:\n", 1059*7c478bd9Sstevel@tonic-gate info_header->map_plc_tbl.place.itm_ptr)); 1060*7c478bd9Sstevel@tonic-gate 1061*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_MAP]; ref; ref = ref->next) { 1062*7c478bd9Sstevel@tonic-gate (void) fwrite(&(ref->reloc), 1063*7c478bd9Sstevel@tonic-gate sizeof (itm_place_t), 1, fp); 1064*7c478bd9Sstevel@tonic-gate } 1065*7c478bd9Sstevel@tonic-gate 1066*7c478bd9Sstevel@tonic-gate (void) fseek(fp, info_header->op_plc_tbl.place.itm_ptr, 1067*7c478bd9Sstevel@tonic-gate SEEK_SET); 1068*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('P', ("op_plc_tbl.place=%p:\n", 1069*7c478bd9Sstevel@tonic-gate info_header->op_plc_tbl.place.itm_ptr)); 1070*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_OP]; ref; ref = ref->next) { 1071*7c478bd9Sstevel@tonic-gate (void) fwrite(&(ref->reloc), 1072*7c478bd9Sstevel@tonic-gate sizeof (itm_place_t), 1, fp); 1073*7c478bd9Sstevel@tonic-gate } 1074*7c478bd9Sstevel@tonic-gate 1075*7c478bd9Sstevel@tonic-gate (void) fseek(fp, info_header->str_plc_tbl.place.itm_ptr, 1076*7c478bd9Sstevel@tonic-gate SEEK_SET); 1077*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('P', ("str_plc_tbl.place=%p:\n", 1078*7c478bd9Sstevel@tonic-gate info_header->str_plc_tbl.place.itm_ptr)); 1079*7c478bd9Sstevel@tonic-gate 1080*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_STRING]; ref; ref = ref->next) { 1081*7c478bd9Sstevel@tonic-gate itm_data_t data; 1082*7c478bd9Sstevel@tonic-gate #if !defined(_LP64) 1083*7c478bd9Sstevel@tonic-gate data.place.itm_pad = 0; 1084*7c478bd9Sstevel@tonic-gate data.pad = 0; 1085*7c478bd9Sstevel@tonic-gate #endif 1086*7c478bd9Sstevel@tonic-gate data.place = ref->reloc; 1087*7c478bd9Sstevel@tonic-gate data.size = ref->size; 1088*7c478bd9Sstevel@tonic-gate (void) fwrite(&data, sizeof (itm_data_t), 1, fp); 1089*7c478bd9Sstevel@tonic-gate } 1090*7c478bd9Sstevel@tonic-gate 1091*7c478bd9Sstevel@tonic-gate (void) fseek(fp, info_header->range_plc_tbl.place.itm_ptr, 1092*7c478bd9Sstevel@tonic-gate SEEK_SET); 1093*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('P', ("range_plc_tbl.place=%p:\n", 1094*7c478bd9Sstevel@tonic-gate info_header->range_plc_tbl.place.itm_ptr)); 1095*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_RANGE]; ref; ref = ref->next) { 1096*7c478bd9Sstevel@tonic-gate (void) fwrite(&(ref->reloc), 1097*7c478bd9Sstevel@tonic-gate sizeof (itm_place_t), 1, fp); 1098*7c478bd9Sstevel@tonic-gate } 1099*7c478bd9Sstevel@tonic-gate (void) fseek(fp, info_header->escapeseq_plc_tbl.place.itm_ptr, 1100*7c478bd9Sstevel@tonic-gate SEEK_SET); 1101*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('P', ("escapeseq_plc_tbl.place=%p:\n", 1102*7c478bd9Sstevel@tonic-gate info_header->escapeseq_plc_tbl.place.itm_ptr)); 1103*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_ESCAPESEQ]; 1104*7c478bd9Sstevel@tonic-gate ref; ref = ref->next) { 1105*7c478bd9Sstevel@tonic-gate (void) fwrite(&(ref->reloc), 1106*7c478bd9Sstevel@tonic-gate sizeof (itm_place_t), 1, fp); 1107*7c478bd9Sstevel@tonic-gate } 1108*7c478bd9Sstevel@tonic-gate 1109*7c478bd9Sstevel@tonic-gate (void) fseek(fp, info_header->data_plc_tbl.place.itm_ptr, 1110*7c478bd9Sstevel@tonic-gate SEEK_SET); 1111*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('P', ("data_plc_tbl.place=%p:\n", 1112*7c478bd9Sstevel@tonic-gate info_header->data_plc_tbl.place.itm_ptr)); 1113*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_DATA]; ref; ref = ref->next) { 1114*7c478bd9Sstevel@tonic-gate (void) fwrite(&(ref->reloc), 1115*7c478bd9Sstevel@tonic-gate sizeof (itm_place_t), 1, fp); 1116*7c478bd9Sstevel@tonic-gate } 1117*7c478bd9Sstevel@tonic-gate for (ref = ref_first[ITMC_OBJ_EXPR]; ref; ref = ref->next) { 1118*7c478bd9Sstevel@tonic-gate (void) fwrite(&(ref->reloc), 1119*7c478bd9Sstevel@tonic-gate sizeof (itm_place_t), 1, fp); 1120*7c478bd9Sstevel@tonic-gate } 1121*7c478bd9Sstevel@tonic-gate 1122*7c478bd9Sstevel@tonic-gate (void) fseek(fp, info_header->name_plc_tbl.place.itm_ptr, 1123*7c478bd9Sstevel@tonic-gate SEEK_SET); 1124*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('P', ("name_plc_tbl.place=%p:\n", 1125*7c478bd9Sstevel@tonic-gate info_header->name_plc_tbl.place.itm_ptr)); 1126*7c478bd9Sstevel@tonic-gate for (name = name_first, sec_size = 0; 1127*7c478bd9Sstevel@tonic-gate name; name = name->next) { 1128*7c478bd9Sstevel@tonic-gate itm_data_t data; 1129*7c478bd9Sstevel@tonic-gate if ((ITMC_OBJ_REGISTER == name->type) || 1130*7c478bd9Sstevel@tonic-gate (0 == name->name.size)) { 1131*7c478bd9Sstevel@tonic-gate continue; 1132*7c478bd9Sstevel@tonic-gate } 1133*7c478bd9Sstevel@tonic-gate data.size = name->name.size; 1134*7c478bd9Sstevel@tonic-gate #if !defined(_LP64) 1135*7c478bd9Sstevel@tonic-gate data.pad = 0; 1136*7c478bd9Sstevel@tonic-gate #endif 1137*7c478bd9Sstevel@tonic-gate if ((sizeof (itm_place_t)) < data.size) { 1138*7c478bd9Sstevel@tonic-gate #if !defined(_LP64) 1139*7c478bd9Sstevel@tonic-gate data.place.itm_pad = 0; 1140*7c478bd9Sstevel@tonic-gate #endif 1141*7c478bd9Sstevel@tonic-gate data.place.itm_ptr = name->reloc.itm_ptr; 1142*7c478bd9Sstevel@tonic-gate } else { 1143*7c478bd9Sstevel@tonic-gate data.place = name->name.place; 1144*7c478bd9Sstevel@tonic-gate } 1145*7c478bd9Sstevel@tonic-gate (void) fwrite(&data, sizeof (itm_data_t), 1, fp); 1146*7c478bd9Sstevel@tonic-gate } 1147*7c478bd9Sstevel@tonic-gate 1148*7c478bd9Sstevel@tonic-gate (void) fseek(fp, info_header->reg_plc_tbl.place.itm_ptr, 1149*7c478bd9Sstevel@tonic-gate SEEK_SET); 1150*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('P', ("reg_plc_tbl.place=%p:\n", 1151*7c478bd9Sstevel@tonic-gate info_header->reg_plc_tbl.place.itm_ptr)); 1152*7c478bd9Sstevel@tonic-gate 1153*7c478bd9Sstevel@tonic-gate for (name = name_first; 1154*7c478bd9Sstevel@tonic-gate name; name = name->next) { 1155*7c478bd9Sstevel@tonic-gate itm_data_t data; 1156*7c478bd9Sstevel@tonic-gate if ((ITMC_OBJ_REGISTER != name->type) || 1157*7c478bd9Sstevel@tonic-gate (0 == name->name.size)) { 1158*7c478bd9Sstevel@tonic-gate continue; 1159*7c478bd9Sstevel@tonic-gate } 1160*7c478bd9Sstevel@tonic-gate #if !defined(_LP64) 1161*7c478bd9Sstevel@tonic-gate data.pad = 0; 1162*7c478bd9Sstevel@tonic-gate #endif 1163*7c478bd9Sstevel@tonic-gate data.size = name->name.size; 1164*7c478bd9Sstevel@tonic-gate if ((sizeof (itm_place_t)) < data.size) { 1165*7c478bd9Sstevel@tonic-gate #if !defined(_LP64) 1166*7c478bd9Sstevel@tonic-gate data.place.itm_pad = 0; 1167*7c478bd9Sstevel@tonic-gate #endif 1168*7c478bd9Sstevel@tonic-gate data.place.itm_ptr = name->reloc.itm_ptr; 1169*7c478bd9Sstevel@tonic-gate } else { 1170*7c478bd9Sstevel@tonic-gate data.place = name->name.place; 1171*7c478bd9Sstevel@tonic-gate } 1172*7c478bd9Sstevel@tonic-gate (void) fwrite(&data, sizeof (itm_data_t), 1, fp); 1173*7c478bd9Sstevel@tonic-gate } 1174*7c478bd9Sstevel@tonic-gate 1175*7c478bd9Sstevel@tonic-gate /* Name section */ 1176*7c478bd9Sstevel@tonic-gate (void) fseek(fp, info_header->name_sec.place.itm_ptr, SEEK_SET); 1177*7c478bd9Sstevel@tonic-gate TRACE_MESSAGE('P', ("name_sec.place=%p:\n", 1178*7c478bd9Sstevel@tonic-gate info_header->name_sec.place.itm_ptr)); 1179*7c478bd9Sstevel@tonic-gate for (name = name_first, sec_size = 0; 1180*7c478bd9Sstevel@tonic-gate name; name = name->next) { 1181*7c478bd9Sstevel@tonic-gate if ((ITMC_OBJ_REGISTER == name->type) || 1182*7c478bd9Sstevel@tonic-gate (name->name.size <= (sizeof (itm_place_t)))) { 1183*7c478bd9Sstevel@tonic-gate continue; 1184*7c478bd9Sstevel@tonic-gate } 1185*7c478bd9Sstevel@tonic-gate (void) fwrite(NSPTR(&(name->name)), 1, 1186*7c478bd9Sstevel@tonic-gate name->name.size, fp); 1187*7c478bd9Sstevel@tonic-gate sec_size += name->name.size; 1188*7c478bd9Sstevel@tonic-gate } 1189*7c478bd9Sstevel@tonic-gate for (name = name_first; name; name = name->next) { 1190*7c478bd9Sstevel@tonic-gate if ((ITMC_OBJ_REGISTER != name->type) || 1191*7c478bd9Sstevel@tonic-gate (name->name.size <= (sizeof (itm_place_t)))) { 1192*7c478bd9Sstevel@tonic-gate continue; 1193*7c478bd9Sstevel@tonic-gate } 1194*7c478bd9Sstevel@tonic-gate (void) fwrite(NSPTR(&(name->name)), 1, 1195*7c478bd9Sstevel@tonic-gate name->name.size, fp); 1196*7c478bd9Sstevel@tonic-gate sec_size += name->name.size; 1197*7c478bd9Sstevel@tonic-gate } 1198*7c478bd9Sstevel@tonic-gate if (sec_size < info_header->name_sec.size) { 1199*7c478bd9Sstevel@tonic-gate (void) fwrite("\0\0\0\0", 1, 1200*7c478bd9Sstevel@tonic-gate info_header->name_sec.size - sec_size, fp); 1201*7c478bd9Sstevel@tonic-gate } 1202*7c478bd9Sstevel@tonic-gate } 1203*7c478bd9Sstevel@tonic-gate (void) fclose(fp); 1204*7c478bd9Sstevel@tonic-gate } 1205