我正在研究一个C++程序,来自一个1200行文件(初始化一个相当复杂的状态机)的编译对象代码几乎达到了一兆字节.什么可以使文件这么大?有没有办法找到目标文件中需要空间的内容?
我已经尝试了这个,我用文本编辑器打开了一个a.out文件,但是我只得到了一堆带有一些指令的字符,如:
UU
binary executable reverse-engineering machine-code object-files
这可能是一个愚蠢的问题,但如果我在Linux的一个发行版上使用g ++编译共享库,然后将这些库作为目标文件通过闪存驱动器移动到具有完全相同的Linux发行版和g ++版本的另一台计算机,我仍然会能够在第二台机器上的源文件中链接这些库吗?
我问,因为我没有权限在第二台机器上编译之前安装必要的库,所以我更容易在我自己的计算机上编译它们并通过闪存驱动器上传编译的目标文件第二台机器
如何查看哪些 .o 文件构成 .so 文件?
表示如何注意用于从 .so 文件构建 .so 文件的目标文件是什么(如果我只有 .so 文件)
在我的objdump -t输出中,我看到以下两行:
00000000000004d2 l F .text.unlikely 00000000000000ec function-signature-goes-here [clone .cold.427]
Run Code Online (Sandbox Code Playgroud)
和
00000000000018e0 g F .text 0000000000000690 function-signature-goes-here
Run Code Online (Sandbox Code Playgroud)
我知道l意味着本地,也g意味着全球。我还知道这.text是目标文件中的一个部分或一种类型的部分,包含已编译的程序指令。但什么是.text.unlikely?假设它是一个不同的部分(或部分类型).text- 有什么区别?
目前,一个项目中的链接器在链接到另一个项目中的源文件生成的目标文件时出现问题.有没有办法手动将这些目标文件添加到Qt?
在 C 语言中很容易得到函数的起始地址,但不能得到它的大小。因此,我目前正在目标文件上执行“nm”,以便找到我的函数,然后找到下一个函数的起始地址。我需要执行“nm”,因为编译器可以(在我的情况下实际上可以)重新排序函数,因此源顺序可以与对象顺序不同。
我想知道是否还有其他方法可以做到这一点。例如,指示编译器保留目标文件中的源代码顺序等。也许有一些 ELF 魔法?
我的编译器是 GCC、CLANG 和 Sun Studio。平台:Solaris 及其衍生产品、MacOSX、FreeBSD。未来要拓展。
c compiler-construction elf compiler-optimization object-files
我想知道在编译C++程序时,.o或.so文件中存储的确切内容. 这篇文章给出了编译过程的一个相当不错的概述,并在其.o文件的功能,而据我了解,从这个帖子,u和.so文件只是多个.o文件合并成一个单一的文件,以静态(.a)或动态(.so)方式链接.
但我想检查一下我是否正确理解了这样一个文件中存储的内容.编译以下代码后
void f();
void f2(int);
const int X = 25;
void g() {
f();
f2(X);
}
void h() {
g();
}
Run Code Online (Sandbox Code Playgroud)
我希望在.o文件中找到以下项目:
g(),包含一些占位符地址f()和f2(int)调用的位置.h(),没有占位符X,这只是数字25g(),h()并且X可以找到f()和f2(int),其必须在链接期间得到解决.然后一个程序nm会列出两个表中的所有符号名称.
我想编译器可以f2(X)通过调用f2(25)来优化调用,但它仍然需要将符号X保留在.o文件中,因为无法知道它是否将从不同的.o文件中使用.
那会是正确的吗?.a和.so文件是否相同?
谢谢你的帮助!
我的操作系统是Windows 10.我这次使用命令提示符进行编译.
根据我正在阅读的书,要编译所有源文件并使其成为目标文件,(在当前目录中)通过键入以下命令来完成:
gcc -c *.c
Run Code Online (Sandbox Code Playgroud)
它说操作系统将用所有C文件名替换*.c
但为什么我会收到此错误?
gcc: error: *.c: Invalid argument
gcc: fatal error: no input files
compilation terminated.
Run Code Online (Sandbox Code Playgroud)
我在正确的目录中.当我使用各自的名称编译我的源文件时,它正常工作.但'*.c'无效.
使用'*.o'链接目标文件时出现同样的错误
该命令不适用于Windows操作系统吗?如果没有,什么是Windows?
新手在这里.
我知道callq指令的作用;在这个答案中有描述。指令应该有一个参数,它应该是被调用函数的地址。
但是,在反汇编目标文件时,我看到以下行显示了一条callq具有两个值而不是一个参数的指令:
1e: e8 00 00 00 00 callq 23 <main+0x19>
Run Code Online (Sandbox Code Playgroud)
我假设这23是返回地址,<main+0x19>是要调用的函数的地址。但是,被调用的函数并不位于 address main+0x19。
什么是这两个值的含义23,并main+0x19在拆卸的显示callq指令?
原始 C 代码:
#include <stdio.h>
void fun(int a)
{
}
int main()
{
int a = 1234;
fun(a);
}
Run Code Online (Sandbox Code Playgroud)
objdump -D main.o main.asm 反汇编代码:
0000000000000000 <fun>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 89 7d fc mov %edi,-0x4(%rbp)
7: 90 nop
8: 5d pop …Run Code Online (Sandbox Code Playgroud) object-files ×10
c ×3
c++ ×3
compilation ×2
elf ×2
linux ×2
archive-file ×1
assembly ×1
binary ×1
disassembly ×1
executable ×1
filesize ×1
flash ×1
g++ ×1
gcc ×1
linker ×1
machine-code ×1
objdump ×1
qt ×1
symbols ×1
wildcard ×1
windows ×1
x86-64 ×1