标签: nm

为什么/lib32/libc.so.6中有两个"fopen"符号?

nm -D /lib32/libc.so.6 | grep '\<fopen\>'
0005d0c0 T fopen
00109750 T fopen

readelf -s  /lib32/libc.so.6 | egrep '0005d0c0|00109750'
181: 0005d0c0    50 FUNC    GLOBAL DEFAULT   12 fopen@@GLIBC_2.1
182: 00109750   136 FUNC    GLOBAL DEFAULT   12 fopen@GLIBC_2.0
679: 0005d0c0    50 FUNC    GLOBAL DEFAULT   12 _IO_fopen@@GLIBC_2.1
680: 00109750   136 FUNC    GLOBAL DEFAULT   12 _IO_fopen@GLIBC_2.0
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

  1. 为什么/lib32/libc.so.6中有两个fopen符号?应禁止同一目标文件中的相同符号,对吗?

  2. 为什么readelf -s转出fopen @@ GLIBC_2.1和fopen@GLIBC_2.0而不是fopen?

谢谢

linux readelf nm

4
推荐指数
1
解决办法
817
查看次数

无法在二进制文件中找到.dtors和.ctors

我正在读"黑客"这本书.在这本书中有解释使用的部分.dtors.ctors.

我正在尝试重现本书的一个练习,但在我的可执行文件中,我没有这一部分.起初我认为问题是我正在编译64位,但现在我正在编译32位.dtors并且.ctors仍然没有出现在节表中.这是代码:

#include <stdio.h>
#include <stdlib.h>

static void
miConstructor(void) __attribute__ ((constructor));
static void
miDestructor(void) __attribute__ ((destructor));

int
main(void) {
printf("En main() \n");
return 0;
}

void
miConstructor(void) {
printf("En el constructor\n");
}

void
miDestructor(void) {
    printf("En el destructor\n");
}
Run Code Online (Sandbox Code Playgroud)

我正在编译:

 gcc -m32 -o a.out dtors_example.c
Run Code Online (Sandbox Code Playgroud)

这是nm的输出:

080495f0 d _DYNAMIC
080496e4 d _GLOBAL_OFFSET_TABLE_
080484dc R _IO_stdin_used
     w _ITM_deregisterTMCloneTable
     w _ITM_registerTMCloneTable
     w _Jv_RegisterClasses
080485d8 r __FRAME_END__
080495ec d __JCR_END__
080495ec d __JCR_LIST__
08049704 D …
Run Code Online (Sandbox Code Playgroud)

c constructor destructor objdump nm

4
推荐指数
1
解决办法
5040
查看次数

使用nm(1)列出OS X上为arm64构建的目标文件中的符号

有谁知道如何列出我为arm64架构构建的目标文件中的符号?

我尝试使用,nm但它给了我一个错误:

bfd_mach_o_scan: unknown architecture0x100000c/0x0 
File format not recognized
Run Code Online (Sandbox Code Playgroud)

是否可以使用相同的东西otool

macos otool ios nm arm64

4
推荐指数
1
解决办法
1011
查看次数

nm 实用程序输出中符号大小的输出格式是什么

我正在使用以下命令

nm -B -l -r --size-sort --print-size binaryName| grep ' B '
Run Code Online (Sandbox Code Playgroud)

示例输出:

00000000166140e0 0000000000aae608 B tax_dtl_buf
Run Code Online (Sandbox Code Playgroud)

00000000166140e0是符号的大小tax_dtl_buf

谁能解释如何解释这个尺寸?我的意思是如何将其转换为千字节。

c object nm

3
推荐指数
1
解决办法
2724
查看次数

功能地址在nm输出和gdb中不同

让我们只关注Rect_IsEmpty()功能.

nm命令为我提供了这个输出:

(...)    
00021af0 T Rect_IsEmpty
(...)
Run Code Online (Sandbox Code Playgroud)

另一方面,当我启动gdb并查看此功能的地址时,我得到:

(gdb) info address Rect_IsEmpty
Symbol "Rect_IsEmpty" is at 0x8057c84 in a file compiled without debugging.
Run Code Online (Sandbox Code Playgroud)

请问任何人解释为什么这些地址不一样?gdb从哪里获取此地址?

c linux gdb nm

3
推荐指数
1
解决办法
1391
查看次数

gcc:编译为BSS的线程局部变量

我是新手,在我的Ubuntu 14.04计算机上使用i686/32位架构测试线程本地存储(TLS)类gcc(版本4.8.2).

