Articles of 符号

Linuxfunctionredirect

嘿,我试图包装一个函数在我的程序中,而不使用LD_PRELOAD。 我有两个具有相同签名的function: void someFunc () { puts ("someFunc"); } void someFunc_wrapper () { puts ("someFunc_wrapper"); } 我想通过调用包装函数将任何函数调用redirect到someFunc。 当然,我可以通过定义macros来实现,或者将包装函数放入共享库,然后像这样调用程序: LD_PRELOAD=./mylib.so my_program 但是,我想在运行时redirect函数调用,而不修改程序调用。 据我所知,应该可以通过在运行时修改可执行文件的符号表来redirect这些调用。 任何帮助将不胜感激 :)

连接共享库g ++时出现奇怪的符号

我有一个带有void initGui()函数的文件。 它做的东西。 我也有一个.so共享库与该文件。 问题是,当我尝试启动dlsym(…, "initGui") , dlerror()告诉我它没有find符号(当然,我用dlopen打开它)。 所以我试图nm我的共享库。 我“理解” _Z7initGuiiii可能是我正在寻找的。 所以我试着去尝试一下…然后它就起作用了。 请有人能告诉我如何在我的共享对象库中有干净的符号? 我用g++ -Wall -Wextra -Werror -c -fPIC编译。

linux命令“符号

在linux命令提示符(terminal)中,我意外地input了“符号,然后terminal打印出提示符”。 喜欢这个 gaian@gaian-lap057:~$ ' > 我想知道,这个符号(')代表什么,如果我们继续在(>)提示符上键入,会发生什么。 如果有人,请与我分享。

perl -p -i -e用包含符号的文本replace行

在Linux Vm中,我试图改变50+文件的第二行。 我已经成功地将下面的命令用于没有符号的string。 perl -p -i -e 's/.*/new_line / if $.==2' . 但是现在我试图使用这个命令添加新的string“#$ new_line $”: perl -p -i -e 's/.*/# $Header$ / if $.==2' . 但是得到以下错误: Final $ should be \$ or $name at -e line 1, within string syntax error at -e line 1, near "s/.*/# $Header$ /" Execution of -e aborted due to […]

C ++未定义的符号与静态库中的std :: string相关

我正在build立一个共享库,通过在C ++的Linux上链接一堆代码和一个静态库(.a)。 我有一个静态库中定义的方法。 当我使用nm -C打印该静态库中的符号时,显示为: Alembic::AbcCoreFactory::v9::IFactory::getArchive(std::string const&, Alembic::AbcCoreFactory::v9::IFactory::CoreType&) 输出.so文件(我正在构build的库)中没有定义该符号,但是当使用nm -uC列出未定义的符号时,它会显示: Alembic::AbcCoreFactory::v9::IFactory::getArchive(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, Alembic::AbcCoreFactory::v9::IFactory::CoreType&) 不同之处在于第一次使用std :: string const&而第二次使用std :: __ 1 :: basic_string,std :: __ 1 :: allocator> const& 我试图理解为什么它没有find符号。 不应该两者匹配,因为它们本质上是一样的吗? 对于上下文,我正在尝试编译一个Alembic Importer,它与Linux的虚幻编辑器4一起提供。 我试图链接的图书馆是alembic图书馆。

在单个bsub命令中应用Bourne shell背景&符号

我想将Bourne shell背景&符号作为ONE bsub执行命令的一部分。 请注意,我不想使用.bash文件,而是使用一个bsub命令行来执行整个过程。 请注意,我也不想将我的bsub内容分成几个相互等待的bsub命令,而是将一些内部的unix命令封装到一个单独的bsub命令行中,这些内部的unix命令使用Bourne shell后台&符号。 下面的尝试只产生了第一个内部命令(liftOver命令)的输出,但是没有sorting,也没有执行mv。 bsub -q medium -J $i "liftOver $i mm10ToMm9.over.chain.gz ${i/.bed/.mm9.bed} ${i/.bed/.unlifted_to_mm9.bed} & sort -k1,1 -k2,2n ${i/.bed/.mm9.bed} > ${i/.bed/.mm9.bed}.srt & mv ${i/.bed/.mm9.bed}.srt ${i/.bed/.mm9.bed}" 在bsub之外,这个过程可以写成如下: liftOver $i mm10ToMm9.over.chain.gz ${i/.bed/.mm9.bed} ${i/.bed/.unlifted_to_mm9.bed} & sort -k1,1 -k2,2n ${i/.bed/.mm9.bed} > ${i/.bed/.mm9.bed}.srt & mv ${i/.bed/.mm9.bed}.srt ${i/.bed/.mm9.bed}

