我现在用的otool
,nm
和Fraise
文本编辑器拆解Mach-o
二进制文件.此时我的工作流程非常简单:
nm -g
Run Code Online (Sandbox Code Playgroud)
otool -vt
Run Code Online (Sandbox Code Playgroud)
我正在寻找简化使用disasm代码的工具Mac OS X
.
假设我们有一个名为libtest.so的共享库,其中有一个函数"foo"
使用条带丢弃libtest.so中的所有符号
$strip libtest.so
Run Code Online (Sandbox Code Playgroud)
所以,现在如果我们使用:
$nm libtest.so
Run Code Online (Sandbox Code Playgroud)
它会打印出来:
nm:libtest.so:没有符号
但如果我们使用:
$readelf -s libtest.so
Run Code Online (Sandbox Code Playgroud)
foo函数仍然可以从其结果中看出:
...
10:000005dc 5 FUNC GLOBAL DEFAULT 12 _Z3foov
...
我们也可以使用命令字符串来检查它:
$strings libtest.so
Run Code Online (Sandbox Code Playgroud)
...
_Z3foov
...
这是我的问题,为什么nm没有给条纹libtest.so带来任何结果?
谢谢
我长期以来一直使用cygwin的nm命令来满足我所有的.lib符号调试需求,但最近我想在SO答案中引用它并意识到大多数Windows开发人员都没有安装cygwin.
那么微软相当于什么是nm,即什么命令会列出.lib文件导出的符号,.lib中的未定义符号,等等?
好奇的是,这里有一个示例nm手册页.
我正在尝试让我的软件在 macOS 上可用,在我的工具链中,我使用该ldd -r MyModel.so
命令来验证一切是否顺利,但我确实无法在 macOS 上找到具有相同行为的等效命令。
otool
和nm
似乎是两个方向,但是他们的哪个选项提供了 的行为ldd -r
?还有其他工具可以用于此目的吗?
当我试图解决静态链接中的问题时,我_GLOBAL__sub_I_
在符号名称前面遇到了几个前缀.尽管我使用过,它仍然以那种形式出现nm --demangle(-C)
.
我偶然发现了这个答案(如何找到全局静态初始化).看看我的源代码,它确实看起来像一个全局静态变量的初始化.
我想知道的是,我在哪里可以获得有关__sub_和其他受损名称的更多信息__cxxabiv1
?
查看手册,objdump
并nm
具有重叠功能.
你什么时候使用每一个?每个命令的最初目的是什么?
我正在寻找tool
/ command
on Unix
平台来检测和文件的library
依赖关系..so
.o
我已经使用过ldd
/ nm
/ truss
,但我不知道检测库依赖关系的正确方法.
第三方提供了fooapp
使用共享对象的C++可执行文件libfoo.so
.该库还带有一个标题,foo.hpp
以便开发人员可以构建其他应用程序:
/* foo.hpp */
namespace foo {
void bar(int a, int b);
// More code below here <--- NOTE!!!
}
Run Code Online (Sandbox Code Playgroud)
这是一个LD_PRELOAD
基于标准的功能插入工作流程.
首先,我编写自己的库版本myfoo.cpp
,完全反映了以下部分 foo.hpp
:
/* myfoo.hpp */
# include <ofstream>
namespace foo {
void bar(int a, int b) {
std::cout << a << "," << b << std::endl;
}
// NOTHING below here <-- NOTE!!!
}
Run Code Online (Sandbox Code Playgroud)
然后我编译我的库libmyfoo.so
,看看以下内容:
$ nm libfoo.so -C | fgrep bar
0000000000021fc0 …
Run Code Online (Sandbox Code Playgroud) 我有两个文件37064544_p1.cpp
,37064544_p2.cpp
内容相同,如下所示:
int add(int x,int y)
{
return x+y;
}
Run Code Online (Sandbox Code Playgroud)
我用它们编译了它们
g++ -c 37064544_p2.cpp -o 37064544_p2.o
g++ -c 37064544_p2.cpp -o 37064544_p2.o
Run Code Online (Sandbox Code Playgroud)
并使用将它们添加到存档中
ar -rsc lib37064544pf.a 37064544_p1.o 37064544_p2.o
Run Code Online (Sandbox Code Playgroud)
和
$ nm -s lib37064544pf.a
Run Code Online (Sandbox Code Playgroud)
给我 :
Archive index:
_Z3addii in 37064544_p1.o
_Z3addii in 37064544_p2.o
37064544_p1.o:
0000000000000000 T _Z3addii
37064544_p2.o:
0000000000000000 T _Z3addii
Run Code Online (Sandbox Code Playgroud)
和
$ ar -t lib37064544pf.a
Run Code Online (Sandbox Code Playgroud)
给我
37064544_p1.o
37064544_p2.o
Run Code Online (Sandbox Code Playgroud)
我有一个驱动程序,它调用_Z3addii
编译的函数
g++ -static 37064544driver.cpp -o 37064544driver.elf -L. -l37064544pf
Run Code Online (Sandbox Code Playgroud)
结果是
Sum : 11
Run Code Online (Sandbox Code Playgroud)
问题
符号是如何_Z3addii
解决的?