在Cygwin上编译GRUB(64位)

时间:2015-06-17 08:52:26

标签: compilation compiler-errors cygwin posix grub

我在Windows 8.1上使用64位Cygwin进行一些基本的操作系统开发。我想使用GRUB 2.00附带的实用程序(例如mkrescue和mkimage),因为我的内核与Multiboot 2兼容并且我正在从CD启动。

我在Cygwin 中编译我需要的所有工具没有问题,除了之外的GRUB,它会吐出以下错误:

libgrubkern.a(libgrubkern_a-getroot.o):getroot.c:(.text+0x215): undefined reference to `cygwin_conv_to_full_posix_path'
libgrubkern.a(libgrubkern_a-getroot.o):getroot.c:(.text+0x215): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `cygwin_conv_to_full_posix_path'
libgrubkern.a(libgrubkern_a-getroot.o):getroot.c:(.text+0x228): undefined reference to `cygwin_conv_to_full_win32_path'
libgrubkern.a(libgrubkern_a-getroot.o):getroot.c:(.text+0x228): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `cygwin_conv_to_full_win32_path'
collect2: error: ld returned 1 exit status
Makefile:16816: recipe for target 'grub-mkrelpath.exe' failed

这显然与Windows和Posix风格路径之间的Cygwin转换有关。稍微令人沮丧的是因为即使像GCC交叉编译器这样大的东西也可以编译而没有这样的问题。

我已经用Google搜索了确切的错误,但没有得到与GRUB相关的点击。有人有解决方案吗?

亚当

2 个答案:

答案 0 :(得分:1)

看起来我和你所在的人走的路相似。从我所看到的,这条路径函数被弃用并删除,被更新的方法取代。我能够让它继续编译,但是遇到了一个不同但可能无关的错误。

在函数 grub_find_device() util / getroot.c 文件中,我更换了:

cygwin_conv_to_full_posix_path (path, fullpath);
cygwin_conv_to_full_win32_path (fullpath, winpath);

以下内容:

cygwin_conv_path(CCP_WIN_A_TO_POSIX, path, fullpath, PATH_MAX);
cygwin_conv_path(CCP_POSIX_TO_WIN_A, fullpath, winpath, PATH_MAX);

不幸的是我遇到了下一个:

TARGET_OBJ2ELF=../grub-pe2elf sh genmod.sh moddep.lst regexp.module.exe regexp.mod
./../grub-pe2elf: error: invalid symbol.

我发现在这个问题中提到的另一个(不太令人满意,但可能不那么恼人)的解决方案是试图找到一个旧版本的Cygwin,或者是一个32位版本的Cygwin,它与您想要的GRUB版本一起使用。不幸的是,这可能意味着要重建所有工具。

无论哪种方式,我都会看看我是否可以解决这个新问题,如果我这样做,我会告诉你。

答案 1 :(得分:0)

我发布原始问题已经很久了,但我刚刚发现了它。只是说我的长期答案结果是从Cygwin转移而我现在在Windows上使用Ubuntu上的Bash,这对我正在使用的所有实用程序来说都更为成功。