0

練習用に ASM でいくつかの C 関数を書き直しています。私のmemset機能はRAX、レジスタに渡されたのと同じアドレスに設定されていRDIます。しかし、gcc はALの値をCDQE命令で拡張しています。

char super[] = "suuuuuuuuuuper";

res = memset(super, 't', 4);
printf("memset = {%s} (%p) res = %p\n", super, super, res);

出力:

memset = {ttttuuuuuuuper} (0x7fffffd30250) res = 0xffffffffffd30250

に格納されているアドレスにアクセスしようとすると、セグメンテーション違反が発生しますres。バイナリ ファイルを編集して、CQDE呼び出しを 2 つのNOP命令に置き換えるだけで、完全に実行されます。

しかし、その呼び出しを回避するための GCC フラグなど、他に何かあるのではないかと思っていました。

4

1 に答える 1