gpt4 book ai didi

c - 如何从共享对象中删除符号?

转载 作者:IT王子 更新时间:2023-10-29 00:05:08 26 4
gpt4 key购买 nike

使用 GCC,如何在创建共享对象后从共享对象中删除符号?如果我在 C 中有三个文件操作符号 foo()喜欢:

// a.c
int foo() { return 0xdead; }
int baz() { return 1; }

// b.c
int foo() { return 0xbeef; }
int bar() { return 0; }

// c.c
#include "stdio.h"
extern int foo();
extern int bar();
extern int baz();
int main() { printf("0x%x, 0x%x, 0x%x\n",foo(),bar(),baz()); return 0; }

然后我编译并运行如下:

% gcc a.c --shared -fPIC -o a.so
% gcc b.c --shared -fPIC -o b.so
% setenv LD_LIBRARY_PATH . # export LD_LIBRARY_PATH=. for bash systems
% gcc c.c a.so b.so -o c
% ./c
0xdead, 0x0, 0x1

我怎样才能做到a.so不再有符号 foo()在我创建 a.so 之后?我想要 foo()b.so 中定义用来代替 a.so 通过删除 foo()来自 a.so 的符号。在foo()之后从 a.so 中删除, 重新运行 c应该生成打印输出:

0xbeef, 0x0, 0x1

在这个玩具示例中,我知道我可以在编译 c.c 时简单地重新排序库名称。与 a.sob.so , 但我怎样才能真正从 a.so 中删除符号?我想在删除 foo() 之后来自 a.so , nm 的这个 grep输出不会产生任何结果:

nm -a a.so | grep foo

而现在它返回:

000000000000063c T foo

最佳答案

您应该能够使用 objcopy-N (--strip-symbol) 选项实现你想要的:

$ objcopy -N foo a.so

关于c - 如何从共享对象中删除符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9909528/

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