如何在没有运行操作系统的情况下自行运行程序?你能创建计算机可以在启动时加载和运行的汇编程序,例如从闪存驱动器启动计算机并运行cpu上的程序吗?
在我们的源文件中,我们通常有一个类似的版本字符串:
static const char srcvers[] = "VERSION/foo.c/1.01/09.04.15";
Run Code Online (Sandbox Code Playgroud)
当该字符串未被优化时,它在某些情况下非常有用,因为可以通过简单地调用来确定链接到可执行文件的每个源文件的版本strings a.out | grep VERSION.
不幸的是,它被 gcc优化(使用'-O').所以我的问题是,是否有一种简单的方法(编译器开关会很棒)使gcc保持该变量(其名称始终相同)而不关闭任何其他优化.
编辑
在我看来,这个问题与那个不同的是,我希望找到一个解决方案,我不必触及成千上万的源文件.
我有一个带有两个绝对符号的内核的链接描述文件:_kernel_start和_kernel_end.但是,我只收到链接器重定位错误_kernel_end:
In function `kernel::mem::mm::setup_memorymap':
/home/virtlink/kernel/src/mem/mm.rs:25:(.text._ZN3mem2mm15setup_memorymap):
relocation truncated to fit: R_X86_64_PC32 against symbol `_kernel_end'
defined in *ABS* section in ./kernel.bin
Run Code Online (Sandbox Code Playgroud)
这里有很多关于这个错误的问题,但我没有找到解决我特定问题的问题.
显然,这个:
_kernel_start = .;
Run Code Online (Sandbox Code Playgroud)
...被视为32位,而这:
. += KERNEL_BASE;
_kernel_end = . - KERNEL_BASE;
Run Code Online (Sandbox Code Playgroud)
...被视为64位.如果我将_kernel_end符号移动到. += KERNEL_BASE线上方,如下所示:
_kernel_end = .;
. += KERNEL_BASE;
Run Code Online (Sandbox Code Playgroud)
......然后再次运作.但我想_kernel_end在我的链接器脚本的末尾.
链接描述文件将引导代码放在内存开头,其余代码放在64位虚拟内存空间的上半部分.它看起来像这样:
OUTPUT_FORMAT(elf64-x86-64)
KERNEL_BASE = 0xFFFFFFFF80000000;
SECTIONS
{
/* Boot code at 1 MiB */
. = 1M;
_kernel_start = .;
.boot :
{
KEEP( *(.multiboot) …Run Code Online (Sandbox Code Playgroud)