C编程:重新定义共享库(.so)中定义的宏

C编程:重新定义共享库(.so)中定义的宏,c,C,我想覆盖共享库中定义的宏 例如: libxyz.so(共享库)具有 现在我编写一个代码,其中我希望“some_func()”使用的地址是(比如)0xabc36000 我是否可以在.c文件中重新定义ADDRESS宏,使其在some_func()中用作0xabc36000而不是0 据我所知,宏是在预处理阶段被替换的,而与共享库的链接将在稍后进行。我想知道是否有一种方法可以在不修改共享库代码的情况下执行此操作。是的,您可以重新定义宏 #ifdef ADDRESS #undef ADDRESS #end

我想覆盖共享库中定义的宏

例如:

libxyz.so(共享库)具有

现在我编写一个代码,其中我希望“some_func()”使用的地址是(比如)0xabc36000

我是否可以在.c文件中重新定义ADDRESS宏,使其在
some_func()
中用作0xabc36000而不是0


据我所知,宏是在预处理阶段被替换的,而与共享库的链接将在稍后进行。我想知道是否有一种方法可以在不修改共享库代码的情况下执行此操作。

是的,您可以重新定义宏

#ifdef ADDRESS
#undef ADDRESS
#endif

#define ADDRESS 0xabc36000

你在最后一段回答你自己的问题。只是要明确重申:不,这是不可能的。共享库没有预处理器符号(只有源代码才有)。因此,您可以从源代码重新编译共享库。您必须重写整个函数
某些函数func()
,其中包含对
func\u use\u addr()
的调用,并使用新地址作为参数。库中没有宏,因为它已编译。因此无需重新定义。使用正确的宏重新编译库,或者如果您想在重新编译后执行动态插入,请使用默认可见性(
\uuuuu属性)((\uuu可见性\uuuu(“默认”))
替换宏(如果您使用
-fvisibility=hidden
)。无法覆盖已完成共享库中的中间值。。。。但是,它不会对已经被预处理、编译和链接的共享对象做任何事情。
#ifdef ADDRESS
#undef ADDRESS
#endif

#define ADDRESS 0xabc36000