1 /* 2 * CDDL HEADER START 3 * 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. 7 * 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. 12 * 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] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright (c) 1988 AT&T 24 * All Rights Reserved 25 * 26 * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved. 27 */ 28 29 /* 30 * Processing of relocatable objects and shared objects. 31 */ 32 33 /* 34 * ld -- link/editor main program 35 */ 36 #include <sys/types.h> 37 #include <sys/time.h> 38 #include <sys/mman.h> 39 #include <string.h> 40 #include <stdio.h> 41 #include <locale.h> 42 #include <stdarg.h> 43 #include <debug.h> 44 #include "msg.h" 45 #include "_libld.h" 46 47 /* 48 * All target specific code is referenced via this global variable, which 49 * is initialized in ld_main(). This allows the linker to function as 50 * a cross linker, by vectoring to the target-specific code for the 51 * current target machine. 52 */ 53 Target ld_targ; 54 55 /* 56 * A default library search path is used if one was not supplied on the command 57 * line. Note: these strings can not use MSG_ORIG() since they are modified as 58 * part of the path processing. 59 */ 60 #if defined(_ELF64) 61 static char def_Plibpath[] = "/lib/64:/usr/lib/64"; 62 #else 63 static char def_Plibpath[] = "/usr/ccs/lib:/lib:/usr/lib"; 64 #endif 65 66 /* 67 * A default elf header provides for simplifying diagnostic processing. 68 */ 69 static Ehdr def_ehdr = { { ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3, 70 ELFCLASSNONE, ELFDATANONE }, 0, EM_NONE, 71 EV_CURRENT }; 72 73 /* 74 * ld-centric wrapper on top of veprintf(): 75 * - Accepts output descriptor rather than linkmap list 76 * - Sets the FLG_OF_FATAL/FLG_OF_WARN flags as necessary 77 */ 78 void 79 ld_eprintf(Ofl_desc *ofl, Error error, const char *format, ...) 80 { 81 va_list args; 82 83 /* Set flag indicating type of error being issued */ 84 switch (error) { 85 case ERR_NONE: 86 case ERR_WARNING_NF: 87 break; 88 case ERR_WARNING: 89 ofl->ofl_flags |= FLG_OF_WARN; 90 break; 91 case ERR_GUIDANCE: 92 if ((ofl->ofl_guideflags & FLG_OFG_ENABLE) == 0) 93 return; 94 ofl->ofl_guideflags |= FLG_OFG_ISSUED; 95 ofl->ofl_flags |= FLG_OF_WARN; 96 break; 97 default: 98 ofl->ofl_flags |= FLG_OF_FATAL; 99 } 100 101 /* Issue the error */ 102 va_start(args, format); 103 veprintf(ofl->ofl_lml, error, format, args); 104 va_end(args); 105 } 106 107 /* 108 * Establish the global state necessary to link the desired machine 109 * target, as reflected by the ld_targ global variable. 110 */ 111 int 112 ld_init_target(Lm_list *lml, Half mach) 113 { 114 switch (mach) { 115 case EM_386: 116 case EM_AMD64: 117 ld_targ = *ld_targ_init_x86(); 118 break; 119 120 case EM_SPARC: 121 case EM_SPARC32PLUS: 122 case EM_SPARCV9: 123 ld_targ = *ld_targ_init_sparc(); 124 break; 125 126 default: 127 { 128 Conv_inv_buf_t inv_buf; 129 130 eprintf(lml, ERR_FATAL, MSG_INTL(MSG_TARG_UNSUPPORTED), 131 conv_ehdr_mach(mach, 0, &inv_buf)); 132 return (1); 133 } 134 } 135 136 return (0); 137 } 138 139 140 /* 141 * The main program 142 */ 143 int 144 ld_main(int argc, char **argv, Half mach) 145 { 146 char *sgs_support; /* SGS_SUPPORT environment string */ 147 Half etype; 148 Ofl_desc *ofl; 149 ofl_flag_t save_flg_of_warn; 150 151 /* 152 * Establish a base time. Total time diagnostics are relative to 153 * entering the link-editor here. 154 */ 155 (void) gettimeofday(&DBG_TOTALTIME, NULL); 156 DBG_DELTATIME = DBG_TOTALTIME; 157 158 /* Output file descriptor */ 159 if ((ofl = libld_calloc(1, sizeof (Ofl_desc))) == 0) 160 return (1); 161 162 /* Initialize target state */ 163 if (ld_init_target(NULL, mach) != 0) 164 return (1); 165 166 /* 167 * Set up the default output ELF header to satisfy diagnostic 168 * requirements, and initialize the machine and class details. 169 */ 170 ofl->ofl_dehdr = &def_ehdr; 171 def_ehdr.e_ident[EI_CLASS] = ld_targ.t_m.m_class; 172 def_ehdr.e_ident[EI_DATA] = ld_targ.t_m.m_data; 173 def_ehdr.e_machine = ld_targ.t_m.m_mach; 174 175 /* 176 * Build up linker version string 177 */ 178 if ((ofl->ofl_sgsid = (char *)libld_calloc(MSG_SGS_ID_SIZE + 179 strlen(link_ver_string) + 1, 1)) == NULL) 180 return (1); 181 (void) strcpy(ofl->ofl_sgsid, MSG_ORIG(MSG_SGS_ID)); 182 (void) strcat(ofl->ofl_sgsid, link_ver_string); 183 184 /* 185 * Argument pass one. Get all the input flags (skip any files) and 186 * check for consistency. Return from ld_process_flags() marks the 187 * end of mapfile processing. The entrance criteria and segment 188 * descriptors are complete and in their final form. 189 */ 190 if (ld_process_flags(ofl, argc, argv) == S_ERROR) { 191 /* If any ERR_GUIDANCE messages were issued, add a summary */ 192 if (ofl->ofl_guideflags & FLG_OFG_ISSUED) 193 ld_eprintf(ofl, ERR_GUIDANCE, 194 MSG_INTL(MSG_GUIDE_SUMMARY)); 195 return (1); 196 } 197 if (ofl->ofl_flags & FLG_OF_FATAL) { 198 ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_ARG_FLAGS)); 199 /* If any ERR_GUIDANCE messages were issued, add a summary */ 200 if (ofl->ofl_guideflags & FLG_OFG_ISSUED) 201 ld_eprintf(ofl, ERR_GUIDANCE, 202 MSG_INTL(MSG_GUIDE_SUMMARY)); 203 return (1); 204 } 205 206 /* 207 * At this point a call such as ld -V is considered complete. 208 */ 209 if (ofl->ofl_flags1 & FLG_OF1_DONE) 210 return (0); 211 212 /* Initialize signal handler */ 213 ld_init_sighandler(ofl); 214 215 /* 216 * Determine whether any support libraries should be loaded, 217 * (either through the SGS_SUPPORT environment variable and/or 218 * through the -S option). 219 */ 220 #if defined(_LP64) 221 if ((sgs_support = getenv(MSG_ORIG(MSG_SGS_SUPPORT_64))) == NULL) 222 #else 223 if ((sgs_support = getenv(MSG_ORIG(MSG_SGS_SUPPORT_32))) == NULL) 224 #endif 225 sgs_support = getenv(MSG_ORIG(MSG_SGS_SUPPORT)); 226 227 if (sgs_support && sgs_support[0]) { 228 const char *sep = MSG_ORIG(MSG_STR_COLON); 229 char *lib; 230 char *lasts; 231 232 DBG_CALL(Dbg_support_req(ofl->ofl_lml, sgs_support, 233 DBG_SUP_ENVIRON)); 234 if ((lib = strtok_r(sgs_support, sep, &lasts)) != NULL) { 235 do { 236 if (ld_sup_loadso(ofl, lib) == S_ERROR) 237 return (ld_exit(ofl)); 238 DBG_CALL(Dbg_util_nl(ofl->ofl_lml, DBG_NL_STD)); 239 240 } while ((lib = strtok_r(NULL, sep, &lasts)) != NULL); 241 } 242 } 243 if (lib_support) { 244 Aliste idx; 245 char *lib; 246 247 for (APLIST_TRAVERSE(lib_support, idx, lib)) { 248 DBG_CALL(Dbg_support_req(ofl->ofl_lml, lib, 249 DBG_SUP_CMDLINE)); 250 if (ld_sup_loadso(ofl, lib) == S_ERROR) 251 return (ld_exit(ofl)); 252 DBG_CALL(Dbg_util_nl(ofl->ofl_lml, DBG_NL_STD)); 253 } 254 } 255 256 DBG_CALL(Dbg_ent_print(ofl->ofl_lml, 257 ofl->ofl_dehdr->e_ident[EI_OSABI], ofl->ofl_dehdr->e_machine, 258 ofl->ofl_ents)); 259 DBG_CALL(Dbg_seg_list(ofl->ofl_lml, 260 ofl->ofl_dehdr->e_ident[EI_OSABI], ofl->ofl_dehdr->e_machine, 261 ofl->ofl_segs)); 262 263 /* 264 * The objscnt and soscnt variables were used to estimate the expected 265 * input files, and size the symbol hash buckets accordingly. Reset 266 * these values now, so as to gain an accurate count from pass two, for 267 * later statistics diagnostics. 268 */ 269 ofl->ofl_objscnt = ofl->ofl_soscnt = 0; 270 271 /* 272 * Determine whether we can create the file before going any further. 273 */ 274 if (ld_open_outfile(ofl) == S_ERROR) 275 return (ld_exit(ofl)); 276 277 /* 278 * If the user didn't supply a library path supply a default. And, if 279 * no run-path has been specified (-R), see if the environment variable 280 * is in use (historic). 281 */ 282 if (Plibpath == NULL) 283 Plibpath = def_Plibpath; 284 285 if (ofl->ofl_rpath == NULL) { 286 char *rpath; 287 288 if (((rpath = getenv(MSG_ORIG(MSG_LD_RUN_PATH))) != NULL) && 289 rpath[0]) 290 ofl->ofl_rpath = rpath; 291 } 292 293 /* 294 * Argument pass two. Input all libraries and objects. 295 */ 296 if (ld_lib_setup(ofl) == S_ERROR) 297 return (ld_exit(ofl)); 298 299 /* 300 * Call ld_start() with the etype of our output file and the 301 * output file name. 302 */ 303 if (ofl->ofl_flags & FLG_OF_SHAROBJ) 304 etype = ET_DYN; 305 else if (ofl->ofl_flags & FLG_OF_RELOBJ) 306 etype = ET_REL; 307 else 308 etype = ET_EXEC; 309 310 ld_sup_start(ofl, etype, argv[0]); 311 312 /* 313 * Process all input files. 314 */ 315 if (ld_process_files(ofl, argc, argv) == S_ERROR) 316 return (ld_exit(ofl)); 317 if (ofl->ofl_flags & FLG_OF_FATAL) { 318 ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_ARG_FILES), 319 ofl->ofl_name); 320 return (ld_exit(ofl)); 321 } 322 323 ld_sup_input_done(ofl); 324 325 /* 326 * Now that all input section processing is complete, validate and 327 * process any SHT_SUNW_move sections. 328 */ 329 if (ofl->ofl_ismove && (ld_process_move(ofl) == S_ERROR)) 330 return (ld_exit(ofl)); 331 332 /* 333 * Before validating all symbols count the number of relocation entries. 334 * If copy relocations exist, COMMON symbols must be generated which are 335 * assigned to the executables .bss. During sym_validate() the actual 336 * size and alignment of the .bss is calculated. Doing things in this 337 * order reduces the number of symbol table traversals required (however 338 * it does take a little longer for the user to be told of any undefined 339 * symbol errors). 340 */ 341 if (ld_reloc_init(ofl) == S_ERROR) 342 return (ld_exit(ofl)); 343 344 /* 345 * We need to know if FLG_OF_WARN is currently set, in case 346 * we need to honor a -z fatal-warnings request. However, we also 347 * need to know if a warning due to symbol validation results from 348 * the upcoming call to ld_sym_validate() in order to issue the 349 * appropriate message for it. So we save the current value, 350 * and clear the main flag. 351 */ 352 save_flg_of_warn = ofl->ofl_flags & FLG_OF_WARN; 353 ofl->ofl_flags &= ~FLG_OF_WARN; 354 355 if (ld_sym_validate(ofl) == S_ERROR) 356 return (ld_exit(ofl)); 357 358 /* 359 * Now that all symbol processing is complete see if any undefined 360 * references still remain. If we observed undefined symbols the 361 * FLG_OF_FATAL bit will be set: If creating a static executable, or a 362 * dynamic executable or shared object with the -zdefs flag set, this 363 * condition is fatal. If creating a shared object with the -Bsymbolic 364 * flag set, this condition is simply a warning. 365 */ 366 if (ofl->ofl_flags & FLG_OF_FATAL) 367 ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_ARG_SYM_FATAL), 368 ofl->ofl_name); 369 else if (ofl->ofl_flags & FLG_OF_WARN) 370 ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_ARG_SYM_WARN)); 371 372 /* 373 * Guidance: Use -z defs|nodefs when building shared objects. 374 * 375 * ld_sym_validate() will mask this guidance message out unless we are 376 * intended to send it here, so all we need to do is use OFL_GUIDANCE() 377 * to decide whether to issue it or not. 378 */ 379 if (OFL_GUIDANCE(ofl, FLG_OFG_NO_DEFS)) 380 ld_eprintf(ofl, ERR_GUIDANCE, MSG_INTL(MSG_GUIDE_DEFS)); 381 382 /* 383 * Symbol processing was the final step before we start producing the 384 * output object. At this time, if we've seen warnings and the 385 * -z fatal-warnings option is specified, promote them to fatal, which 386 * will cause us to exit without creating an object. 387 * 388 * We didn't do this as the warnings were reported in order to 389 * maximize the number of problems a given link-editor invocation 390 * can diagnose. This is safe, since warnings are by definition events 391 * one can choose to ignore. 392 */ 393 if (((ofl->ofl_flags | save_flg_of_warn) & 394 (FLG_OF_WARN | FLG_OF_FATWARN)) == 395 (FLG_OF_WARN | FLG_OF_FATWARN)) 396 ofl->ofl_flags |= FLG_OF_FATAL; 397 398 /* 399 * If fatal errors occurred in symbol processing, or due to warnings 400 * promoted by -z fatal-warnings, this is the end of the line. 401 */ 402 if (ofl->ofl_flags & FLG_OF_FATAL) 403 return (ld_exit(ofl)); 404 405 /* 406 * Generate any necessary sections. 407 */ 408 if (ld_make_sections(ofl) == S_ERROR) 409 return (ld_exit(ofl)); 410 411 /* 412 * Now that all sections have been added to the output file, determine 413 * whether any mapfile section ordering was specified, and verify that 414 * all mapfile ordering directives have been matched. Issue a warning 415 * for any directives that have not been matched. 416 * Also, if SHF_ORDERED sections exist, set up sort key values. 417 */ 418 if (ofl->ofl_flags & (FLG_OF_OS_ORDER | FLG_OF_KEY)) 419 ld_sec_validate(ofl); 420 421 /* 422 * Having collected all the input data create the initial output file 423 * image, assign virtual addresses to the image, and generate a load 424 * map if the user requested one. 425 */ 426 if (ld_create_outfile(ofl) == S_ERROR) 427 return (ld_exit(ofl)); 428 429 if (ld_update_outfile(ofl) == S_ERROR) 430 return (ld_exit(ofl)); 431 if (ofl->ofl_flags & FLG_OF_GENMAP) 432 ld_map_out(ofl); 433 434 /* 435 * Build relocation sections and perform any relocation updates. 436 */ 437 if (ld_reloc_process(ofl) == S_ERROR) 438 return (ld_exit(ofl)); 439 440 /* 441 * Fill in contents for unwind header (.eh_frame_hdr) 442 */ 443 if (ld_unwind_populate_hdr(ofl) == S_ERROR) 444 return (ld_exit(ofl)); 445 446 /* 447 * Finally create the files elf checksum. 448 */ 449 if (ofl->ofl_checksum) 450 *ofl->ofl_checksum = (Xword)elf_checksum(ofl->ofl_elf); 451 452 /* 453 * If this is a cross link to a target with a different byte 454 * order than the linker, swap the data to the target byte order. 455 */ 456 if (((ofl->ofl_flags1 & FLG_OF1_ENCDIFF) != 0) && 457 (_elf_swap_wrimage(ofl->ofl_elf) != 0)) { 458 ld_eprintf(ofl, ERR_ELF, MSG_INTL(MSG_ELF_SWAP_WRIMAGE), 459 ofl->ofl_name); 460 return (ld_exit(ofl)); 461 } 462 463 /* 464 * We're done, so make sure the updates are flushed to the output file. 465 */ 466 if ((ofl->ofl_size = elf_update(ofl->ofl_welf, ELF_C_WRITE)) == 0) { 467 ld_eprintf(ofl, ERR_ELF, MSG_INTL(MSG_ELF_UPDATE), 468 ofl->ofl_name); 469 return (ld_exit(ofl)); 470 } 471 472 ld_sup_atexit(ofl, 0); 473 474 DBG_CALL(Dbg_statistics_ld(ofl)); 475 DBG_CALL(Dbg_basic_finish(ofl->ofl_lml)); 476 477 /* 478 * Wrap up debug output file if one is open 479 */ 480 dbg_cleanup(); 481 482 /* If any ERR_GUIDANCE messages were issued, add a summary */ 483 if (ofl->ofl_guideflags & FLG_OFG_ISSUED) 484 ld_eprintf(ofl, ERR_GUIDANCE, MSG_INTL(MSG_GUIDE_SUMMARY)); 485 486 /* 487 * For performance reasons we don't actually free up the memory we've 488 * allocated, it will be freed when we exit. 489 * 490 * But the below line can be uncommented if/when we want to measure how 491 * our memory consumption and freeing are doing. We should be able to 492 * free all the memory that has been allocated as part of the link-edit 493 * process. 494 */ 495 /* ld_ofl_cleanup(ofl); */ 496 return (0); 497 } 498 499 /* 500 * Cleanup an Ifl_desc. 501 */ 502 static void 503 ifl_list_cleanup(APlist *apl) 504 { 505 Aliste idx; 506 Ifl_desc *ifl; 507 508 for (APLIST_TRAVERSE(apl, idx, ifl)) { 509 if (ifl->ifl_elf) 510 (void) elf_end(ifl->ifl_elf); 511 } 512 } 513 514 /* 515 * Cleanup all memory that has been dynamically allocated during libld 516 * processing and elf_end() all Elf descriptors that are still open. 517 */ 518 void 519 ld_ofl_cleanup(Ofl_desc *ofl) 520 { 521 Ld_heap *chp, *php; 522 Ar_desc *adp; 523 Aliste idx; 524 525 ifl_list_cleanup(ofl->ofl_objs); 526 ofl->ofl_objs = NULL; 527 ifl_list_cleanup(ofl->ofl_sos); 528 ofl->ofl_sos = NULL; 529 530 for (APLIST_TRAVERSE(ofl->ofl_ars, idx, adp)) { 531 Ar_aux *aup; 532 Elf_Arsym *arsym; 533 534 for (arsym = adp->ad_start, aup = adp->ad_aux; 535 arsym->as_name; ++arsym, ++aup) { 536 if ((aup->au_mem) && (aup->au_mem != FLG_ARMEM_PROC)) { 537 (void) elf_end(aup->au_mem->am_elf); 538 539 /* 540 * Null out all entries to this member so 541 * that we don't attempt to elf_end() it again. 542 */ 543 ld_ar_member(adp, arsym, aup, 0); 544 } 545 } 546 (void) elf_end(adp->ad_elf); 547 } 548 ofl->ofl_ars = NULL; 549 550 (void) elf_end(ofl->ofl_elf); 551 (void) elf_end(ofl->ofl_welf); 552 553 for (chp = ld_heap, php = NULL; chp; php = chp, chp = chp->lh_next) { 554 if (php) 555 (void) munmap((void *)php, 556 (size_t)php->lh_end - (size_t)php); 557 } 558 if (php) 559 (void) munmap((void *)php, (size_t)php->lh_end - (size_t)php); 560 561 ld_heap = NULL; 562 } 563