在 Cygwin(64 位)上编译 GRUB
Compiling GRUB on Cygwin (64 bit)
我在 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
这显然与 Cygwin 中 Windows 和 Posix 样式路径之间的转换有关。有点令人沮丧,因为即使像 GCC 交叉编译器这样大的东西也可以编译而没有这样的问题。
我用谷歌搜索了确切的错误,但没有找到与 GRUB 相关的结果。有人对此有解决方案吗?
亚当
看起来我和你走的路很相似。据我所见,该行路径函数已被弃用和删除,并被更新的方法所取代。我能够让它继续编译,但遇到了一个不同但可能不相关的错误。
在文件util/getroot.c中函数grub_find_device()我替换了:
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 版本一起使用.不幸的是,这可能意味着再次重建所有工具。
无论哪种方式,我都会看看是否可以解决这个新问题,如果可以,我会通知您。
我发布原始问题已经有很长时间了,但我又找到了。只是说,对我来说,长期的答案是从 Cygwin 切换过来,我现在在 Ubuntu 和 Windows 上使用 Bash,这对所有人来说都更加成功我正在使用的实用程序。
我在 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
这显然与 Cygwin 中 Windows 和 Posix 样式路径之间的转换有关。有点令人沮丧,因为即使像 GCC 交叉编译器这样大的东西也可以编译而没有这样的问题。
我用谷歌搜索了确切的错误,但没有找到与 GRUB 相关的结果。有人对此有解决方案吗?
亚当
看起来我和你走的路很相似。据我所见,该行路径函数已被弃用和删除,并被更新的方法所取代。我能够让它继续编译,但遇到了一个不同但可能不相关的错误。
在文件util/getroot.c中函数grub_find_device()我替换了:
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 版本一起使用.不幸的是,这可能意味着再次重建所有工具。
无论哪种方式,我都会看看是否可以解决这个新问题,如果可以,我会通知您。
我发布原始问题已经有很长时间了,但我又找到了。只是说,对我来说,长期的答案是从 Cygwin 切换过来,我现在在 Ubuntu 和 Windows 上使用 Bash,这对所有人来说都更加成功我正在使用的实用程序。