如何直接生成可执行机器代码的c函数?

如何直接生成可执行机器代码的c函数?,c,gcc,compilation,C,Gcc,Compilation,我的文件是bootpack.c,其中有一个函数void f(){while(1);}。 我想直接生成可执行的机器代码。所以我把它编译成这样: gcc -c -nostdinc -fno-builtin bootpack.c ld -nostdlib file.o -o bootpack.bin 但是我发现bootpack.bin是3.84KB。它应该只有几个字节,我想,因为它只是一个循环。怎么了?以及如何正确生成此文件?因为它包含符号表信息,要减小可执行文件的大小,可以使用strip命令 将其

我的文件是bootpack.c,其中有一个函数
void f(){while(1);}
。 我想直接生成可执行的机器代码。所以我把它编译成这样:

gcc -c -nostdinc -fno-builtin bootpack.c
ld -nostdlib file.o -o bootpack.bin

但是我发现bootpack.bin是3.84KB。它应该只有几个字节,我想,因为它只是一个循环。怎么了?以及如何正确生成此文件?

因为它包含符号表信息,要减小可执行文件的大小,可以使用strip命令


将其用作“strip--strip all executable file name”,这样它将删除额外的信息,如符号表等。即使在gcc中可以使用-s选项,也可以使用gcc中的更多选项

您可以使用
二进制
作为GNU(基于BFD)链接器的输出格式:

然后,您可以使用以下方法拆解:

objdump -b binary -m i386 -D bootpack.bin

(用您的目标体系结构代替
i386
)。

您创建了一个对象文件,而不是一个可执行文件。额外的字节是链接器代码的描述。那么如何从目标文件生成可执行文件?谢谢,您需要在可执行文件中包含正确的描述信息,以便流程加载器可以找到程序启动的入口点。默认情况下,这是由链接器根据对象文件中的代码提供的,该文件的名称由编译器指定,如
crt0.o
。您必须告诉它您的替代入口点,以便系统知道程序将从何处开始运行。由于支持信息(ELF头和节),可执行文件仍将是几KB。正如您在windows7上所说的那样编译我的文件。但上面说:“ld:无法在非PE输出文件bootpack.bin上执行PE操作”好的,我尝试了这个,但bootpack.bin仍然是2KB,比我想象的大得多。
objdump -b binary -m i386 -D bootpack.bin