虽然在库中组合多个目标文件是很常见的,但是(至少在Linux中)可以将多个目标文件组合到另一个目标文件中.
(请参阅将两个GCC编译的.o对象文件合并到第三个.o文件中)
由于使用库而不仅仅是组合对象文件存在缺点:
1:链接时只使用一种类型的文件(对象)更容易,特别是如果所有文件都做同样的事情.
2:链接时(至少在GCC中),库(默认情况下)需要排序,不能处理循环依赖.
我想知道图书馆有什么优势(除了捕获22他们使用了很多).
在搜索了一段时间之后,我得到的唯一解释似乎是单个库比多个目标文件更好.
有没有办法找到在Linux中生成当前可执行文件的目标文件(RHEL是特定的).据我所知,可以使用"nm"查找导出的符号,"ldd"查找依赖的共享对象.
但是我找不到命令来查找由哪个可执行文件组成的对象(.o)文件的名称.可能吗?
我很好奇.obj文件:我几乎不知道它们是什么(或它们包含什么),所以我用Vim文本编辑器打开它们,我在里面发现的是一个外星人喜欢的语言......
有没有办法了解它们代表什么,它们的内容是什么?另外,它们被用于什么?
谢谢.
我知道编译时包含在可执行文件中的代码可以来自目标文件(.o文件)和静态链接库(.lib/.a文件).从根本上和概念上讲这两者之间的区别是什么?为什么"目标代码"和"静态链接库"之间存在不同的概念?各有哪些优点和缺点,为什么使用一个而不是另一个?静态链接库是否可以从目标文件中生成,反之亦然,是否可以从静态链接库中创建目标文件?
据我所知,目标文件中的指令和数据都有地址.第一个数据项从地址0开始,第一个指令也从地址0开始.
重定位表包含有关在文件中的地址更改时需要更新的指令的信息,例如,如果文件与另一个文件链接在一起.在下面的示例中,行A将位于重定位表中.我不认为B会在重定位表中,因为标签"相等"的地址是相对于B.这些正确的假设是什么?
我知道符号表显示文件的标签以及尚未解析的标签.但是符号表包含哪些其他信息?
此外,当汇编程序将指令转换为二进制时,那些具有未解析引用的指令中放置了什么?B在这个例子中.
.data
TEXT: .asciiz "Foo"
.text
.global main
main:
li t0, 1
beq t0, 1, equal #B
equal:
la a0, TEXT
jal printf #A
Run Code Online (Sandbox Code Playgroud) 我找不到翻译单元,编译单元,目标文件,可执行文件之间的区别......在很多地方我都看到过使用了一个而不是其他的.
我知道这些文件是在C++程序编译和链接期间生成的.任何人都可以列出在这些过程中生成的所有文件并指定它们之间的差异吗?
我有一个静态库libfoo.a,它只是多个.o文件的压缩。我正在寻找一种列出所有符号的方法
这样我就可以找出这个库的所有外部符号依赖项。
我在理解除 C 之外的编程语言的标准库是如何编写的有问题。
据我了解,C 标准库可以在 C 和汇编程序的混合中实现,其中需要汇编程序以便可以调用系统调用,因此可以使用 fopen、fscanf ...。
其他编程语言如何使用它们的标准库来完成这个功能(使用 i/o、文件、所有其他需要系统调用的东西)?它们是否都允许像 C 这样的汇编器内联,还是有其他方法?
我已经读过可以使用 C 及其标准库来实现其他语言库,但我不确定这是如何完成的。
编辑1. 试图更具体。
(实现标准库的语言称为new_lang。)
如果有人可以详细说明如何在对象代码级别和实现级别完成第二种方法(使用 C 运行时),因为我无法理解的是:
我试图尽可能笼统,但我不知道如何在不详细说明的情况下解释这个问题。
我在下面编写了简单的C程序(test.c): -
#include<stdio.h>
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并执行以下内容以了解.bss段中的大小更改.
gcc test.c -o test
size test
Run Code Online (Sandbox Code Playgroud)
输出结果如下: -
text data bss dec hex filename
1115 552 8 1675 68b test
Run Code Online (Sandbox Code Playgroud)
我没有声明全局或静态范围.所以请解释为什么bss段大小为8个字节.
我做了以下改变: -
#include<stdio.h>
int x; //declared global variable
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但令我惊讶的是,输出与以前相同: -
text data bss dec hex filename
1115 552 8 1675 68b test
Run Code Online (Sandbox Code Playgroud)
请解释.然后我初始化了全球: -
#include<stdio.h>
int x=67; //initialized global variable
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
数据段大小按预期增加,但我没想到bss段的大小会减少到4(相反,当没有声明任何内容时为8).请解释.
text data bss dec hex filename …Run Code Online (Sandbox Code Playgroud) object-files ×10
c ×4
c++ ×4
compilation ×3
executable ×2
linker ×2
assembly ×1
binaryfiles ×1
elf ×1
linkage ×1
linux ×1
objdump ×1
size ×1
static ×1
symbol-table ×1
windows ×1