Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixing Ctest cases and fixing wrapping of main #116

Merged
merged 2 commits into from
Jul 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 19 additions & 5 deletions src/elf_ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,14 @@ signed long lookup_elf_hash_symbol(const char *name, ElfW(Sym) *syms, ElfW(Half)
return -1; \
for (dentry = dynsec; dentry->d_tag != DT_NULL; dentry++) { \
switch (dentry->d_tag) { \
case DT_REL: { \
rel = dentry->d_un.d_ptr; \
break; \
} \
case DT_RELA: { \
rela = dentry->d_un.d_ptr; \
break; \
} \
case DT_PLTRELSZ: { \
rel_size = (unsigned int) dentry->d_un.d_val; \
break; \
Expand Down Expand Up @@ -199,17 +207,23 @@ signed long lookup_elf_hash_symbol(const char *name, ElfW(Sym) *syms, ElfW(Half)
*
******************************************************************************
*/
#define FOR_EACH_PLTREL(lmap, op, ...) { \
#define FOR_EACH_PLTREL(lookup_rel, lmap, op, ...) { \
INIT_DYNAMIC(lmap) \
ElfW(Addr) offset = lmap->l_addr; \
(void) offset; \
if (is_rela) { \
rela = (ElfW(Rela) *) jmprel; \
FOR_EACH_PLTREL_INT(rela, op, ## __VA_ARGS__); \
ElfW(Rela) * jmp_rela = (ElfW(Rela) *) jmprel; \
FOR_EACH_PLTREL_INT(jmp_rela, op, ## __VA_ARGS__); \
if (lookup_rel && rela) { \
FOR_EACH_PLTREL_INT(rela, op, ## __VA_ARGS__); \
} \
} \
else { \
rel = (ElfW(Rel) *) jmprel; \
FOR_EACH_PLTREL_INT(rel, op, ## __VA_ARGS__); \
ElfW(Rel) * jmp_rel = (ElfW(Rel) *) jmprel; \
FOR_EACH_PLTREL_INT(jmp_rel, op, ## __VA_ARGS__); \
if (lookup_rel && rel) { \
FOR_EACH_PLTREL_INT(rel, op, ## __VA_ARGS__); \
} \
} \
}

Expand Down
17 changes: 10 additions & 7 deletions src/gotcha.c
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ static int mark_got_writable(struct link_map *lib)
return 0;
}

static int update_library_got(struct link_map *map, hash_table_t *bindingtable)
static int update_library_got(struct link_map *map, hash_table_t *bindingtable, int lookup_rel)
{
struct library_t *lib = get_library(map);
if (!lib) {
Expand All @@ -256,18 +256,18 @@ static int update_library_got(struct link_map *map, hash_table_t *bindingtable)
lib->flags |= LIB_GOT_MARKED_WRITEABLE;
}

FOR_EACH_PLTREL(map, update_lib_bindings, map, bindingtable);
FOR_EACH_PLTREL(lookup_rel, map, update_lib_bindings, map, bindingtable);

lib->generation = current_generation;
return 0;
}

void update_all_library_gots(hash_table_t *bindings)
void update_all_library_gots(hash_table_t *bindings, int lookup_rel)
{
struct link_map *lib_iter;
debug_printf(2, "Searching all callsites for %lu bindings\n", (unsigned long) bindings->entry_count);
for (lib_iter = _r_debug.r_map; lib_iter != 0; lib_iter = lib_iter->l_next) {
update_library_got(lib_iter, bindings);
update_library_got(lib_iter, bindings, lookup_rel);
}
}

Expand Down Expand Up @@ -313,9 +313,12 @@ GOTCHA_EXPORT enum gotcha_error_t gotcha_wrap(struct gotcha_binding_t* user_bind
}

debug_printf(2, "Processing %d bindings\n", num_actions);
int lookup_rel = 0;
for (i = 0; i < num_actions; i++) {
struct internal_binding_t *binding = bindings->internal_bindings + i;

if (gotcha_strcmp(binding->user_binding->name,"main")==0 ||
gotcha_strcmp(binding->user_binding->name,"__libc_start_main")==0)
lookup_rel = 1;
int result = rewrite_wrapper_orders(binding);
if (result & RWO_NEED_LOOKUP) {
debug_printf(2, "Symbol %s needs lookup operation\n", binding->user_binding->name);
Expand All @@ -336,9 +339,9 @@ GOTCHA_EXPORT enum gotcha_error_t gotcha_wrap(struct gotcha_binding_t* user_bind
new_bindings_count++;
}
}

if (new_bindings_count) {
update_all_library_gots(&new_bindings);
update_all_library_gots(&new_bindings, lookup_rel);
destroy_hashtable(&new_bindings);
}

Expand Down
2 changes: 1 addition & 1 deletion src/gotcha_dl.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ static void* dlopen_wrapper(const char* filename, int flags) {
foreach_hash_entry(&notfound_binding_table, NULL, per_binding);

debug_printf(2, "Updating GOT entries for new dlopened libraries\n");
update_all_library_gots(&function_hash_table);
update_all_library_gots(&function_hash_table, 0);

return handle;
}
Expand Down
2 changes: 1 addition & 1 deletion src/gotcha_dl.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include "tool.h"

void handle_libdl();
extern void update_all_library_gots(hash_table_t *bindings);
extern void update_all_library_gots(hash_table_t *bindings, int lookup_rel);
extern long lookup_exported_symbol(const char* name, const struct link_map *lib, void** symbol);
extern int prepare_symbol(struct internal_binding_t *binding);

Expand Down
6 changes: 2 additions & 4 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@ add_subdirectory(hammer)
endif()
add_subdirectory(rogot)
add_subdirectory(filter)
add_subdirectory(symver)

# FIXME: These tests fail currently in CI.
add_subdirectory(wrap_main)
#add_subdirectory(multi_agent_dlopen)
#add_subdirectory(wrap_main)
add_subdirectory(symver)
8 changes: 0 additions & 8 deletions test/multi_agent_dlopen/CMakeLists.txt

This file was deleted.

28 changes: 0 additions & 28 deletions test/multi_agent_dlopen/Makefile

This file was deleted.

54 changes: 0 additions & 54 deletions test/multi_agent_dlopen/dlsym.c

This file was deleted.

43 changes: 0 additions & 43 deletions test/multi_agent_dlopen/main.c

This file was deleted.

48 changes: 0 additions & 48 deletions test/multi_agent_dlopen/monitor.c

This file was deleted.