Gcc 如何用g+覆盖入口点,如u libc_start_main+;
我们希望在用户的主函数之前插入一些函数,并发现Gcc 如何用g+覆盖入口点,如u libc_start_main+;,gcc,g++,Gcc,G++,我们希望在用户的主函数之前插入一些函数,并发现LD\u PRELOAD覆盖。\u libc\u start\u main适用于带有gcc的C程序 但是,它不适用于默认情况下可能使用g++的cpp文件。我们抛弃了这个符号,发现了gcc和g++二进制文件之间的差异。使用g++编译后,libc start main函数被重命名,我们不知道如何重写它 我可以使用\uuuuu属性(构造函数))而不是覆盖\uuuu libc\u start\u main在主函数之前添加逻辑 这可能是g++和gcc之间实现的
LD\u PRELOAD
覆盖。\u libc\u start\u main
适用于带有gcc
的C程序
但是,它不适用于默认情况下可能使用g++的cpp文件。我们抛弃了这个符号,发现了gcc和g++二进制文件之间的差异。使用g++
编译后,libc start main函数被重命名,我们不知道如何重写它
我可以使用
\uuuuu属性(构造函数))
而不是覆盖\uuuu libc\u start\u main
在主函数之前添加逻辑
这可能是g++
和gcc
之间实现的不同,我们可能不会用g++
的当前实现覆盖它。如果我错了,请评论并通知我 < P>这是C++使用的名字命名方案。
要绕过损坏,请在函数定义上使用extern“C”
,或使用extern“C”
块:
void no_extern_c(int, int) {}
extern "C"
void with_extern_c(int, int) {}
$ nm -D demo.so
...
00000000000005b7 T with_extern_c
00000000000005aa T _Z11no_extern_cii
通常,您使用它来声明作为C API一部分的函数,但同样的原因是为什么需要它(或者至少是它的一部分),也就是说,损坏的名称也是您必须从C代码中使用的名称