assembly - 从char数组中获取符号标签?

时间:2016-05-11 17:03:29

标签: c assembly x86

是的,我正在努力实现类似

的目标

__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

     

分段错误(核心转储)

1 个答案:

答案 0 :(得分:0)

asm应该看起来像"call *%0" :: "rm" (loc) : "eax", "ecx", "edx", "memory",你需要添加-rdynamic编译器标志,否则你会得到一个NULL指针;) - Jester

当然,从内联asm调用函数是 hard 才能正确,尤其是对于64位。此外,编译器/优化器无法看到的调用可能导致无效的链接时间过程间优化。

使用C函数指针更容易也更好。