在尝试找出__thread关键字是否具有所需效果时,我使用gcc test.c(无错误或警告)编译此简约测试程序:

#include <stdio.h>

__thread int i;

int main() {
  i = 7;
  printf("%d\n",i);
}
Run Code Online (Sandbox Code Playgroud)

并使用该工具nm检查i目标代码中符号的存储类:

nm a.out | grep ' i'
Run Code Online (Sandbox Code Playgroud)

结果是

00000000 B i
Run Code Online (Sandbox Code Playgroud)

这意味着它i被视为一个共同的全局未初始化变量(存储在BSS部分).根据man nm,线程本地存储变量由字母表示L,而不是B.

这有什么不对?

这是一个nm问题还是一个真正的问题?

c multithreading gcc nm

3
推荐指数
1
解决办法
377
查看次数

如何在`nm`工具中搜索二进制.ipa中所有库的公共或私有API

今天我的应用被Apple拒绝,原因如下:

您的应用使用或引用了以下非公开API,这违反了App Store审核指南:

'setUploadFileURL:'

App Store中不允许使用非公共API,因为如果这些API发生更改,可能会导致糟糕的用户体验.

他们还为"nm工具"Xcode手册页提供了nm工具以及这个死链接.

好的,现在我开始搜索API setUploadFileURL但没找到.然后从otool我没有得到所有链接到应用程序的库

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/otool:无法打开文件:(没有这样的文件或目录)

然后对于该nm工具,我有死链接,不知道库将驻留在哪里!我有.ipa文件和Payload.

请有人帮忙吗?

itunes ios nm ipa

3
推荐指数
2
解决办法
2644
查看次数

如何从lib .so文件中查找功能?

我可以打印一个* .so文件的导出功能列表,例如

nm -C lib/libopencv_ml.so

然后找到我的功能

nm -C lib/libopencv_ml.so | grep myfunction

但是,当我想从所有.so文件中查找函数时,如何确定哪个.so包含我的函数?

这只是打印功能的所有条目,但我需要知道它从哪个.so文件中出现。

