aboutsummaryrefslogtreecommitdiff
path: root/libexec/rtld-elf/rtld_lock.h
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2010-12-25 08:51:20 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2010-12-25 08:51:20 +0000
commit8569deaf1cba0d732647f0dae7eb5af2ee5fae1b (patch)
tree487c080e0cb090d960945a4f112301253d4a6e9f /libexec/rtld-elf/rtld_lock.h
parent06786ccfb3798b20178fc6badd015cc4798b195d (diff)
downloadsrc-8569deaf1cba0d732647f0dae7eb5af2ee5fae1b.tar.gz
src-8569deaf1cba0d732647f0dae7eb5af2ee5fae1b.zip
Implement support for ELF filters in rtld. Both normal and auxillary
filters are implemented. Filtees are loaded on demand, unless LD_LOADFLTR environment variable is set or -z loadfltr was specified during the linking. This forces rtld to upgrade read-locked rtld_bind_lock to write lock when it encounters an object with filter during symbol lookup. Consolidate common arguments of the symbol lookup functions in the SymLook structure. Track the state of the rtld locks in the RtldLockState structure. Pass local RtldLockState through the rtld symbol lookup calls to allow lock upgrades. Reviewed by: kan Tested by: Mykola Dzham <i levsha me>, nwhitehorn (powerpc)
Notes
Notes: svn path=/head/; revision=216695
Diffstat (limited to 'libexec/rtld-elf/rtld_lock.h')
-rw-r--r--libexec/rtld-elf/rtld_lock.h16
1 files changed, 12 insertions, 4 deletions
diff --git a/libexec/rtld-elf/rtld_lock.h b/libexec/rtld-elf/rtld_lock.h
index 6c04e3b96e37..fa63787d52ac 100644
--- a/libexec/rtld-elf/rtld_lock.h
+++ b/libexec/rtld-elf/rtld_lock.h
@@ -57,10 +57,18 @@ extern rtld_lock_t rtld_bind_lock;
extern rtld_lock_t rtld_libc_lock;
extern rtld_lock_t rtld_phdr_lock;
-int rlock_acquire(rtld_lock_t);
-int wlock_acquire(rtld_lock_t);
-void rlock_release(rtld_lock_t, int);
-void wlock_release(rtld_lock_t, int);
+#define RTLD_LOCK_UNLOCKED 0
+#define RTLD_LOCK_RLOCKED 1
+#define RTLD_LOCK_WLOCKED 2
+
+struct Struct_RtldLockState;
+typedef struct Struct_RtldLockState RtldLockState;
+
+void rlock_acquire(rtld_lock_t, RtldLockState *);
+void wlock_acquire(rtld_lock_t, RtldLockState *);
+void lock_release(rtld_lock_t, RtldLockState *);
+void lock_upgrade(rtld_lock_t, RtldLockState *);
+void lock_restart_for_upgrade(RtldLockState *);
#endif /* IN_RTLD */