Skip to content

Commit 0d1789d

Browse files
committed
Update builtin gotcha to v1.0.7
1 parent fd015f1 commit 0d1789d

File tree

4 files changed

+20
-5
lines changed

4 files changed

+20
-5
lines changed

ext/gotcha/include/gotcha/gotcha.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
3030
#ifndef GOTCHA_H
3131
#define GOTCHA_H
3232

33+
/* Only contains the GOTCHA version, not needed for our Caliper copy
34+
#include <gotcha/gotcha_config.h>
35+
*/
36+
#include <gotcha/gotcha_types.h>
3337
#include <link.h>
3438

35-
#include "gotcha/gotcha_types.h"
36-
3739
#if defined(__cplusplus)
3840
extern "C" {
3941
#endif

ext/gotcha/src/gotcha.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ static void setBindingAddressPointer(struct gotcha_binding_t *in, void *value) {
4040
writeAddress(target, value);
4141
}
4242

43-
static void **getInternalBindingAddressPointer(struct internal_binding_t **in) {
43+
void **getInternalBindingAddressPointer(struct internal_binding_t **in) {
4444
return (void **)&((*in)->wrappee_pointer);
4545
}
4646

ext/gotcha/src/gotcha_dl.c

+14-2
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ static int per_binding(hash_key_t key, hash_data_t data,
113113
binding->user_binding->name,
114114
binding->associated_binding_table->tool->tool_name);
115115

116+
if (!binding->user_binding->name) return 0;
116117
while (binding->next_binding) {
117118
binding = binding->next_binding; // GCOVR_EXCL_START
118119
debug_printf(3,
@@ -157,7 +158,18 @@ static void *dlsym_wrapper(void *handle, const char *symbol_name) {
157158
debug_printf(1, "User called dlsym(%p, %s)\n", handle, symbol_name);
158159
int result = lookup_hashtable(&function_hash_table, (hash_key_t)symbol_name,
159160
(hash_data_t *)&binding);
160-
if (result != -1) return binding->user_binding->wrapper_pointer;
161+
void *val = orig_dlsym(handle, symbol_name);
162+
if (result != -1) {
163+
void **wrappee_ptr = getInternalBindingAddressPointer(
164+
(struct internal_binding_t **)binding->user_binding->function_handle);
165+
if (val == NULL || *wrappee_ptr == val) {
166+
// if the wrapper is found and the wrappee is the function requested.
167+
// This is needed in cases where we wrap a function F1 from library A and
168+
// we dynamically load function F1 from library B. As name is same, we
169+
// need to make sure the wrappee are the same as well
170+
return binding->user_binding->wrapper_pointer;
171+
}
172+
}
161173
if (handle == RTLD_NEXT) {
162174
struct link_map *lib = gotchas_dlsym_rtld_next_lookup(
163175
symbol_name, __builtin_return_address(0));
@@ -168,7 +180,7 @@ static void *dlsym_wrapper(void *handle, const char *symbol_name) {
168180
}
169181
return NULL;
170182
} else {
171-
return orig_dlsym(handle, symbol_name);
183+
return val;
172184
}
173185
}
174186

ext/gotcha/src/gotcha_dl.h

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ extern void update_all_library_gots(hash_table_t *bindings);
99
extern long lookup_exported_symbol(const char *name, const struct link_map *lib,
1010
void **symbol);
1111
extern int prepare_symbol(struct internal_binding_t *binding);
12+
extern void **getInternalBindingAddressPointer(struct internal_binding_t **in);
1213

1314
extern gotcha_wrappee_handle_t orig_dlopen_handle;
1415
extern gotcha_wrappee_handle_t orig_dlsym_handle;

0 commit comments

Comments
 (0)