是的,我正在努力实现类似
的目标 __asm__(jmp label;);
其中label
应该替换为内存中保存的字符串的值(结构的字段)。
有没有办法做到这一点(或类似的东西让我跳到运行时确定的位置)?
更新
@Jester建议的dlsym
看起来很有希望我现在正试图找出如何使用它。
如果我尝试以下(gcc flags -Wall -std=c99 -m32 -ldl
)
#include <stdlib.h> //malloc
#include <stdio.h> //printf
#include <stdint.h> //uint32_t
#include <string.h> //strlen,strdup,...
#include <dlfcn.h> //dlsym
void test(){printf("Hello World\n");}
int main(int argc, char* argv[]){
//this works
__asm__(
"call test;"
);
//I'd like this to have the same effect
char *label = "test";
void *handle = dlopen(NULL,RTLD_NOW);
uint32_t loc = (uint32_t)dlsym(handle,label);
__asm__(
"call %0;"
:
:"rm"(loc)
);
}
我得到了
Hello World
分段错误(核心转储)
答案 0 :(得分:0)
asm应该看起来像"call *%0" :: "rm" (loc) : "eax", "ecx", "edx", "memory"
,你需要添加-rdynamic
编译器标志,否则你会得到一个NULL
指针;) - Jester
当然,从内联asm调用函数是 hard 才能正确,尤其是对于64位。此外,编译器/优化器无法看到的调用可能导致无效的链接时间过程间优化。
使用C函数指针更容易也更好。