2016-05-11 3 views
0

ええ、私はlabelは、メモリ(構造体のフィールド)で開催された文字列の値によって置き換えられるべきアセンブリ - 文字配列から記号ラベルを取得しますか?

__asm__(jmp label;);ような何かを達成しようとしています。

これを実行する方法(または実行時に決定された位置にジャンプするのに似たような方法)がありますか?

更新 dlsym @Jesterは、私は今、それを使用する方法を見つけることを試みている有望なルックスを示唆しています。

私は私が得る

#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) 
     ); 

} 

次(gccのフラグを-Wall -std=c99 -m32 -ldl)しようとした場合

のHello World

セグメンテーションフォールト(コアダンプ)

+3

環境によっては、 'dlsym'や' GetProcAddress'を使ってシンボルのアドレスを取得することができます。ポインタを使ってジャンプすることができます。 – Jester

+0

Cのラベルはコンパイルされたコードでは有効なシンボルではありません。 – stark

+0

@Jester dlsymは有望に見えます、ありがとう...しかし、私はそれをどのように使いますか? (上記の編集を参照してください) – User1291

答えて

0

ASMがなければなりません"call *%0" :: "rm" (loc) : "eax", "ecx", "edx", "memory"のように見える) - ジェスター

もちろん

、インラインアセンブラから関数を呼び出すと、特に64ビットのために、権利を取得するために難しいであり、あなたはそれ以外の場合は、あなたがNULLポインタを取得-rdynamicコンパイラフラグを追加する必要があります。また、コンパイラ/オプティマイザが見ることができない呼び出しは、無効なリンク時プロシージャ間の最適化につながる可能性があります。

Cの関数ポインタを使用する方がずっと簡単です

関連する問題