nm -C lib/*.so | grep cvSetZero

似乎-H选项也没有帮助。 -H, --with-filename print the file name for each match

nm -C lib/*.so | grep -Hn cvSetZero

生成如下输出:

(standard input):98:                 U cvSetZero
(standard input):796:                 U cvSetZero
(standard input):2564:00000000000b2540 T cvSetZero
(standard input):8673:                 U cvSetZero
(standard input):12233:                 U cvSetZero
(standard input):15503:                 U cvSetZero
(standard input):17460:                 U cvSetZero
(standard input):18727:                 U cvSetZero
(standard input):20865:                 U cvSetZero
Run Code Online (Sandbox Code Playgroud)

linux grep shared-libraries nm

3
推荐指数
1
解决办法
3595
查看次数

为什么 nm 隐藏 .o 文件中的 .rela.eh_frame 和 .rela.text ?

我试图nm在 C 中重新创建该命令的行为,尽管我成功获取了符号和部分的名称,但我发现我的版本中出现了一些额外的名称。

$> ./my_nm -a obj.o

0000000000000000 b .bss
0000000000000000 n .comment
0000000000000000 d .data
0000000000000000 r .eh_frame
0000000000000000 n .note.GNU-stack
0000000000000000 r .note.gnu.property
0000000000000000 d .rela.eh_frame
0000000000000000 d .rela.text
0000000000000000 t .text
                 U _GLOBAL_OFFSET_TABLE_
0000000000000000 T elf64_syms
0000000000000000 a elf64_syms.c
                 U malloc
Run Code Online (Sandbox Code Playgroud)

$> nm -a obj.o

0000000000000000 b .bss
0000000000000000 n .comment
0000000000000000 d .data
0000000000000000 r .eh_frame
0000000000000000 n .note.GNU-stack
0000000000000000 r .note.gnu.property
0000000000000000 t .text
                 U _GLOBAL_OFFSET_TABLE_
0000000000000000 T elf64_syms
0000000000000000 a elf64_syms.c
                 U …
Run Code Online (Sandbox Code Playgroud)

c elf relocation nm

3
推荐指数
1
解决办法
159
查看次数

什么是nm告诉我关于在Linux上使用gcc编译的程序中的vtable?

我将Base类更改为抽象(即我将其中一个方法设为纯虚拟)并重新编译它.当我将它与派生类链接时,链接器抱怨了vtable.我用nm调查了一些事情,但我不确定nm告诉我的是什么.我只是通过删除*.o文件并重新编译Derived类来解决问题,但我想了解这里的vtable究竟发生了什么.

我的原始代码是这样的:

Base.h

class Base {
    public:
       virtual void doSomething();
};
Run Code Online (Sandbox Code Playgroud)

Base.cpp

#include <iostream>
#include <Base.h>
void Base::doSomething() {
    std::cout << "Base::doSomething()" << "\n";
}
Run Code Online (Sandbox Code Playgroud)

Derived.h

#include <Base.h>
class Derived : public Base {
    public:
        Derived();
        void doSomething() override;
};
Run Code Online (Sandbox Code Playgroud)

Derived.cpp

#include <iostream>
#include <Derived.h>
Derived::Derived() {
    std::cout << "Derived::Derived() constructor" << "\n";
}
void Derived::doSomething() {
    std::cout << "Derived::doSomething()" << "\n";
}
Run Code Online (Sandbox Code Playgroud)

Makefile包含以下内容:

CXXFLAGS = -std=c++14 -pedantic -Wall -Werror -I ./

default: build
clean:
    rm -f proggy
    rm -f …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance gcc vtable nm

2
推荐指数
1
解决办法
763
查看次数

使用静态链接构建 libcurl 到 openssl

我正在尝试构建 libcurl 并静态链接到 openssl。为了实现这一点,我使用了以下配置:

\n\n

OpenSSL:

\n\n
LDFLAGS="-static\xe2\x80\x9d\nLIBS="-ldl\xe2\x80\x9d\n
Run Code Online (Sandbox Code Playgroud)\n\n

卷曲:

\n\n
LDFLAGS="-static\xe2\x80\x9d\nCPPFLAGS="-I$(CURDIR)/$(3RDPARTY_DIR)$(OPENSSL)/include   \nLDFLAGS="-L$(CURDIR)/$(3RDPARTY_DIR)$(OPENSSL)"\n./configure --disable-shared --without-zlib --without-libidn --without-librtmp --disable-ldap \xe2\x80\x94-with-ssl=<path where my openssl is installed>\n
Run Code Online (Sandbox Code Playgroud)\n\n

有了这个,我将生成 libcurl.a 并将其链接到我的代码,在其中我能够根据我的需要成功处理 HTTPS 连接。

\n\n

但出于学习目的,我想知道 SSL 符号是否实际集成到 libcurl 中。\n因此,我尝试使用nm命令:

\n\n
nm -A libcurl.a | grep \xe2\x80\x9cSSL_"\n
Run Code Online (Sandbox Code Playgroud)\n\n

但它显示所有 SSL 符号为未定义。例如,

\n\n
U SSL_connect\nU SSL_ctrl\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么这是否意味着 libssl.a 和 libcrypto.a 中的符号实际上并未集成到 libcurl 中?

\n\n

如果是,可以采取什么措施将它们实际集成到 libcurl.a 中?

\n\n

感谢任何帮助我理解这一点的帮助。

\n

openssl libcurl static-linking nm

2
推荐指数
1
解决办法
5696
查看次数

如何阅读 nm 命令: nm 选项 -T 和 -U(未定义)是什么意思?

我怀疑来自“libsimint.a”的链接错误。

Linker messages (if any) follow...
/home/.../simint/lib/libsimint.a(shell.c.o): In function `simint_copy_shell':
shell.c:(.text+0x126): undefined reference to `__intel_ssse3_rep_memcpy'
/home/.../simint/lib/libsimint.a(shell.c.o): In function`simint_normalize_shells':
shell.c:(.text+0x4e3): undefined reference to `__svml_pow4'
Run Code Online (Sandbox Code Playgroud)

我尝试了 nm 命令来弄清楚:

>> nm libsimint.a |grep __intel_ssse3_rep_memcpy
U __intel_ssse3_rep_memcpy

>> nm libsimint.a |grep simint_copy_shell
0000000000000090 T simint_copy_shell
Run Code Online (Sandbox Code Playgroud)

根据我上面的理解(在 nm man 的帮助下),代码中提到了 simint_copy_shell 函数,但 __intel_ssse3_rep_memcpy 没有在我们的 libsimint 编译的其他一些库中定义。任何人都可以验证这一点或添加任何说明吗?谢谢

(我正在使用 gcc 编译和链接一个大代码,但它是用 icpc 编译的。)

c++ linker gcc hpc nm

1
推荐指数
1
解决办法
2580
查看次数