elf.h: 使用 x86_64-w64-mingw32-gcc cross-compiler 时没有那个文件或目录
elf.h: No such file or directory when using the x86_64-w64-mingw32-gcc cross-compiler
许多开发人员告诉我使用 cross-compiler 来编译我的操作系统。
问题是当我从使用 gcc
切换到使用 x86_64-w64-mingw32-gcc
时,它给了我这个 post.
的标题错误
我正在 Windows 使用 WSL,我检查了 /usr/include
看看 elf.h
是否存在,确实存在。因此,我尝试在使用 -I/usr/include
进行编译时包含该目录,但它仍然无效。
PS:我试图在 kernel.cpp 中调用我的 __main
函数,我需要 elf.h
来获取 header 条目(除非有是一种没有 elf.h
的方法,我不知道)。
完整的引导加载程序 Makefile:
all:
x86_64-w64-mingw32-gcc -Ignu-efi/inc -Ignu-efi/inc/x86_64 -Ignu-efi/inc/protocol -c -o build/main.o c/main.c
x86_64-w64-mingw32-gcc -Ignu-efi/inc -Ignu-efi/inc/x86_64 -Ignu-efi/inc/protocol -c -o build/data.o gnu-efi/lib/data.c
x86_64-w64-mingw32-gcc -nostdlib -Wl,-dll -shared -Wl,--subsystem,10 -e efi_main -o essentials/main.efi build/main.o build/data.o
我正在使用 UEFI Bare Bones(仅 GNU-EFI Headers)。
是否有办法停止错误,或者是否有使用 elf.h
的替代方法?
感谢您的帮助!
我通过手动将结构添加到我的 main.c
文件中解决了这个问题:
typedef uint64_t Elf64_Addr;
#define ELFMAG "7ELF"
#define SELFMAG 4
#define EI_CLASS 4 /* File class byte index */
#define ELFCLASS64 2 /* 64-bit objects */
#define EI_DATA 5 /* Data encoding byte index */
#define ELFDATA2LSB 1 /* 2's complement, little endian */
#define ET_EXEC 2 /* Executable file */
#define PT_LOAD 1 /* Loadable program segment */
#ifdef __x86_64__
#define EM_MACH 62 /* AMD x86-64 architecture */
#endif
#ifdef __aarch64__
#define EM_MACH 183 /* ARM aarch64 architecture */
#endif
typedef struct
{
uint8_t e_ident[16]; /* Magic number and other info */
uint16_t e_type; /* Object file type */
uint16_t e_machine; /* Architecture */
uint32_t e_version; /* Object file version */
uint64_t e_entry; /* Entry point virtual address */
uint64_t e_phoff; /* Program header table file offset */
uint64_t e_shoff; /* Section header table file offset */
uint32_t e_flags; /* Processor-specific flags */
uint16_t e_ehsize; /* ELF header size in bytes */
uint16_t e_phentsize; /* Program header table entry size */
uint16_t e_phnum; /* Program header table entry count */
uint16_t e_shentsize; /* Section header table entry size */
uint16_t e_shnum; /* Section header table entry count */
uint16_t e_shstrndx; /* Section header string table index */
} Elf64_Ehdr;
typedef struct
{
uint32_t p_type; /* Segment type */
uint32_t p_flags; /* Segment flags */
uint64_t p_offset; /* Segment file offset */
uint64_t p_vaddr; /* Segment virtual address */
uint64_t p_paddr; /* Segment physical address */
uint64_t p_filesz; /* Segment size in file */
uint64_t p_memsz; /* Segment size in memory */
uint64_t p_align; /* Segment alignment */
} Elf64_Phdr;
我在哪里找到这些结构:
https://gitlab.com/bztsrc/posix-uefi/-/blob/master/examples/0F_exit_bs/exit_bs.c
如果您的 /usr/include
目录中有文件 elf.h
,您也可以从该文件中获取这些结构。
您可以将文件复制到您喜欢的文件夹,如下所示:
cd some_dir/preferred_dir
cp /usr/include/elf.h .
然后复制其中的结构并将它们粘贴到您的项目中。
如果您使用的是 Windows,则可以使用 WSL 来执行此操作。
这就是我学到的。
许多开发人员告诉我使用 cross-compiler 来编译我的操作系统。
问题是当我从使用 gcc
切换到使用 x86_64-w64-mingw32-gcc
时,它给了我这个 post.
我正在 Windows 使用 WSL,我检查了 /usr/include
看看 elf.h
是否存在,确实存在。因此,我尝试在使用 -I/usr/include
进行编译时包含该目录,但它仍然无效。
PS:我试图在 kernel.cpp 中调用我的 __main
函数,我需要 elf.h
来获取 header 条目(除非有是一种没有 elf.h
的方法,我不知道)。
完整的引导加载程序 Makefile:
all:
x86_64-w64-mingw32-gcc -Ignu-efi/inc -Ignu-efi/inc/x86_64 -Ignu-efi/inc/protocol -c -o build/main.o c/main.c
x86_64-w64-mingw32-gcc -Ignu-efi/inc -Ignu-efi/inc/x86_64 -Ignu-efi/inc/protocol -c -o build/data.o gnu-efi/lib/data.c
x86_64-w64-mingw32-gcc -nostdlib -Wl,-dll -shared -Wl,--subsystem,10 -e efi_main -o essentials/main.efi build/main.o build/data.o
我正在使用 UEFI Bare Bones(仅 GNU-EFI Headers)。
是否有办法停止错误,或者是否有使用 elf.h
的替代方法?
感谢您的帮助!
我通过手动将结构添加到我的 main.c
文件中解决了这个问题:
typedef uint64_t Elf64_Addr;
#define ELFMAG "7ELF"
#define SELFMAG 4
#define EI_CLASS 4 /* File class byte index */
#define ELFCLASS64 2 /* 64-bit objects */
#define EI_DATA 5 /* Data encoding byte index */
#define ELFDATA2LSB 1 /* 2's complement, little endian */
#define ET_EXEC 2 /* Executable file */
#define PT_LOAD 1 /* Loadable program segment */
#ifdef __x86_64__
#define EM_MACH 62 /* AMD x86-64 architecture */
#endif
#ifdef __aarch64__
#define EM_MACH 183 /* ARM aarch64 architecture */
#endif
typedef struct
{
uint8_t e_ident[16]; /* Magic number and other info */
uint16_t e_type; /* Object file type */
uint16_t e_machine; /* Architecture */
uint32_t e_version; /* Object file version */
uint64_t e_entry; /* Entry point virtual address */
uint64_t e_phoff; /* Program header table file offset */
uint64_t e_shoff; /* Section header table file offset */
uint32_t e_flags; /* Processor-specific flags */
uint16_t e_ehsize; /* ELF header size in bytes */
uint16_t e_phentsize; /* Program header table entry size */
uint16_t e_phnum; /* Program header table entry count */
uint16_t e_shentsize; /* Section header table entry size */
uint16_t e_shnum; /* Section header table entry count */
uint16_t e_shstrndx; /* Section header string table index */
} Elf64_Ehdr;
typedef struct
{
uint32_t p_type; /* Segment type */
uint32_t p_flags; /* Segment flags */
uint64_t p_offset; /* Segment file offset */
uint64_t p_vaddr; /* Segment virtual address */
uint64_t p_paddr; /* Segment physical address */
uint64_t p_filesz; /* Segment size in file */
uint64_t p_memsz; /* Segment size in memory */
uint64_t p_align; /* Segment alignment */
} Elf64_Phdr;
我在哪里找到这些结构: https://gitlab.com/bztsrc/posix-uefi/-/blob/master/examples/0F_exit_bs/exit_bs.c
如果您的 /usr/include
目录中有文件 elf.h
,您也可以从该文件中获取这些结构。
您可以将文件复制到您喜欢的文件夹,如下所示:
cd some_dir/preferred_dir
cp /usr/include/elf.h .
然后复制其中的结构并将它们粘贴到您的项目中。
如果您使用的是 Windows,则可以使用 WSL 来执行此操作。
这就是我学到的。