被打桩的函数是STUB_FUN, 可以替换成如__cudaRegisterFunction
, 另外插入的函数zwl_profiler可另外定义,
.text.section .rodata
.LC0:.string "STUB_FUN".text.globl STUB_FUN.type STUB_FUN, @function
STUB_FUN:
.LFB15:endbr64pushq %rbpmovq %rsp, %rbpsubq $64, %rspmovq %rdi, -24(%rbp)movq %rsi, -32(%rbp)movq %rdx, -40(%rbp)movq %rcx, -48(%rbp)movq %r8, -56(%rbp)movq %r9, -64(%rbp)call zwl_profilerleaq .LC0(%rip), %raxmovq %rax, %rsimovq $-1, %rdicall dlsym@PLTmovq %rax, -8(%rbp)movq -8(%rbp), %r8movq -48(%rbp), %rcxmovq -40(%rbp), %rdxmovq -32(%rbp), %rsimovq -24(%rbp), %raxmovq %rax, %rdicall *%r8leaveret
.LFE15:.size STUB_FUN, .-STUB_FUN.ident "GCC: (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0".section .note.GNU-stack,"",@progbits.section .note.gnu.property,"a".align 8.long 1f - 0f.long 4f - 1f.long 5
0:.string "GNU"
1:.align 8.long 0xc0000002.long 3f - 2f
2:.long 0x3
3:.align 8
4:
zwl_prifler定义,
#include <stdio.h>void zwl_profiler(void* handle, void* func, char* funcName) {printf("register %p: %s\n", func, funcName);
}
需要注意的点是被打桩的函数STUB_FUN不能在zwl_profiler中使用,如printf
, malloc
函数不行,需要另外想办法。
gcc stub.s zwl_profiler.c -g -shared -o ll.so
export LD_PRELOAD=$PWD/ll.so