aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIain Sandoe <iain@sandoe.co.uk>2021-04-24 13:34:49 +0100
committerIain Sandoe <iain@sandoe.co.uk>2021-04-24 13:45:14 +0100
commitb6600392bf71c4a9785f8f49948b611425896830 (patch)
tree3e0f30173cca545dd6da1dc931d66ba0952cbf76 /gcc
parentf31ddad8ac8f11b8b11ab0c39f2e0740fd40ba8e (diff)
downloadgcc-b6600392bf71c4a9785f8f49948b611425896830.zip
gcc-b6600392bf71c4a9785f8f49948b611425896830.tar.gz
gcc-b6600392bf71c4a9785f8f49948b611425896830.tar.bz2
Darwin : Adjust darwin_binds_local_p for PIC code [PR100152].
Darwin's dynamic linker supports interposition and lazy symbol binding. If we are generating PIC code and a symbol is public, then it could potentially be indirected via a lazy-resolver stub; we cannot tell at compile-time if this will be done (since the indirection can be the result of adding a -flat-namespace option at link-time). Here we are conservative and assume that any such symbol cannot bind locally. The default implementation for binds_local_p handles undefined, weak and common symbols which are always indirected (for mdynamic-no-pic also). gcc/ChangeLog: PR target/100152 * config/darwin.c (darwin_binds_local_p): Assume that any public symbol might be interposed for PIC code. Update function header comment to reflect current Darwin capability.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/darwin.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c
index 5d17391..36b460a 100644
--- a/gcc/config/darwin.c
+++ b/gcc/config/darwin.c
@@ -3134,16 +3134,25 @@ darwin_file_end (void)
/* TODO: Add a language hook for identifying if a decl is a vtable. */
#define DARWIN_VTABLE_P(DECL) 0
-/* Cross-module name binding. Darwin does not support overriding
- functions at dynamic-link time, except for vtables in kexts. */
+/* Cross-module name binding.
+ Darwin's dynamic linker supports interposition and lazy symbol binding.
+ If we are generating PIC code and a symbol is public, then it could
+ potentially be indirected via a lazy-resolver stub; we cannot tell at
+ compile-time if this will be done (since the indirection can be the
+ result of adding a -flat-namespace option at link-time). Here we are
+ conservative and assume that any such symbol cannot bind locally.
+ The default implementation for binds_local_p handles undefined, weak and
+ common symbols which are always indirected. */
bool
darwin_binds_local_p (const_tree decl)
{
/* We use the "shlib" input to indicate that a symbol should be
- considered overridable; only relevant for vtables in kernel modules
- on earlier system versions, and with a TODO to complete. */
+ considered overridable. Older versions of the kernel also support
+ interposition for extensions (although this code is a place-holder
+ until there is an implementation for DARWIN_VTABLE_P). */
bool force_overridable = TARGET_KEXTABI && DARWIN_VTABLE_P (decl);
+ force_overridable |= MACHOPIC_PURE;
return default_binds_local_p_3 (decl, force_overridable /* shlib */,
false /* weak dominate */,
false /* extern_protected_data */,