Skip to content

Commit eb1bad4

Browse files
committed
Add full warnings and improve code.
1 parent 7f59939 commit eb1bad4

File tree

3 files changed

+45
-19
lines changed

3 files changed

+45
-19
lines changed

plthook_elf.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,6 @@
187187
#endif
188188
#endif /* __LP64__ */
189189

190-
/* TODO: Add debug info for library listing */
191190
#ifdef PLTHOOK_DEBUG
192191
#define DEBUG_MSG(...) fprintf(stderr, __VA_ARGS__)
193192
#else
@@ -332,14 +331,17 @@ int plthook_open_by_address(plthook_t **plthook_out, void *address)
332331
return plthook_open_real(plthook_out, &data.lmap);
333332
#else
334333
Dl_info info;
335-
struct link_map *lmap = NULL;
334+
union {
335+
struct link_map *lmap;
336+
void *ptr;
337+
} addr = { NULL };
336338

337339
*plthook_out = NULL;
338-
if (dladdr1(address, &info, (void**)&lmap, RTLD_DL_LINKMAP) == 0) {
340+
if (dladdr1(address, &info, (void**)(&addr.ptr), RTLD_DL_LINKMAP) == 0) {
339341
set_errmsg("dladdr error");
340342
return PLTHOOK_FILE_NOT_FOUND;
341343
}
342-
return plthook_open_real(plthook_out, lmap);
344+
return plthook_open_real(plthook_out, addr.lmap);
343345
#endif
344346
}
345347

@@ -826,6 +828,7 @@ static int check_rel(const plthook_t *plthook, const Elf_Plt_Rel *plt, Elf_Xword
826828
}
827829
*name_out = plthook->dynstr + idx;
828830
*addr_out = (void**)(plthook->plt_addr_base + plt->r_offset);
831+
DEBUG_MSG("%s (%p)\n", *name_out, (void *)(*addr_out));
829832
return 0;
830833
}
831834
return -1;

test/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
UNAME_S := $(shell uname -s)
66

77
CFLAGS_SHARED = -shared -fPIC
8-
CFLAGS_WARNING = -Wall
8+
CFLAGS_WARNING = -Wall -Wpedantic -Wextra
99
CFLAGS = $(CFLAGS_WARNING) $(EXTRA_CFLAGS) $(OPT_CFLAGS)
1010
LDFLAGS = $(EXTRA_LDFLAGS) $(OPT_LDFLAGS)
1111
EXEEXT =

test/testprog.c

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -219,24 +219,41 @@ static void hook_function_calls_in_executable(enum open_mode open_mode)
219219
void *handle;
220220

221221
switch (open_mode) {
222-
case OPEN_MODE_DEFAULT:
223-
CHK_PH(plthook_open(&plthook, NULL));
224-
break;
225-
case OPEN_MODE_BY_HANDLE:
222+
case OPEN_MODE_DEFAULT:
223+
{
224+
CHK_PH(plthook_open(&plthook, NULL));
225+
break;
226+
}
227+
case OPEN_MODE_BY_HANDLE:
228+
{
226229
#ifdef WIN32
227-
handle = GetModuleHandle(NULL);
230+
handle = GetModuleHandle(NULL);
228231
#else
229-
handle = dlopen(NULL, RTLD_LAZY);
232+
handle = dlopen(NULL, RTLD_LAZY);
230233
#endif
231-
assert(handle != NULL);
232-
CHK_PH(plthook_open_by_handle(&plthook, handle));
233-
break;
234-
case OPEN_MODE_BY_ADDRESS:
235-
CHK_PH(plthook_open_by_address(&plthook, &show_usage));
236-
break;
234+
assert(handle != NULL);
235+
CHK_PH(plthook_open_by_handle(&plthook, handle));
236+
break;
237+
}
238+
case OPEN_MODE_BY_ADDRESS:
239+
{
240+
union {
241+
void (*fp)(const char *);
242+
void *ptr;
243+
} cast = { &show_usage };
244+
CHK_PH(plthook_open_by_address(&plthook, cast.ptr));
245+
break;
246+
}
237247
}
238248
test_plthook_enum(plthook, funcs_called_by_main);
239-
CHK_PH(plthook_replace(plthook, "strtod_cdecl", (void*)strtod_cdecl_hook_func, (void**)&strtod_cdecl_old_func));
249+
250+
{
251+
union {
252+
double (*fp)(const char *, char**);
253+
void *ptr;
254+
} cast = { &strtod_cdecl_hook_func };
255+
CHK_PH(plthook_replace(plthook, "strtod_cdecl", cast.ptr, (void**)&strtod_cdecl_old_func));
256+
}
240257
#if defined _WIN32 || defined __CYGWIN__
241258
CHK_PH(plthook_replace(plthook, "strtod_stdcall", (void*)strtod_stdcall_hook_func, (void**)&strtod_stdcall_old_func));
242259
CHK_PH(plthook_replace(plthook, "strtod_fastcall", (void*)strtod_fastcall_hook_func, (void**)&strtod_fastcall_old_func));
@@ -287,7 +304,13 @@ static void hook_function_calls_in_library(enum open_mode open_mode)
287304
break;
288305
}
289306
test_plthook_enum(plthook, funcs_called_by_libtest);
290-
CHK_PH(plthook_replace(plthook, "strtod", (void*)strtod_hook_func, NULL));
307+
{
308+
union {
309+
double (*fp)(const char *, char**);
310+
void *ptr;
311+
} cast = { &strtod_hook_func };
312+
CHK_PH(plthook_replace(plthook, "strtod", cast.ptr, NULL));
313+
}
291314
plthook_close(plthook);
292315
}
293316

0 commit comments

Comments
 (0)