静态链接到newlib的程序无法在xv6

时间:2016-03-12 15:03:11

标签: c xv6 newlib

在xv6中运行newlib链接程序时遇到了一些问题。 (This是我使用的newlib端口)

我使用this toolchain来编译newlib。编译时没有任何问题,我会得到libc.a,libm.a和其他库文件。

然后我写了一个hello world程序并将其静态链接到newlib。该计划就像这样:

#include <stdio.h>

int main()
{   printf("hello world\n");
    return 0;
}

但是生成的可执行文件对于xv6文件系统来说太大了(这是设计的限制),所以我剥离了它。剥离后文件大小为53k,现在可以将其放入fs。

当我跑步&#34;制作qemu&#34;我能够进入系统,其他程序工作正常。但是,当我运行我的测试程序时,它会停留几秒钟,然后它会说“恐慌:loaduvm:addr必须是页面对齐的”#34;。是因为我剥离了我的程序,还是有补丁或修改我必须应用于xv6源代码,或其他一些原因?

P.S。我从它的正式Github repo中使用了最新版本的xv6,下面是我用来编译测试程序的标志:

cc -fno-pic -static -fno-strict-aliasing -fvar-tracking -fvar-tracking-assignments -static-libgcc -nostartfiles -nostdlib -ffreestanding -nodefaultlibs -fno-builtin -m32 -Wall -MD -gdwarf-2 -fno-omit-frame-pointer -fno-stack-protector -I../include/newlib -o build/_test test.c -L../lib/newlib/ -L../lib/libnosys -e main -Ttext 0 -lc -lm -lnosys

1 个答案:

答案 0 :(得分:1)

问题已经解决了。我忘记在与GCC链接时添加“-N”参数。

根据我的理解,“ - N”和“-Ttext 0”标志都会使编译后的程序在加载到内存中时保持4k对齐,这是xv6所需的。