オブジェクトモジュール内の静的スコープ で関数をオーバーライドする方法はありますか?オブジェクトモジュール(gcc、ld、x86、objcopy)の静的関数を無効にすることはできますか?
私はこのような何かを始める場合は、グローバル・シンボル「foo」という持つモジュール は、ローカル・シンボル「バズ」
[[email protected] ~]$ cat foo.c
#include <stdio.h>
static void baz(void)
{
printf("baz\n");
}
static void bar(void)
{
printf("bar\n");
baz();
}
void foo(void)
{
printf("foo\n");
bar();
}
[[email protected] ~]$ gcc -g -c foo.c
[[email protected] ~]$ objdump -x foo.o | egrep 'foo|bar|baz'
foo.o: file format elf32-i386
foo.o
00000000 l df *ABS* 00000000 foo.c
00000000 l F .text 00000014 baz
00000014 l F .text 00000019 bar
0000002d g F .text 00000019 foo
それが1つを持って呼び出す「バー、」 ローカルシンボルを呼び出す関数でありますグローバル、 "foo"と2人のローカル "bar"と "baz"。
私にできること 、私はバーやバズを行使し、いくつかのユニットテストを書きたいとしよう:
[[email protected] ~]$ cat barbaz
bar
baz
[[email protected] ~]$ objcopy --globalize-symbols=barbaz foo.o foo2.o
[[email protected] ~]$ objdump -x foo2.o | egrep 'foo|bar|baz'
foo2.o: file format elf32-i386
foo2.o
00000000 l df *ABS* 00000000 foo.c
00000000 g F .text 00000014 baz
00000014 g F .text 00000019 bar
0000002d g F .text 00000019 foo
[[email protected] ~]$
そして今、バー、バズは、モジュールの外部 からグローバルシンボルとアクセスできます。ここまでは順調ですね。
しかし、自分自身の機能を "baz"の の上に置きたいのであれば、 "bar"は私の介入された "baz"を呼びますか?
これを行う方法はありますか?
--wrapオプションは
[[email protected] ~]$ cat ibaz.c
#include <stdio.h>
extern void foo();
extern void bar();
void __wrap_baz()
{
printf("wrapped baz\n");
}
int main(int argc, char *argv[])
{
foo();
baz();
}
[[email protected] ~]$ gcc -o ibaz ibaz.c foo2.o -Xlinker --wrap -Xlinker baz
[[email protected] ~]$ ./ibaz
foo
bar
baz
wrapped baz
[[email protected] ~]$
メイン()ラップしまったから呼び出さバズ...それを行うには思えませんが、 バーはまだローカルバズないラップバズを呼び出します。
バーをラップしたbazに電話する方法はありますか?
関数呼び出しのアドレスを使ってオブジェクトコードを変更する必要がある場合でも、自動化された方法で行うことができれば、十分に良いかもしれませんが、少なくともi386とx86_64。
- スティーブ
私はまだ弱い記号を使用していませんが、元のモジュールの弱化しているような音が新しく交換されます。 – x539
彼がそのようなことをしようとすると、彼はソースにアクセスできないコード –
私はソースコードにアクセスできますが、通常の単体テスト方法でソースを変更したくないです。実際には、これはLinuxカーネルモジュールをテストするためのものです。アップストリームでは、カーネルではないものを扱うだけでソースに変更を加えるのが大好きで、パッチの互換性のために、ソースを不必要に混乱させたくありません。 – smcameron