+// Set up some symbols, then perform Sized_relobj_file method.
+
+template<int size, bool big_endian>
+void
+Powerpc_relobj<size, big_endian>::do_scan_relocs(Symbol_table* symtab,
+ Layout* layout,
+ Read_relocs_data* rd)
+{
+ if (size == 32)
+ {
+ // Define a weak hidden _GLOBAL_OFFSET_TABLE_ to ensure it isn't
+ // seen as undefined when scanning relocs (and thus requires
+ // non-relative dynamic relocs). The proper value will be
+ // updated later.
+ Symbol *gotsym = symtab->lookup("_GLOBAL_OFFSET_TABLE_", NULL);
+ if (gotsym != NULL && gotsym->is_undefined())
+ {
+ Target_powerpc<size, big_endian>* target =
+ static_cast<Target_powerpc<size, big_endian>*>(
+ parameters->sized_target<size, big_endian>());
+ Output_data_got_powerpc<size, big_endian>* got
+ = target->got_section(symtab, layout);
+ symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL,
+ Symbol_table::PREDEFINED,
+ got, 0, 0,
+ elfcpp::STT_OBJECT,
+ elfcpp::STB_WEAK,
+ elfcpp::STV_HIDDEN, 0,
+ false, false);
+ }
+
+ // Define _SDA_BASE_ at the start of the .sdata section + 32768.
+ Symbol *sdasym = symtab->lookup("_SDA_BASE_", NULL);
+ if (sdasym != NULL && sdasym->is_undefined())
+ {
+ Output_data_space* sdata = new Output_data_space(4, "** sdata");
+ Output_section* os
+ = layout->add_output_section_data(".sdata", 0,
+ elfcpp::SHF_ALLOC
+ | elfcpp::SHF_WRITE,
+ sdata, ORDER_SMALL_DATA, false);
+ symtab->define_in_output_data("_SDA_BASE_", NULL,
+ Symbol_table::PREDEFINED,
+ os, 32768, 0, elfcpp::STT_OBJECT,
+ elfcpp::STB_LOCAL, elfcpp::STV_HIDDEN,
+ 0, false, false);
+ }
+ }
+ Sized_relobj_file<size, big_endian>::do_scan_relocs(symtab, layout, rd);
+}
+