// target-reloc.h -- target specific relocation support -*- C++ -*-
-// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
Symbol_table* symtab,
Layout* layout,
Target_type* target,
- Sized_relobj<size, big_endian>* object,
+ Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
const unsigned char* prelocs,
size_t reloc_count,
v, sym->name());
}
+// Return true if we are should issue an error saying that SYM is an
+// undefined symbol. This is called if there is a relocation against
+// SYM.
+
+inline bool
+issue_undefined_symbol_error(const Symbol* sym)
+{
+ // We only report global symbols.
+ if (sym == NULL)
+ return false;
+
+ // We only report undefined symbols.
+ if (!sym->is_undefined() && !sym->is_placeholder())
+ return false;
+
+ // We don't report weak symbols.
+ if (sym->binding() == elfcpp::STB_WEAK)
+ return false;
+
+ // We don't report symbols defined in discarded sections.
+ if (sym->is_defined_in_discarded_section())
+ return false;
+
+ // If the target defines this symbol, don't report it here.
+ if (parameters->target().is_defined_by_abi(sym))
+ return false;
+
+ // See if we've been told to ignore whether this symbol is
+ // undefined.
+ const char* const u = parameters->options().unresolved_symbols();
+ if (u != NULL)
+ {
+ if (strcmp(u, "ignore-all") == 0)
+ return false;
+ if (strcmp(u, "report-all") == 0)
+ return true;
+ if (strcmp(u, "ignore-in-object-files") == 0 && !sym->in_dyn())
+ return false;
+ if (strcmp(u, "ignore-in-shared-libs") == 0 && !sym->in_reg())
+ return false;
+ }
+
+ // When creating a shared library, only report unresolved symbols if
+ // -z defs was used.
+ if (parameters->options().shared() && !parameters->options().defs())
+ return false;
+
+ // Otherwise issue a warning.
+ return true;
+}
+
// This function implements the generic part of relocation processing.
// The template parameter Relocate must be a class type which provides
// a single function, relocate(), which implements the machine
const int reloc_size = Reloc_types<sh_type, size, big_endian>::reloc_size;
Relocate relocate;
- Sized_relobj<size, big_endian>* object = relinfo->object;
+ Sized_relobj_file<size, big_endian>* object = relinfo->object;
unsigned int local_count = object->local_symbol_count();
Comdat_behavior comdat_behavior = CB_UNDETERMINED;
continue;
}
- if (sym != NULL
- && (sym->is_undefined() || sym->is_placeholder())
- && sym->binding() != elfcpp::STB_WEAK
- && !is_defined_in_discarded_section
- && !target->is_defined_by_abi(sym)
- && (!parameters->options().shared() // -shared
- || parameters->options().defs())) // -z defs
+ if (issue_undefined_symbol_error(sym))
gold_undefined_symbol_at_location(sym, relinfo, i, offset);
else if (sym != NULL
&& sym->visibility() != elfcpp::STV_DEFAULT
scan_relocatable_relocs(
Symbol_table*,
Layout*,
- Sized_relobj<size, big_endian>* object,
+ Sized_relobj_file<size, big_endian>* object,
unsigned int data_shndx,
const unsigned char* prelocs,
size_t reloc_count,
const int reloc_size = Reloc_types<sh_type, size, big_endian>::reloc_size;
const Address invalid_address = static_cast<Address>(0) - 1;
- Sized_relobj<size, big_endian>* const object = relinfo->object;
+ Sized_relobj_file<size, big_endian>* const object = relinfo->object;
const unsigned int local_count = object->local_symbol_count();
unsigned char* pwrite = reloc_view;