ええ、私は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
セグメンテーションフォールト(コアダンプ)
環境によっては、 'dlsym'や' GetProcAddress'を使ってシンボルのアドレスを取得することができます。ポインタを使ってジャンプすることができます。 – Jester
Cのラベルはコンパイルされたコードでは有効なシンボルではありません。 – stark
@Jester dlsymは有望に見えます、ありがとう...しかし、私はそれをどのように使いますか? (上記の編集を参照してください) – User1291