如何轻松找出ELF格式的Linux二进制文件的直接共享对象依赖项?
我知道ldd工具,但似乎输出了二进制文件的所有依赖项,包括二进制文件所依赖的任何共享对象的依赖项.
如何使用当前版本,
使用正确版本的依赖项,而不是使用包管理器(如yum,rpm,apt,dpkg),而不是使用共享库,逐个安装GCC(GNU编译器集合)?
典型的开发人员可能希望以典型的方式安装GCC,使用您的包管理器(yum,rpm,apt,dpkg,port,brew等)或按照此处的说明进行操作(http://gcc.gnu.org/wiki/ InstallingGCC).
我的问题是如何一块一块地安装GCC,没有共享库.
GCC取决于:
编译器生成的最终图像包含bin文件和扩展加载器格式ELf文件,两者之间有什么区别,尤其是ELF文件的实用程序.
有没有人知道如何使用GCC将任何资源文件静态编译到可执行文件或共享库文件中?
例如,我想添加永远不会改变的图像文件(如果他们这样做,我不得不替换文件),并且不希望它们在文件系统中存在.
如果这是可能的(我认为这是因为Visual C++ for Windows也可以这样做),我如何加载存储在自己的二进制文件中的文件?可执行文件是否解析自身,找到文件并从中提取数据?
也许GCC有一个选项,我还没有见过.使用搜索引擎并没有真正吐出正确的东西.
我需要这个用于共享库和普通的ELF可执行文件.
任何帮助表示赞赏
我有一个旧的可执行文件,它被安排在废料堆中,但它还没有.它依赖于从我的环境中删除的一些库,但我在某些地方工作正常.我想将此可执行文件指向这些存根库.是的,我可以设置LD_LIBRARY_PATH,但是这个可执行文件是从许多脚本中调用的,很多用户和我都喜欢在一个地方修复它.
我没有这方面的来源,并且很难得到它.我在想 - 我可以使用ELF识别编辑器编辑这个文件,并在rpath中添加一个简单的PATH以使其命中新的库吗?这是可能的,或者一旦你创建了一个ELF二进制文件,你就把东西固定到位置并且它们不能移动?
我正在为学校开展一个nodejs项目.我无法用npm安装bcrypt所以我安装了bcrypt-nodejs并且该项目昨天工作正常.但今天,当我做"节点应用程序"时,我有这个错误:
/.../node_modules/bcrypt/node_modules/bindings/bindings.js:79
throw e
^
Error: /.../node_modules/bcrypt/build/Release/bcrypt_lib.node: invalid ELF header
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at bindings (/.../node_modules/bcrypt/node_modules/bindings/bindings.js:74:15)
at Object.<anonymous> (/.../node_modules/bcrypt/bcrypt.js:1:97)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
at require (module.js:380:17)
Run Code Online (Sandbox Code Playgroud)
我的package.json文件如下所示:
{
"name": "Supinfarm",
"version": "0.0.0",
"env": {
"PYTHON": "/usr/bin/python2.6"
},
"dependencies": {
"express": "3.1.0",
"connect-flash": "*",
"jade": "*",
"stylus": "*",
"passport": "*",
"passport-local": "*",
"mongoose": "*",
"bcrypt": "*"
}
}
Run Code Online (Sandbox Code Playgroud)
我在Linux上ubuntu 10.04 LTS我试图在google上找到解决方案但没有成功......有人可以帮助我吗?
我的系统上安装了二进制文件,并希望查看给定函数的反汇编.优选使用objdump
,但其他解决方案也是可以接受的.
从这些问题我已经了解到,如果我只知道边界地址,我可能能够反汇编部分代码.从这个答案我已经学会了如何将我的拆分调试符号转换回单个文件.
但即使在单个文件上运行,甚至反汇编所有代码(即没有启动或停止地址,但只是简单的-d
参数objdump
),我仍然没有在任何地方看到该符号.这是有道理的,因为有问题的函数是静态的,所以它不会被导出.然而,valgrind
将报告函数名称,因此它必须存储在某处.
查看调试部分的详细信息,我找到了本.debug_str
节中提到的名称,但我不知道可以将其转换为地址范围的工具.
我正在尝试为两个不同的Linux环境构建一个简单的C程序.在一个设备上程序运行正常,在另一个设备上程序生成浮点异常.该程序什么都不做,但从main返回0,这让我相信可能与启动代码ABI有一些不兼容?
该程序使用gcc编译,具有以下构建规范:
使用内置规格.目标:i386-redhat-linux配置:../ configure --prefix =/usr --mandir =/usr/share/man --infodir =/usr/share/info --enable-shared --enable-threads = posix --enable-checking = release --with-system-zlib --enable -__ cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages = c,c ++,objc,obj-c ++ ,java,fortran,ada --enable-java-awt = gtk --disable-dssi --disable-plugin --with-java-home =/usr/lib/jvm/java-1.4.2-gcj-1.4. 2.0/jre --with-cpu = generic --host = i386-redhat-linux线程模型:posix gcc版本4.1.2 20080704(Red Hat 4.1.2-52)
程序源如下:
int main()
{
return(0);
}
Run Code Online (Sandbox Code Playgroud)
在Celeron设备上,该程序在GDB下生成以下内容:
[root@n00200C30AA2F jrn]# /jrn/gdb fail GNU gdb Red Hat Linux (5.3post-0.20021129.18rh) (gdb) run Starting program: /jrn/fail
Program received signal SIGFPE, Arithmetic exception. 0x40001cce in ?? () (gdb) …
Run Code Online (Sandbox Code Playgroud) 我想检索用于编译给定可执行文件的GCC版本.我试过readelf
但没有得到这些信息.有什么想法吗?
我一直在使用objdump
Linux ELF二进制文件中的汇编代码.
有时会通过存储在rodata
(只读数据)部分中的跳转表进行间接跳转.
如何获取objdump
或任何其他工具向我显示此数据部分的内容?
我可以执行程序并检查调试器中的相关地址,但我不想这样做,因为它必须以交互方式完成.
理想的答案将确定一个工具,不仅可以向我显示内容,还可以让我控制显示格式od
.