| OLD | NEW |
| 1 // resolve.cc -- symbol resolution for gold | 1 // resolve.cc -- symbol resolution for gold |
| 2 | 2 |
| 3 // Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc. | 3 // Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc. |
| 4 // Written by Ian Lance Taylor <iant@google.com>. | 4 // Written by Ian Lance Taylor <iant@google.com>. |
| 5 | 5 |
| 6 // This file is part of gold. | 6 // This file is part of gold. |
| 7 | 7 |
| 8 // This program is free software; you can redistribute it and/or modify | 8 // This program is free software; you can redistribute it and/or modify |
| 9 // it under the terms of the GNU General Public License as published by | 9 // it under the terms of the GNU General Public License as published by |
| 10 // the Free Software Foundation; either version 3 of the License, or | 10 // the Free Software Foundation; either version 3 of the License, or |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 return; | 295 return; |
| 296 } | 296 } |
| 297 } | 297 } |
| 298 | 298 |
| 299 unsigned int frombits = symbol_to_bits(sym.get_st_bind(), | 299 unsigned int frombits = symbol_to_bits(sym.get_st_bind(), |
| 300 object->is_dynamic(), | 300 object->is_dynamic(), |
| 301 st_shndx, is_ordinary, | 301 st_shndx, is_ordinary, |
| 302 sym.get_st_type()); | 302 sym.get_st_type()); |
| 303 | 303 |
| 304 bool adjust_common_sizes; | 304 bool adjust_common_sizes; |
| 305 typename Sized_symbol<size>::Size_type tosize = to->symsize(); |
| 305 if (Symbol_table::should_override(to, frombits, object, | 306 if (Symbol_table::should_override(to, frombits, object, |
| 306 &adjust_common_sizes)) | 307 &adjust_common_sizes)) |
| 307 { | 308 { |
| 308 typename Sized_symbol<size>::Size_type tosize = to->symsize(); | |
| 309 | |
| 310 this->override(to, sym, st_shndx, is_ordinary, object, version); | 309 this->override(to, sym, st_shndx, is_ordinary, object, version); |
| 311 | |
| 312 if (adjust_common_sizes && tosize > to->symsize()) | 310 if (adjust_common_sizes && tosize > to->symsize()) |
| 313 to->set_symsize(tosize); | 311 to->set_symsize(tosize); |
| 314 } | 312 } |
| 315 else | 313 else |
| 316 { | 314 { |
| 317 if (adjust_common_sizes && sym.get_st_size() > to->symsize()) | 315 if (adjust_common_sizes && sym.get_st_size() > tosize) |
| 318 to->set_symsize(sym.get_st_size()); | 316 to->set_symsize(sym.get_st_size()); |
| 319 // The ELF ABI says that even for a reference to a symbol we | 317 // The ELF ABI says that even for a reference to a symbol we |
| 320 // merge the visibility. | 318 // merge the visibility. |
| 321 to->override_visibility(sym.get_st_visibility()); | 319 to->override_visibility(sym.get_st_visibility()); |
| 322 } | 320 } |
| 323 | 321 |
| 322 if (adjust_common_sizes && parameters->options().warn_common()) |
| 323 { |
| 324 if (tosize > sym.get_st_size()) |
| 325 Symbol_table::report_resolve_problem(false, |
| 326 _("common of '%s' overriding " |
| 327 "smaller common"), |
| 328 to, object); |
| 329 else if (tosize < sym.get_st_size()) |
| 330 Symbol_table::report_resolve_problem(false, |
| 331 _("common of '%s' overidden by " |
| 332 "larger common"), |
| 333 to, object); |
| 334 else |
| 335 Symbol_table::report_resolve_problem(false, |
| 336 _("multiple common of '%s'"), |
| 337 to, object); |
| 338 } |
| 339 |
| 324 // A new weak undefined reference, merging with an old weak | 340 // A new weak undefined reference, merging with an old weak |
| 325 // reference, could be a One Definition Rule (ODR) violation -- | 341 // reference, could be a One Definition Rule (ODR) violation -- |
| 326 // especially if the types or sizes of the references differ. We'll | 342 // especially if the types or sizes of the references differ. We'll |
| 327 // store such pairs and look them up later to make sure they | 343 // store such pairs and look them up later to make sure they |
| 328 // actually refer to the same lines of code. (Note: not all ODR | 344 // actually refer to the same lines of code. (Note: not all ODR |
| 329 // violations can be found this way, and not everything this finds | 345 // violations can be found this way, and not everything this finds |
| 330 // is an ODR violation. But it's helpful to warn about.) | 346 // is an ODR violation. But it's helpful to warn about.) |
| 331 bool to_is_ordinary; | 347 bool to_is_ordinary; |
| 332 if (parameters->options().detect_odr_violations() | 348 if (parameters->options().detect_odr_violations() |
| 333 && sym.get_st_bind() == elfcpp::STB_WEAK | 349 && sym.get_st_bind() == elfcpp::STB_WEAK |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 415 case DEF * 16 + DEF: | 431 case DEF * 16 + DEF: |
| 416 // Two definitions of the same symbol. | 432 // Two definitions of the same symbol. |
| 417 | 433 |
| 418 // If either symbol is defined by an object included using | 434 // If either symbol is defined by an object included using |
| 419 // --just-symbols, then don't warn. This is for compatibility | 435 // --just-symbols, then don't warn. This is for compatibility |
| 420 // with the GNU linker. FIXME: This is a hack. | 436 // with the GNU linker. FIXME: This is a hack. |
| 421 if ((to->source() == Symbol::FROM_OBJECT && to->object()->just_symbols()) | 437 if ((to->source() == Symbol::FROM_OBJECT && to->object()->just_symbols()) |
| 422 || object->just_symbols()) | 438 || object->just_symbols()) |
| 423 return false; | 439 return false; |
| 424 | 440 |
| 425 // FIXME: Do a better job of reporting locations. | 441 Symbol_table::report_resolve_problem(true, |
| 426 gold_error(_("%s: multiple definition of %s"), | 442 » » » » » _("multiple definition of '%s'"), |
| 427 » » object != NULL ? object->name().c_str() : _("command line"), | 443 » » » » » to, object); |
| 428 » » to->demangled_name().c_str()); | |
| 429 gold_error(_("%s: previous definition here"), | |
| 430 » » (to->source() == Symbol::FROM_OBJECT | |
| 431 » » ? to->object()->name().c_str() | |
| 432 » » : _("command line"))); | |
| 433 return false; | 444 return false; |
| 434 | 445 |
| 435 case WEAK_DEF * 16 + DEF: | 446 case WEAK_DEF * 16 + DEF: |
| 436 // We've seen a weak definition, and now we see a strong | 447 // We've seen a weak definition, and now we see a strong |
| 437 // definition. In the original SVR4 linker, this was treated as | 448 // definition. In the original SVR4 linker, this was treated as |
| 438 // a multiple definition error. In the Solaris linker and the | 449 // a multiple definition error. In the Solaris linker and the |
| 439 // GNU linker, a weak definition followed by a regular | 450 // GNU linker, a weak definition followed by a regular |
| 440 // definition causes the weak definition to be overridden. We | 451 // definition causes the weak definition to be overridden. We |
| 441 // are currently compatible with the GNU linker. In the future | 452 // are currently compatible with the GNU linker. In the future |
| 442 // we should add a target specific option to change this. | 453 // we should add a target specific option to change this. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 457 case DYN_WEAK_UNDEF * 16 + DEF: | 468 case DYN_WEAK_UNDEF * 16 + DEF: |
| 458 // We've seen an undefined reference, and now we see a | 469 // We've seen an undefined reference, and now we see a |
| 459 // definition. We use the definition. | 470 // definition. We use the definition. |
| 460 return true; | 471 return true; |
| 461 | 472 |
| 462 case COMMON * 16 + DEF: | 473 case COMMON * 16 + DEF: |
| 463 case WEAK_COMMON * 16 + DEF: | 474 case WEAK_COMMON * 16 + DEF: |
| 464 case DYN_COMMON * 16 + DEF: | 475 case DYN_COMMON * 16 + DEF: |
| 465 case DYN_WEAK_COMMON * 16 + DEF: | 476 case DYN_WEAK_COMMON * 16 + DEF: |
| 466 // We've seen a common symbol and now we see a definition. The | 477 // We've seen a common symbol and now we see a definition. The |
| 467 // definition overrides. FIXME: We should optionally issue, version a | 478 // definition overrides. |
| 468 // warning. | 479 if (parameters->options().warn_common()) |
| 480 » Symbol_table::report_resolve_problem(false, |
| 481 » » » » » _("definition of '%s' overriding " |
| 482 » » » » » "common"), |
| 483 » » » » » to, object); |
| 469 return true; | 484 return true; |
| 470 | 485 |
| 471 case DEF * 16 + WEAK_DEF: | 486 case DEF * 16 + WEAK_DEF: |
| 472 case WEAK_DEF * 16 + WEAK_DEF: | 487 case WEAK_DEF * 16 + WEAK_DEF: |
| 473 // We've seen a definition and now we see a weak definition. We | 488 // We've seen a definition and now we see a weak definition. We |
| 474 // ignore the new weak definition. | 489 // ignore the new weak definition. |
| 475 return false; | 490 return false; |
| 476 | 491 |
| 477 case DYN_DEF * 16 + WEAK_DEF: | 492 case DYN_DEF * 16 + WEAK_DEF: |
| 478 case DYN_WEAK_DEF * 16 + WEAK_DEF: | 493 case DYN_WEAK_DEF * 16 + WEAK_DEF: |
| 479 // We've seen a dynamic definition and now we see a regular weak | 494 // We've seen a dynamic definition and now we see a regular weak |
| 480 // definition. The regular weak definition overrides. | 495 // definition. The regular weak definition overrides. |
| 481 return true; | 496 return true; |
| 482 | 497 |
| 483 case UNDEF * 16 + WEAK_DEF: | 498 case UNDEF * 16 + WEAK_DEF: |
| 484 case WEAK_UNDEF * 16 + WEAK_DEF: | 499 case WEAK_UNDEF * 16 + WEAK_DEF: |
| 485 case DYN_UNDEF * 16 + WEAK_DEF: | 500 case DYN_UNDEF * 16 + WEAK_DEF: |
| 486 case DYN_WEAK_UNDEF * 16 + WEAK_DEF: | 501 case DYN_WEAK_UNDEF * 16 + WEAK_DEF: |
| 487 // A weak definition of a currently undefined symbol. | 502 // A weak definition of a currently undefined symbol. |
| 488 return true; | 503 return true; |
| 489 | 504 |
| 490 case COMMON * 16 + WEAK_DEF: | 505 case COMMON * 16 + WEAK_DEF: |
| 491 case WEAK_COMMON * 16 + WEAK_DEF: | 506 case WEAK_COMMON * 16 + WEAK_DEF: |
| 492 // A weak definition does not override a common definition. | 507 // A weak definition does not override a common definition. |
| 493 return false; | 508 return false; |
| 494 | 509 |
| 495 case DYN_COMMON * 16 + WEAK_DEF: | 510 case DYN_COMMON * 16 + WEAK_DEF: |
| 496 case DYN_WEAK_COMMON * 16 + WEAK_DEF: | 511 case DYN_WEAK_COMMON * 16 + WEAK_DEF: |
| 497 // A weak definition does override a definition in a dynamic | 512 // A weak definition does override a definition in a dynamic |
| 498 // object. FIXME: We should optionally issue a warning. | 513 // object. |
| 514 if (parameters->options().warn_common()) |
| 515 » Symbol_table::report_resolve_problem(false, |
| 516 » » » » » _("definition of '%s' overriding " |
| 517 » » » » » "dynamic common definition"), |
| 518 » » » » » to, object); |
| 499 return true; | 519 return true; |
| 500 | 520 |
| 501 case DEF * 16 + DYN_DEF: | 521 case DEF * 16 + DYN_DEF: |
| 502 case WEAK_DEF * 16 + DYN_DEF: | 522 case WEAK_DEF * 16 + DYN_DEF: |
| 503 case DYN_DEF * 16 + DYN_DEF: | 523 case DYN_DEF * 16 + DYN_DEF: |
| 504 case DYN_WEAK_DEF * 16 + DYN_DEF: | 524 case DYN_WEAK_DEF * 16 + DYN_DEF: |
| 505 // Ignore a dynamic definition if we already have a definition. | 525 // Ignore a dynamic definition if we already have a definition. |
| 506 return false; | 526 return false; |
| 507 | 527 |
| 508 case UNDEF * 16 + DYN_DEF: | 528 case UNDEF * 16 + DYN_DEF: |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 604 case DYN_WEAK_UNDEF * 16 + DYN_WEAK_UNDEF: | 624 case DYN_WEAK_UNDEF * 16 + DYN_WEAK_UNDEF: |
| 605 case COMMON * 16 + DYN_WEAK_UNDEF: | 625 case COMMON * 16 + DYN_WEAK_UNDEF: |
| 606 case WEAK_COMMON * 16 + DYN_WEAK_UNDEF: | 626 case WEAK_COMMON * 16 + DYN_WEAK_UNDEF: |
| 607 case DYN_COMMON * 16 + DYN_WEAK_UNDEF: | 627 case DYN_COMMON * 16 + DYN_WEAK_UNDEF: |
| 608 case DYN_WEAK_COMMON * 16 + DYN_WEAK_UNDEF: | 628 case DYN_WEAK_COMMON * 16 + DYN_WEAK_UNDEF: |
| 609 // A new weak dynamic undefined reference tells us nothing. | 629 // A new weak dynamic undefined reference tells us nothing. |
| 610 return false; | 630 return false; |
| 611 | 631 |
| 612 case DEF * 16 + COMMON: | 632 case DEF * 16 + COMMON: |
| 613 // A common symbol does not override a definition. | 633 // A common symbol does not override a definition. |
| 634 if (parameters->options().warn_common()) |
| 635 Symbol_table::report_resolve_problem(false, |
| 636 _("common '%s' overridden by " |
| 637 "previous definition"), |
| 638 to, object); |
| 614 return false; | 639 return false; |
| 615 | 640 |
| 616 case WEAK_DEF * 16 + COMMON: | 641 case WEAK_DEF * 16 + COMMON: |
| 617 case DYN_DEF * 16 + COMMON: | 642 case DYN_DEF * 16 + COMMON: |
| 618 case DYN_WEAK_DEF * 16 + COMMON: | 643 case DYN_WEAK_DEF * 16 + COMMON: |
| 619 // A common symbol does override a weak definition or a dynamic | 644 // A common symbol does override a weak definition or a dynamic |
| 620 // definition. | 645 // definition. |
| 621 return true; | 646 return true; |
| 622 | 647 |
| 623 case UNDEF * 16 + COMMON: | 648 case UNDEF * 16 + COMMON: |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 709 case DYN_WEAK_COMMON * 16 + DYN_WEAK_COMMON: | 734 case DYN_WEAK_COMMON * 16 + DYN_WEAK_COMMON: |
| 710 // Set the size to the maximum. | 735 // Set the size to the maximum. |
| 711 *adjust_common_sizes = true; | 736 *adjust_common_sizes = true; |
| 712 return false; | 737 return false; |
| 713 | 738 |
| 714 default: | 739 default: |
| 715 gold_unreachable(); | 740 gold_unreachable(); |
| 716 } | 741 } |
| 717 } | 742 } |
| 718 | 743 |
| 744 // Issue an error or warning due to symbol resolution. IS_ERROR |
| 745 // indicates an error rather than a warning. MSG is the error |
| 746 // message; it is expected to have a %s for the symbol name. TO is |
| 747 // the existing symbol. OBJECT is where the new symbol was found. |
| 748 |
| 749 // FIXME: We should have better location information here. When the |
| 750 // symbol is defined, we should be able to pull the location from the |
| 751 // debug info if there is any. |
| 752 |
| 753 void |
| 754 Symbol_table::report_resolve_problem(bool is_error, const char* msg, |
| 755 const Symbol* to, Object* object) |
| 756 { |
| 757 std::string demangled(to->demangled_name()); |
| 758 size_t len = strlen(msg) + demangled.length() + 10; |
| 759 char* buf = new char[len]; |
| 760 snprintf(buf, len, msg, demangled.c_str()); |
| 761 |
| 762 const char* objname; |
| 763 if (object != NULL) |
| 764 objname = object->name().c_str(); |
| 765 else |
| 766 objname = _("command line"); |
| 767 |
| 768 if (is_error) |
| 769 gold_error("%s: %s", objname, buf); |
| 770 else |
| 771 gold_warning("%s: %s", objname, buf); |
| 772 |
| 773 delete[] buf; |
| 774 |
| 775 if (to->source() == Symbol::FROM_OBJECT) |
| 776 objname = to->object()->name().c_str(); |
| 777 else |
| 778 objname = _("command line"); |
| 779 gold_info("%s: %s: previous definition here", program_name, objname); |
| 780 } |
| 781 |
| 719 // A special case of should_override which is only called for a strong | 782 // A special case of should_override which is only called for a strong |
| 720 // defined symbol from a regular object file. This is used when | 783 // defined symbol from a regular object file. This is used when |
| 721 // defining special symbols. | 784 // defining special symbols. |
| 722 | 785 |
| 723 bool | 786 bool |
| 724 Symbol_table::should_override_with_special(const Symbol* to) | 787 Symbol_table::should_override_with_special(const Symbol* to) |
| 725 { | 788 { |
| 726 bool adjust_common_sizes; | 789 bool adjust_common_sizes; |
| 727 unsigned int frombits = global_flag | regular_flag | def_flag; | 790 unsigned int frombits = global_flag | regular_flag | def_flag; |
| 728 bool ret = Symbol_table::should_override(to, frombits, NULL, | 791 bool ret = Symbol_table::should_override(to, frombits, NULL, |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 889 #endif | 952 #endif |
| 890 | 953 |
| 891 #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG) | 954 #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG) |
| 892 template | 955 template |
| 893 void | 956 void |
| 894 Symbol_table::override_with_special<64>(Sized_symbol<64>*, | 957 Symbol_table::override_with_special<64>(Sized_symbol<64>*, |
| 895 const Sized_symbol<64>*); | 958 const Sized_symbol<64>*); |
| 896 #endif | 959 #endif |
| 897 | 960 |
| 898 } // End namespace gold. | 961 } // End namespace gold. |
| OLD | NEW |