将符号限制为适用于linux可执行文件的本地范围

任何人都可以请build议一些方法,我们可以限制我们的符号出口到全球符号表? 提前致谢 嗨, 感谢回复… 其实我有一个静态链接到第三方库的可执行文件说“ver1.a”,也使用第三方“.so”文件再次链接到相同的库,但不同的版本说“ver2.a”。 问题是执行这两个版本是不同的。 在开始时,加载可执行文件时,来自“ver1.a”的符号将被导出到全局符号表。 现在无论何时“.so”被加载,它将尝试引用ver2.a中的符号,它将最终引用之前加载的“ver1.a”中的符号,从而导致我们的二进制文件崩溃。 我们想到了一个解决scheme,我们不会将可执行文件的符号导出到全局符号表中,因此当“.so”被加载并尝试使用来自ver2.a的符号时,它不会在全局符号表中find它,并且将使用它自己的符号,即来自ver2.a的符号 我无法find任何方式,我可以限制符号导出到全局符号表。 我试着用–version脚本和保留 – 符号文件,但它没有奏效。 对于-fvisibility = hidden选项,它提供了一个错误,“-f选项只能与-shared一起使用”。 所以我想,这也像“ – 版本脚本”只适用于共享库不可执行的二进制文件。 代码在c ++,OS-Linux,gcc版本-3.2。 可能无法重新编译任何第三方库和“.so”。 所以排除了用bsymbolic标志重新编译“so”文件的选项。 任何帮助,将不胜感激。

通过DbgHelp获取来自PDB的类方法的访问说明符?

说我有一个简单的类如下所示: class Foo { public: Foo(){}; protected: int meth1( void ){return 0;}; public: int var1; }; 用MSVC编译并通过DbgHelp APIparsing相应的PDB,我可以迭代子节点,并很好地parsing出方法和variables,但是我无法弄清楚如何确定给定子节点的访问说明符。 我的代码看起来像这样: // The symbol tag for 'index' is a SymTagEnum::SymTagBaseClass DWORD item_count; if( !::SymGetTypeInfo( process, base_address, index, TI_GET_CHILDRENCOUNT, &item_count ) ) break; if( item_count > 0 ) { TI_FINDCHILDREN_PARAMS * item_indexs = new TI_FINDCHILDREN_PARAMS[item_count]; item_indexs->Count = item_count; […]

在交叉编译的.so文件中是否有检查符号的工具?

我有一个应用程序在启动时将.so文件作为插件加载,使用dlopen() 构build环境在x86硬件上运行,但是应用程序正在为另一个平台进行交叉编译。 如果可以(作为自动化构build过程的一部分)做一个检查,以确保没有任何未解决的符号在.so文件和应用程序的组合中,而不必实际部署应用程序,那将是非常好的。 在我写一个脚本来testing使用nm输出的符号之前,我想知道是否有人知道已经做到这一点的工具? 编辑1:稍微改变了描述 – 我不只是试图在.so中的符号,而是在几个.so的和应用程序本身的组合 – 即。 在应用程序加载完所有的.so之后,是否还会有未parsing的符号。 正如答案中所build议的(感谢Martin v。Löwis和tgamblin), nm将轻松识别单个文件中缺失的符号,但不容易识别哪个符号在其他已加载的模块中已经解决。

加载我自己的内核模块时出现未知符号

下面的代码(最后粘贴),大部分来自这里 ,是一个非常简单的内核模块,作为一个键盘logging器。 我可以得到它来编译和生成一个.ko就好了,但是当我尝试加载它时,我在dmesg中得到以下错误: [ 790.833828] keylogger: Unknown symbol unregister_keyboard_notifier (err 0) [ 790.833846] keylogger: Unknown symbol register_keyboard_notifier (err 0) 我没有从源代码构build内核,但是使用了archlinux提供的库内核。 但是,我确实安装了kernel-headers软件包来获取模块进行编译。 所以我的问题是:这两个符号真的没有在我的安装的内核中find? 如果他们是,他们为什么不正确地链接(?)? 我可以find符号存在的证据。 首先,我可以看到/proc/kallsyms的符号。 另外,当我做nm /usr/src/vmlinux我也可以看到这两个符号。 他们不一样吗? 模块代码: #include <linux/module.h> /* Needed by all modules */ #include <linux/keyboard.h> EXPORT_SYMBOL_NOVERS(unregister_keyboard_notifier); EXPORT_SYMBOL_NOVERS(register_keyboard_notifier); int hello_notify(struct notifier_block *nblock, unsigned long code, void *_param) { struct keyboard_notifier_param *param = […]