标签: object-files

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

C/C++.库对组合对象文件的优势

虽然在库中组合多个目标文件是很常见的,但是(至少在Linux中)可以将多个目标文件组合到另一个目标文件中.

(请参阅将两个GCC编译的.o对象文件合并到第三个.o文件中)

由于使用库而不仅仅是组合对象文件存在缺点:

1:链接时只使用一种类型的文件(对象)更容易,特别是如果所有文件都做同样的事情.

2:链接时(至少在GCC中),库(默认情况下)需要排序,不能处理循环依赖.

我想知道图书馆有什么优势(除了捕获22他们使用了很多).

在搜索了一段时间之后,我得到的唯一解释似乎是单个库比多个目标文件更好.

c c++ linker object-files

9
推荐指数
2
解决办法
2343
查看次数

Linux中可执行文件中的对象文件

有没有办法找到在Linux中生成当前可执行文件的目标文件(RHEL是特定的).据我所知,可以使用"nm"查找导出的符号,"ldd"查找依赖的共享对象.

但是我找不到命令来查找由哪个可执行文件组成的对象(.o)文件的名称.可能吗?

linux executable object-files

8
推荐指数
2
解决办法
3823
查看次数

可以读取目标文件吗?

我很好奇.obj文件:我几乎不知道它们是什么(或它们包含什么),所以我用Vim文本编辑器打开它们,我在里面发现的是一个外星人喜欢的语言......

有没有办法了解它们代表什么,它们的内容是什么?另外,它们被用于什么?

谢谢.

c++ windows compiler-construction compilation object-files

8
推荐指数
3
解决办法
9989
查看次数

C/C++:静态链接库和目标文件有什么区别?

我知道编译时包含在可执行文件中的代码可以来自目标文件(.o文件)和静态链接库(.lib/.a文件).从根本上和概念上讲这两者之间的区别是什么?为什么"目标代码"和"静态链接库"之间存在不同的概念?各有哪些优点和缺点,为什么使用一个而不是另一个?静态链接库是否可以从目标文件中生成,反之亦然,是否可以从静态链接库中创建目标文件?

c c++ static linkage object-files

8
推荐指数
2
解决办法
1595
查看次数

目标文件中的符号表和重定位表

据我所知,目标文件中的指令和数据都有地址.第一个数据项从地址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)

assembly compilation object-files symbol-table

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

翻译单元vs编译单元vs目标文件vs可执行vs ....在C++中

我找不到翻译单元,编译单元,目标文件,可执行文件之间的区别......在很多地方我都看到过使用了一个而不是其他的.

我知道这些文件是在C++程序编译和链接期间生成的.任何人都可以列出在这些过程中生成的所有文件并指定它们之间的差异吗?

c++ executable compilation object-files translation-unit

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

如何在 Linux 上列出静态库的所有外部未定义符号?

我有一个静态库libfoo.a,它只是多个.o文件的压缩。我正在寻找一种列出所有符号的方法

  • 在静态库中显示为 UND
  • 在这个静态库中没有定义

这样我就可以找出这个库的所有外部符号依赖项。

binaryfiles elf static-libraries object-files

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

编程语言的标准库是如何实现的?

我在理解除 C 之外的编程语言的标准库是如何编写的有问题。

据我了解,C 标准库可以在 C 和汇编程序的混合中实现,其中需要汇编程序以便可以调用系统调用,因此可以使用 fopen、fscanf ...。

其他编程语言如何使用它们的标准库来完成这个功能(使用 i/o、文件、所有其他需要系统调用的东西)?它们是否都允许像 C 这样的汇编器内联,还是有其他方法?

我已经读过可以使用 C 及其标准库来实现其他语言库,但我不确定这是如何完成的。

编辑1. 试图更具体。
(实现标准库的语言称为new_lang。)

如果有人可以详细说明如何在对象代码级别和实现级别完成第二种方法(使用 C 运行时),因为我无法理解的是:

  1. C 运行时是使用 C 语法还是 new_lang 语法调用的?我们如何从 new_lang 库中的某个地方调用 ssize_t write(int fd, const void *buf, size_t count) ?
  2. 如果 new_lang 没有指针作为数据类型会发生什么,第二个参数const void *buf to write是如何从 new_lang 传递的?如果 new_lang没有 C 数据类型,它如何跟随C 运行时 api
  3. 如果 new_lang 库中的某个函数调用 C 运行时,是否意味着它必须遵守其abi?整数类型的数据大小,char,必须在 new_lang 和 C 中匹配给定平台(以及由 abi 指定的其他内容,参数是通过堆栈还是寄存器等传递)?
    这不是有点过度限制,例如,如果 new_lang 需要为 char 保留更多字节怎么办?

我试图尽可能笼统,但我不知道如何在不详细说明的情况下解释这个问题。

language-agnostic compiler-construction linker object-files

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

C程序中.bss段的模糊行为

我在下面编写了简单的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)

c size global-variables objdump object-files

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