gpt4 book ai didi

c - 是否可以覆盖目标模块(gcc、ld、x86、objcopy)中的静态函数?

转载 作者:太空狗 更新时间:2023-10-29 16:56:05 26 4
gpt4 key购买 nike

有没有办法覆盖具有静态范围的函数在对象模块中?

如果我从这样的东西开始,一个模块具有全局符号“foo”的函数调用调用本地符号“baz”的本地符号“bar”

[scameron@localhost ~]$ 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();
}

[scameron@localhost ~]$ gcc -g -c foo.c
[scameron@localhost ~]$ 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

它有一个全局变量“foo”和两个本地变量“bar”和“baz”。

假设我想写一些练习 bar 和 baz 的单元测试,我能做到:

[scameron@localhost ~]$ cat barbaz
bar
baz
[scameron@localhost ~]$ objcopy --globalize-symbols=barbaz foo.o foo2.o
[scameron@localhost ~]$ 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
[scameron@localhost ~]$

现在 bar 和 baz 是全局符号,可以从模块外。到目前为止一切顺利。

但是如果我想在上面插入我自己的函数怎么办的“baz”,并让“bar”调用我插入的“baz”?

有办法吗?

--wrap 选项似乎没有这样做...

[scameron@localhost ~]$ 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();
}

[scameron@localhost ~]$ gcc -o ibaz ibaz.c foo2.o -Xlinker --wrap -Xlinker baz
[scameron@localhost ~]$ ./ibaz
foo
bar
baz
wrapped baz
[scameron@localhost ~]$

从 main() 调用的 baz 被包装了,但是bar 仍然调用本地 baz 而不是包装的 baz。

有没有办法让bar调用wrapped baz?

即使它需要修改目标代码以修改函数调用的地址,如果可以以自动化方式完成,那可能就足够了,但在那种情况下它至少需要在 i386 和 x86_64 上工作.

--史蒂夫

最佳答案

由于 static 是对 C 编译器的 promise ,即函数或变量是文件的本地变量,如果没有它也能获得相同的结果,编译器可以自由删除该代码。

这可能是内联函数调用。这可能意味着用常量替换变量。如果代码位于始终为假的 if 语句中,则该函数甚至可能不存在于编译结果中。

所有这些都意味着您无法可靠地将调用重定向到该函数。

如果使用新的 -lto 选项进行编译,情况会更糟,因为编译器可以自由地重新排序、删除或内联整个项目中的所有代码。

关于c - 是否可以覆盖目标模块(gcc、ld、x86、objcopy)中的静态函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9806282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com