- (*secvec).push_back(dst_id);
- (*symvec).push_back(NULL);
- long long symvalue = static_cast<long long>(lsym.get_st_value());
- (*addendvec).push_back(std::make_pair(symvalue,
- static_cast<long long>(addend)));
+ Address symvalue = dst_off - addend;
+ if (is_ordinary)
+ (*secvec).push_back(Section_id(src_obj, dst_indx));
+ else
+ (*secvec).push_back(Section_id(NULL, 0));
+ // If the target of the relocation is an STT_SECTION symbol,
+ // make a note of that by storing -1 in the symbol vector.
+ if (lsym.get_st_type() == elfcpp::STT_SECTION)
+ (*symvec).push_back(reinterpret_cast<Symbol*>(-1));
+ else
+ (*symvec).push_back(NULL);
+ (*addendvec).push_back(std::make_pair(
+ static_cast<long long>(symvalue),
+ static_cast<long long>(addend)));
+ uint64_t reloc_offset =
+ convert_to_section_size_type(reloc.get_r_offset());
+ (*offsetvec).push_back(reloc_offset);
+ (*reloc_addend_size_vec).push_back(
+ get_embedded_addend_size<Classify_reloc>(r_type, src_obj));