使用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.so
and
编译时可以简单地对库名称进行重新排序b.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
问题内容: 我使用Windows Host上的RVDS编译器使用目标代码文件(C源代码)创建了一个共享库()。 我将此共享库与一个应用程序链接(用于Linux主机上的ARM目标)并获得一个可执行文件,该可执行文件在运行时会产生分段错误。(我知道我必须调试它!) 如果不创建共享库,而是创建具有相同源文件的静态库,然后与该应用程序链接,然后执行该应用程序,则可以正常运行。 所以我的问题是: 我是否需要
问题内容: 从共享库/ dll调用函数的最简单,最安全的方法是什么?我对在Linux上执行此操作最感兴趣,但是如果有一种与平台无关的方法会更好。 有人可以提供示例代码来显示如何在用户将自己的版本编译到共享库的情况下执行以下工作吗? 顺便说一句,我知道如何编译共享库(),我只需要知道一种在运行时加载它的简单方法。 问题答案: 注意: 您正在库调用周围传递C 对象(在这种情况下为STL字符串)。有 *
问题内容: 两个共享库liba.so和libb.so。liba.so使用libb.so。所有c文件都使用-fPIC编译。链接使用- shared。当我们在liba.so上调用dlopen时,它无法在libb.so中找到符号…我们得到“未定义符号”错误。我们可以dlopen libb.so没有错误。我们知道liba正在找到libb,因为我们没有得到文件未找到错误。删除libb.so时,出现文件未找到
我试图从一个位于vars下的新脚本中获取信息,该脚本是从共享库Jenkins类调用的,但出错了。 > 需要-全局配置文件。 目标-能够在共享库中获取全局值,而无需从Jenkins文件发送参数。 文件结构 变量/全局变量。棒极了 shared_library类 詹金斯档案 因此,我可以看到管道中第一次打印的值,但对于第二次打印,我得到: 类:src没有这样的属性:globals。组织。詹金斯。共享图
问题内容: 我正在制作瑞典语网站,瑞典语字母是å,ä和ö。 我需要创建一个用户输入的字符串,以使用PHP进行网址安全。 基本上,需要将所有字符都转换为下划线,除以下字符外: 并且所有瑞典语都应该这样转换: “å”到“ a”,“ä”到“ a”,“ö”到“ o”(只需删除上面的点)。 正如我所说,其余的应该成为下划线。 我不太擅长使用正则表达式,因此我非常感谢您的帮助! 谢谢 注意:不是URLENCO
问题内容: 我是Python和RegEx的初学者,我想知道如何制作一个带符号的字符串并将其替换为空格。任何帮助都很棒。 例如: 变成: 问题答案: 一种使用正则表达式的方式: 将匹配字母数字字符和下划线 将匹配任何 非 字母数字或下划线的内容