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)
这是我的问题:
为什么/lib32/libc.so.6中有两个fopen符号?应禁止同一目标文件中的相同符号,对吗?
为什么readelf -s转出fopen @@ GLIBC_2.1和fopen@GLIBC_2.0而不是fopen?
谢谢
我正在读"黑客"这本书.在这本书中有解释使用的部分.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) 有谁知道如何列出我为arm64架构构建的目标文件中的符号?
我尝试使用,nm但它给了我一个错误:
bfd_mach_o_scan: unknown architecture0x100000c/0x0
File format not recognized
Run Code Online (Sandbox Code Playgroud)
是否可以使用相同的东西otool?
我正在使用以下命令
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。
谁能解释如何解释这个尺寸?我的意思是如何将其转换为千字节。
让我们只关注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从哪里获取此地址?
我是新手,在我的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问题还是一个真正的问题?
今天我的应用被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.
请有人帮忙吗?
我可以打印一个* .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) 我试图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) 我将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) 我正在尝试构建 libcurl 并静态链接到 openssl。为了实现这一点,我使用了以下配置:
\n\nOpenSSL:
\n\nLDFLAGS="-static\xe2\x80\x9d\nLIBS="-ldl\xe2\x80\x9d\nRun Code Online (Sandbox Code Playgroud)\n\n卷曲:
\n\nLDFLAGS="-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>\nRun Code Online (Sandbox Code Playgroud)\n\n有了这个,我将生成 libcurl.a 并将其链接到我的代码,在其中我能够根据我的需要成功处理 HTTPS 连接。
\n\n但出于学习目的,我想知道 SSL 符号是否实际集成到 libcurl 中。\n因此,我尝试使用nm命令:
nm -A libcurl.a | grep \xe2\x80\x9cSSL_"\nRun Code Online (Sandbox Code Playgroud)\n\n但它显示所有 SSL 符号为未定义。例如,
\n\nU SSL_connect\nU SSL_ctrl\nRun Code Online (Sandbox Code Playgroud)\n\n那么这是否意味着 libssl.a 和 libcrypto.a 中的符号实际上并未集成到 libcurl 中?
\n\n如果是,可以采取什么措施将它们实际集成到 libcurl.a 中?
\n\n感谢任何帮助我理解这一点的帮助。
\n我怀疑来自“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 编译的。)