测试编译链
环境:ubuntu desktop虚拟机(32-bit)
objdump -i
–info 显示对于 -b 或者 -m 选项可用的架构和目标格式列表
应当支持:elf32-i386 (header little endian, data little endian)
gcc -m32 -print-libgcc-file-name
-print-file-name= library:输出指定的库的全路径名。除此之外编译程序不执行其他动作。
-print-libgcc-file-name:输出库 libgcc.a 的全路径名。该选项与 -print-file-name=libgcc.a 相同。
应当回显: /usr/lib/gcc/i486-linux-gnu/*version*/libgcc.a
or /usr/lib/gcc/x86_64-linux-gnu/*version*/32/libgcc.a
在将内核与编译器链接时,可以通过传递-lgcc
来链接libgcc
libgcc是什么?
libgcc是GCC提供的一个低层运行时库,当一些操作/运算在特定平台上不支持时,GCC会自动生成对这些库函数的调用,使用这些库函数来模拟实现。从概念上和源码实现中,又可以分为libgcc1和libgcc2,虽然它们最终会被编译合并为libgcc.a。
- libgcc1中包含了一套基础操作/运算,这些无法使用其它操作来实现,通常会使用一系列的汇编代码来模拟完成。
- libgcc2,正好相反,这些可以通过已有的一些操作/运算来简单的组合完成。通常是使用C代码来编写。
注:也可以自己构建编译链,参考building your own compiler toolchain
安装补丁版QEMU
QEMU可以简单看成没有GUI的虚拟机。当作为模拟器时,可以在一种架构(如x86 PC)下运行另一种架构(如ARM)下的操作系统和程序【也就是说支持跨平台虚拟化的虚拟机】。同时具备很好IO设备模拟。
题中说,QEMU debugging facilities虽然很强大,但是不成熟,因此需要下载的补丁版的QEMU:
To build your own patched version of QEMU:
- Clone QEMU git repository:
git clone https://github.com/mit-pdos/6.828-qemu.git qemu
- 在linux上要安装一些库.
- 在Debian/Ubuntu 16.04上搭建6.828 QEMU,需要安装the following packages:libsdl1.2-dev, libtool-bin, libglib2.0-dev, libz-dev, and libpixman-1-dev。其他版本相应修改。
- Configure the source code (可选参数在方括号中; replace PFX with a path of your choice)
- Linux:
./configure --disable-kvm --disable-werror [--prefix=PFX] [--target-list="i386-softmmu x86_64-softmmu"]
- 选项
prefix
设置安装QEMU的位置【绝对路径】,否则默认安装在/usr/local
- The
target-list
argument simply slims down the architectures QEMU will build support for. - target-list参数简化了QEMU将构建的支持体系结构
- 加上–disable-werror以保证不会因出现编译警告而终止编译
- Run
make && make install
编译工具使用简述
Use the qemu-gdb target (or its qemu-gdb-nox
variant) to make QEMU wait for GDB to attach.
如果遇到unexpected interrupts, exceptions, or triple faults,QEMU通过 -d 参数生成详细的log。
汇编参考文档
x86 Assembly Language
-
PC Assembly Language, Paul A. Carter, November 2003. (local copy)
-
Intel 80386 Programmer’s Reference Manual, 1987 (HTML). (local copy - PDF) (local copy - HTML) Much shorter than the full current Intel Architecture manuals below, but describes all processor features used in 6.828.
-
Intel 64 and IA-32 Intel Architecture Software Developer’s Manuals
, Intel, 2007. Local copies:
-
Multiprocessor references:
-
AMD64 Architecture Programmer’s Manual. Covers both the “classic” 32-bit x86 architecture and the new 64-bit extensions supported by the latest AMD and Intel processors.
-
Writing inline assembly language with GCC:
- Brennan’s Guide to Inline Assembly, Brennan “Mr. Wacko” Underwood【这一篇简述了intel和AT&T的区别和语法】
- Inline assembly for x86 in Linux, Bharata B. Rao, IBM
- GCC-Inline-Assembly-HOWTO, Sandeep.S
-
Loading x86 executables in the ELF format:
- Tool Interface Standard (TIS) Executable and Linking Format (ELF). The definitive standard for the ELF format.
- Wikipedia page has a short description.