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代码中使用的名称