静态链接到 newlib 的程序在 xv6 中无法 运行
Program statically linked to newlib failed to run in xv6
我在 xv6 中 运行ning 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中了。
当我 运行 "make qemu" 我能够进入系统时,其他程序工作正常。但是当我 运行 我的测试程序时,它卡住了几秒钟然后显示 "panic: loaduvm: addr must be page aligned"。是因为我剥离了我的程序,还是我必须对xv6源代码应用补丁或修改,或者其他一些原因?
P.S。我使用的是官方 Github 存储库中的 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
问题已解决。我在与 GCC 链接时忘记添加“-N”参数。
根据我的理解,“-N”和“-Ttext 0”标志都使编译后的程序在加载到内存中时以 4k 对齐,这是 xv6 所要求的。
我在 xv6 中 运行ning 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中了。
当我 运行 "make qemu" 我能够进入系统时,其他程序工作正常。但是当我 运行 我的测试程序时,它卡住了几秒钟然后显示 "panic: loaduvm: addr must be page aligned"。是因为我剥离了我的程序,还是我必须对xv6源代码应用补丁或修改,或者其他一些原因?
P.S。我使用的是官方 Github 存储库中的 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
问题已解决。我在与 GCC 链接时忘记添加“-N”参数。
根据我的理解,“-N”和“-Ttext 0”标志都使编译后的程序在加载到内存中时以 4k 对齐,这是 xv6 所要求的。