Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(200)

Side by Side Diff: binutils/gold/resolve.cc

Issue 3018030: [binutils] Bump binutils to 2.20.1 (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/nacl-toolchain.git
Patch Set: Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « binutils/gold/powerpc.cc ('k') | binutils/gold/script-sections.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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.
OLDNEW
« no previous file with comments | « binutils/gold/powerpc.cc ('k') | binutils/gold/script-sections.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698