我已经在汇编中创建了一个非常小的应用程序。它将某些寄存器设置为0并进行乘法。没什么。
但是,gcc向我不需要的机器代码中添加了很多东西。
我在objdump中找到的东西的一小列:
我知道我不需要它们,但是我不知道如何告诉编译器停止包含它们。我尝试使用优化选项,但这并没有改变任何内容。
我基本上像这样编译它:GCC -o ./main.elf ./main.S
非常感谢您的帮助!
GCC自动链接C / C ++运行时启动crt0.o和标准库。您可以提供自己的启动代码以覆盖默认值,并提供命令行选项以强制其不链接标准库。
控制启动和默认库的选项包括:
-nostartfiles
-nostdlib
-nodefaultlubs
-nolibc
每个都以不同的方式影响链接,但是在这种情况下-nostdlib
将同时排除crt0.o和标准库。当然,如果您的代码未引用标准库,则在任何情况下都不会链接任何内容,但是如果某些内容确实引用了它,则明确地将其排除会产生链接错误。
参见:https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html
[请注意,如果您的代码未建立有效的C运行时环境,例如提供了静态初始化和堆栈(最低要求),则某些C代码可能无法按预期的方式运行。如果您没有使用与crt0相同的默认入口点,则可能还需要通过--entry=entry
指定入口点。