[PATCH 3/6] gold: Take addend into account for calculating value of the local symbol for GOT.
Cary Coutant
ccoutant@gmail.com
Mon Nov 9 20:00:00 GMT 2015
When posting patches, please post them either as plain text or as
attachments -- your patches were encoded as quoted-printable, which
makes them a bit harder to process.
> @@ -1113,6 +1113,13 @@ class Relobj : public Object
> local_has_got_offset(unsigned int symndx, unsigned int got_type) const
> { return this->do_local_has_got_offset(symndx, got_type); }
>
> + // Return whether the local symbol SYMNDX with ADDEND has a GOT offset
> + // of type GOT_TYPE.
> + bool
> + local_has_got_offset(unsigned int symndx, unsigned int got_type,
> + uint64_t addend) const
> + { return this->do_local_has_got_offset(symndx, got_type, addend); }
> +
Rather than overloading the private virtual method, let's just change
its signature to include the addend, and pass a 0 explicitly from the
original version of the public method.
> // Return the GOT offset of type GOT_TYPE of the local symbol
> // SYMNDX. It is an error to call this if the symbol does not have
> // a GOT offset of the specified type.
> @@ -1120,6 +1127,14 @@ class Relobj : public Object
> local_got_offset(unsigned int symndx, unsigned int got_type) const
> { return this->do_local_got_offset(symndx, got_type); }
>
> + // Return the GOT offset of type GOT_TYPE of the local symbol
> + // SYMNDX with ADDEND. It is an error to call this if the symbol
> + // does not have a GOT offset of the specified type.
> + unsigned int
> + local_got_offset(unsigned int symndx, unsigned int got_type,
> + uint64_t addend) const
> + { return this->do_local_got_offset(symndx, got_type, addend); }
> +
> // Set the GOT offset with type GOT_TYPE of the local symbol SYMNDX
> // to GOT_OFFSET.
> void
> @@ -1127,6 +1142,13 @@ class Relobj : public Object
> unsigned int got_offset)
> { this->do_set_local_got_offset(symndx, got_type, got_offset); }
>
> + // Set the GOT offset with type GOT_TYPE of the local symbol SYMNDX
> + // with ADDEND to GOT_OFFSET.
> + void
> + set_local_got_offset(unsigned int symndx, unsigned int got_type,
> + unsigned int got_offset, uint64_t addend)
> + { this->do_set_local_got_offset(symndx, got_type, got_offset, addend); }
> +
Likewise for these.
> // Return whether the local symbol SYMNDX is a TLS symbol.
> bool
> local_is_tls(unsigned int symndx) const
> @@ -1323,15 +1345,31 @@ class Relobj : public Object
> do_local_has_got_offset(unsigned int symndx,
> unsigned int got_type) const = 0;
>
> + // Return whether a local symbol with addend has a GOT offset
> + // of a given type.
> + virtual bool
> + do_local_has_got_offset(unsigned int symndx,
> + unsigned int got_type, uint64_t addend) const = 0;
> +
> // Return the GOT offset of a given type of a local symbol.
> virtual unsigned int
> do_local_got_offset(unsigned int symndx, unsigned int got_type) const = 0;
>
> + // Return the GOT offset of a given type of a local symbol with addend.
> + virtual unsigned int
> + do_local_got_offset(unsigned int symndx, unsigned int got_type,
> + uint64_t addend) const = 0;
> +
> // Set the GOT offset with a given type for a local symbol.
> virtual void
> do_set_local_got_offset(unsigned int symndx, unsigned int got_type,
> unsigned int got_offset) = 0;
>
> + // Set the GOT offset with a given type for a local symbol with addend.
> + virtual void
> + do_set_local_got_offset(unsigned int symndx, unsigned int got_type,
> + unsigned int got_offset, uint64_t addend) = 0;
> +
Here we can just replace the first version of each with the new one;
no overload necessary.
> // Return whether local symbol SYMNDX is a TLS symbol.
> virtual bool
> do_local_is_tls(unsigned int symndx) const = 0;
> @@ -2004,6 +2042,12 @@ class Sized_relobj : public Relobj
> && p->second->get_offset(got_type) != -1U);
> }
>
> + // Return whether the local symbol SYMNDX with ADDEND has a GOT offset
> + // of type GOT_TYPE.
> + bool
> + do_local_has_got_offset(unsigned int, unsigned int, uint64_t) const
> + { gold_unreachable(); }
> +
> // Return the GOT offset of type GOT_TYPE of the local symbol
> // SYMNDX.
> unsigned int
> @@ -2017,6 +2061,12 @@ class Sized_relobj : public Relobj
> return off;
> }
>
> + // Return the GOT offset of type GOT_TYPE of the local symbol
> + // SYMNDX with ADDEND.
> + unsigned int
> + do_local_got_offset(unsigned int, unsigned int, uint64_t) const
> + { gold_unreachable(); }
> +
> // Set the GOT offset with type GOT_TYPE of the local symbol SYMNDX
> // to GOT_OFFSET.
> void
> @@ -2036,6 +2086,13 @@ class Sized_relobj : public Relobj
> }
> }
>
> + // Set the GOT offset with type GOT_TYPE of the local symbol SYMNDX
> + // with ADDEND to GOT_OFFSET.
> + void
> + do_set_local_got_offset(unsigned int, unsigned int,
> + unsigned int, uint64_t)
> + { gold_unreachable(); }
> +
And here, rather than implementing these only for Mips_relobj, let's
just pull your implementations from patch #5 into here, replacing the
ones without addend.
I think there are other platforms that may also need to track (symbol
+ addend) for GOT entries, so it makes sense to support it in
target-independent code. (PA-RISC comes to mind.)
Thanks!
-cary
More information about the Binutils
mailing list