【发布时间】:2018-12-12 07:28:08
【问题描述】:
我想让 gcc 为我将 c 代码编译成 x86-32 linux 二进制代码,但周围没有任何库。 我只想在开始时指定一个地址,它应该假设它已经在那里加载。然后,我将手动从输出中构建一个 elf 文件并设置所有内容。
我知道如何使用 NASM 做这样的事情,但我有一些更复杂的想法,我不想只使用汇编程序。我不需要任何库,我将使用带有内联 asm 的纯系统调用。我也不在乎它是否会失去一些便携性。
我试了一下,但找不到办法。 有人不仅可以为我提供正确的设置,还可以提供一些关于编译和链接器参数的背景信息吗? 我尝试搜索 gcc 手册,但发现它非常混乱。
【问题讨论】:
-
gcc -c编译 + 汇编但不链接。但听起来你真正需要的是一个链接器脚本来生成一个平面二进制文件而不是一个 ELF 可执行文件。或objcopy将链接的可执行文件的一部分复制到平面二进制文件。 -
我尝试了 objcopy,但它只是给了我一些虚假信息。我什至无法从 objcopy 给我的文件中的输出文件中找到操作码。另外,我需要地址匹配,或者只有位置无关的代码。所以是的,听起来我确实需要一些方法来告诉链接器我想要什么
-
存在链接器脚本来告诉链接器您想要什么。请参阅wiki.osdev.org/Bare_Bones#Linking_the_Kernel,或链接器脚本的许多 Stack Overflow 答案。如果您不想完全使用 PIC,那么是的,您需要将代码链接到静态可执行文件中。