首页 > 其他分享 >Qemu中生成针对具体体系结构的纯净代码的方法---利用GCC的-E选项

Qemu中生成针对具体体系结构的纯净代码的方法---利用GCC的-E选项

时间:2023-06-27 21:33:07浏览次数:38  
标签:GCC Qemu gcc --- 编译 include qemu hello bindir


 

 

实验室正在研究一个叫做Qemu的项目,外国人写的初始代码。里面很多内容是我们不需要的,但是却参杂在我们关注的代码中。突然想到了一个编译命令-E ,它能够一下子就把那些不需要的代码过滤掉。

以前几次开会大家都抱怨这个东西干扰信息太多,导致代码分析的连贯性总是被打断,进度特别慢。现在用我发现的那个命令处理下后,代码量只有原来的1/5,并且过滤了所有无关信息。--这个世界清净了。

gcc -E -C -DTARGET_I386 cpu-exec.c >new_cpu-exec.c

-E表示只进行预处理

-C表示不删除注释信息

-D表示定义一个宏 -Dmymacro等价于在程序中添加了 #define mymacro

上面个命令的作用就是保留 #ifdef TARGET_I386 和 #endif之间的386代码,而去掉为sparc、arm等编写的代码。

这里需要提到一个小技巧。读者不妨写一个hello.c小程序:

#include <stdio.h>
void main()
{
    int i =0;
    return;
}

用gcc -E  -C hello.c >output_hello.c来对其进行预处理,你会发现output_hello.c中不仅包含了你原来的代码(在最后面),而且前面还包含了stdio.h整个头文件内部的内容,以及stdio.h这个文件中include的其他头文件的内容(整个include的过程是递归的)。

为了避免头文件的干扰,我们不妨先将源码中的头文件用注释掉,等进行预处理后,再将都删除掉。具体做法可以利用replace命令来替换。#include 先替换成 #include,预处理后再#include 替换成 #include。

在执行Qemu的预处理之前请务必弄清楚哪些宏是需要用-D进行预定义的,否则可能造成代码遗失。
具体如何做可以看看Qemu的Makefile,在我们选定一种结构的时候(比如为I386的机器生成可执行文件)肯定会有一系列的宏被激活。

 

最后,附上gcc的编译选项:

==================================================================

GCC中文手册


GCC现在是GNU中最主要和最流行的c & c++编译器. gcc/g++在执行编译工作的时候,总共需要以下几步:
1.预处理,生成.i的文件[预处理器cpp]
2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]
3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]
4.连接目标代码,生成可执行程序[链接器ld]

GCC能够处理的后缀有:
a:*.c  *.C   (C语言)
b:*.cxx   *.cc  (C++语言)
c:*.m         (面向对象的C)
d:*.i           (预处理后的C语言源文件)
e:*.ii          (预处理后的C++语言源文件)
f:*.s  *.S    (汇编语言)
h:*.h         (头文件)

目标文件可以是:
a. *.o     编译连接后的目标文件
b. *.a     库文件


[参数详解]
-x language filename
  设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后
缀名称是.c的,而C++的后缀名是.C或者.cpp,如果你很个性,决定你的C代码文件的后缀
名是.pig 哈哈,那你就要用这个参数,这个参数对他后面的文件名都起作用,除非到了
下一个参数的使用。
  可以使用的参数有下面的这些
  `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `assembler-with-cpp'.
  看到英文,应该可以理解的。
  例子用法:
  gcc -x c hello.pig
-x none filename
  关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型
  例子用法:
  gcc -x c hello.pig -x none hello2.c 
-c
  只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
  例子用法:
  gcc -c hello.c
  他将生成.o的obj文件
-S
  只激活预处理和编译,就是指把文件编译成为汇编代码。
  例子用法
  gcc -S hello.c
  他将生成.s的汇编代码,你可以用文本编辑器察看
-E
  只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面.
  例子用法:
  gcc -E hello.c > pianoapan.txt
  gcc -E hello.c | more
  慢慢看吧,一个hello word 也要与处理成800行的代码
-o   制定目标名称,缺省的时候,gcc 编译出来的文件是a.out,很难听,如果你和我有同感,改掉它,哈哈
  例子用法
  gcc -o hello.exe hello.c (哦,windows用习惯了)
  gcc -o hello.asm -S hello.c
-pipe
  使用管道代替编译中临时文件,在使用非gnu汇编工具的时候,可能有些问题
  gcc -pipe -o hello.exe hello.c
-ansi
  关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁止一些asm inline typeof关键字,以及UNIX,vax等预处理宏,
-fno-asm
  此选项实现ansi选项的功能的一部分,它禁止将asm,inline和typeof用作关键字。 
-fno-strict-prototype
  只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式的对参数
的个数和类型说明,而不是没有参数.
  而gcc无论是否使用这个参数,都将对没有带参数的函数,认为城没有显式说明的类型

-fthis-is-varialble
  就是向传统c++看齐,可以使用this当一般变量使用.
-fcond-mismatch
  允许条件表达式的第二和第三参数类型不匹配,表达式的值将为void类型 
-funsigned-char
-fno-signed-char
-fsigned-char
-fno-unsigned-char

  这四个参数是对char类型进行设置,决定将char类型设置成unsigned char(前两个参
数)或者 signed char(后两个参数) 
-include file
  包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设
定,功能就相当于在代码中使用#include<filename>
  例子用法:
  gcc hello.c -include /root/pianopan.h 
-imacros file
  将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件中 
-Dmacro
  相当于C语言中的#define macro 
-Dmacro=defn
  相当于C语言中的#define macro=defn 
-Umacro
  相当于C语言中的#undef macro
-undef
  取消对任何非标准宏的定义 
-Idir
  在你是用#include"file"的时候,gcc/g++会先在当前目录查找你所制定的头文件,如
果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,它会先在你所制定的目录查找,然后再按常规的顺序去找.
  对于#include<file>,gcc/g++会到-I制定的目录查找,查找不到,然后将到系统的缺省的头文件目录查找
-I-   就是取消前一个参数的功能,所以一般在-Idir之后使用 
-idirafter dir
  在-I的目录里面查找失败,讲到这个目录里面查找. 
-iprefix prefix
-iwithprefix dir

  一般一起使用,当-I的目录查找失败,会到prefix+dir下查找   
-nostdinc
  使编译器不再系统缺省的头文件目录里面找头文件,一般和-I联合使用,明确限定头文件的位置   
-nostdin C++
  规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创libg++库
使用 
-C
  在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序,用这个很方便的 
-M
  生成文件关联的信息。包含目标文件所依赖的所有源代码你可以用gcc -M hello.c 来测试一下,很简单。
-MM
  和上面的那个一样,但是它将忽略由#include<file>造成的依赖关系。 
-MD
  和-M相同,但是输出将导入到.d的文件里面 
-MMD
  和-MM相同,但是输出将导入到.d的文件里面 
-Wa,option
  此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选项,然
后传递给会汇编程序 
-Wl.option
  此选项传递option给连接程序;如果option中间有逗号,就将option分成多个选项,然
后传递给会连接程序. 
-llibrary
  制定编译的时候使用的库
  例子用法
  gcc -lcurses hello.c
  使用ncurses库编译程序
-Ldir
  制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然
  编译器将只在标准库的目录找。这个dir就是目录的名称。 
-O0
-O1
-O2
-O3
  编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高    
-g
  只是编译器,在编译的时候,产生调试信息。 
-gstabs   此选项以stabs格式声称调试信息,但是不包括gdb调试信息. 
-gstabs+
  此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息. 
-ggdb
  此选项将尽可能的生成gdb的可以使用的调试信息.
-static
  此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么
动态连接库,就可以运行.
-share
  此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-traditional
  试图让编译器支持传统的C语言特性

运行 gcc/egcs
*****************************************运行 gcc/egcs*****************************************************
  GCC 是 GNU 的 C 和 C++ 编译器。实际上,GCC 能够编译三种语言:C、C++ 和 Object C(C 语言的一种面向对象扩展)。利用 gcc 命令可同时编译并连接 C 和 C++ 源程序。
  如果你有两个或少数几个 C 源文件,也可以方便地利用 GCC 编译、连接并生成可执行文件。例如,假设你有两个源文件 main.c 和 factorial.c 两个源文件,现在要编译生成一个计算阶乘的程序。
代码:
-----------------------

清单 factorial.c 
----------------------- 
int factorial (int n) 
{ 
  if (n <= 1) 
   return 1; 
  else 
   return factorial (n - 1) * n; 
} 
----------------------- 
清单 main.c 
----------------------- 
#include <stdio.h> 
#include <unistd.h> 
int factorial (int n); 
int main (int argc, char **argv) 
{ 
  int n; 
  if (argc < 2) 
  { 
    printf ("Usage: %s n/n", argv [0]); 
    return -1; 
  } 
  else 
  { 
   n = atoi (argv[1]); 
   printf ("Factorial of %d is %d./n", n, factorial (n)); 
   } 
  return 0; 
}


-----------------------
利用如下的命令可编译生成可执行文件,并执行程序:

$ gcc -o factorial main.c factorial.c 
$ ./factorial 5 
Factorial of 5 is 120.


  GCC 可同时用来编译 C 程序和 C++ 程序。一般来说,C 编译器通过源文件的后缀名来判断是 C 程序还是 C++ 程序。在 Linux 中,C 源文件的后缀名为 .c,而 C++ 源文件的后缀名为 .C 或 .cpp。但是,gcc 命令只能编译 C++ 源文件,而不能自动和 C++ 程序使用的库连接。因此,通常使用 g++ 命令来完成 C++ 程序的编译和连接,该程序会自动调用 gcc 实现编译。假设我们有一个如下的 C++ 源文件(hello.C):

#include <iostream> 
void main (void) 
{ 
  cout << "Hello, world!" << endl; 
}


则可以如下调用 g++ 命令编译、连接并生成可执行文件:

$ g++ -o hello hello.C 
$ ./hello 
Hello, world!

 

gcc 常用命令

**********************gcc/egcs 的主要选项*************************************************************** 
选项 解释
-ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色,例如 asm 或 typeof 关键词。
-c 只编译并生成目标文件。
-DMACRO 以字符串“1”定义 MACRO 宏。
-DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。
-E 只运行C 预编译器。
-g 生成调试信息。GNU 调试器可利用该信息。
-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。
-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。
-lLIBRARY 连接时搜索指定的函数库LIBRARY。
-m486 针对 486 进行代码优化。
-o FILE 生成指定的输出文件。用在生成可执行文件时。
-O0 不进行优化处理。
-O 或 -O1 优化生成代码。
-O2 进一步优化。
-O3 比 -O2 更进一步优化,包括 inline 函数。
-shared 生成共享目标文件。通常用在建立共享库时。
-static 禁止使用共享连接。
-UMACRO 取消对 MACRO 宏的定义。
-w 不生成任何警告信息。
-Wall 生成所有警告信息。

 

【手 册 来  源】:http://blog.chinaunix.net/article.php?articleId=42935&blogId=8800





补充一些新内容。刚才(2008.3.1 02:35)将Qemu的makefile和configure分析执行了一下,执行config后得到的Makefile文件展开如下:



Qemu中生成针对具体体系结构的纯净代码的方法---利用GCC的-E选项_汇编

# 
    Makefile  
   for 
    QEMU 
   . 
   
      # comment this, and expand it in the following added code.
    # 
   include config-host 
   . 
   mak


    # 
    add by raywill
    # 
    Automatically generated by configure -  
   do 
     
   not 
    modify
    # 
    Configured with:  
   ./ 
   configure --target-list 
   = 
   i386 --disable-gfx-check
prefix    =/ 
   usr 
   / 
   local
bindir    =/ 
   usr 
   / 
   local 
   / 
   bin
mandir    =/ 
   usr 
   / 
   local 
   / 
   share 
   / 
   man
datadir    =/ 
   usr 
   / 
   local 
   / 
   share 
   / 
   qemu
docdir    =/ 
   usr 
   / 
   local 
   / 
   share 
   / 
   doc 
   / 
   qemu
MAKE    = 
   make
INSTALL    = 
   install
CC    = 
   gcc
HAVE_GCC3_OPTIONS    = 
   yes
HOST_CC    = 
   gcc
AR    = 
   ar
STRIP    = 
   strip -s -R  
   . 
   comment -R  
   . 
   note
OS_CFLAGS    = 
   
CFLAGS    = 
    -Wall -O2 -g -fno-strict-aliasing
LDFLAGS    = 
    -g
EXESUF    = 
   
ARCH    = 
   i386
CONFIG_GDBSTUB    = 
   yes
CONFIG_SLIRP    = 
   yes
CONFIG_OSS    = 
   yes
VERSION    = 
   0.9 
   . 
   0 
   
SRC_PATH    =/ 
   mnt 
   / 
   hgfs 
   / 
   LinuxShare 
   / 
   qemu- 
   0.9 
   . 
   0 
   
TARGET_DIRS    = 
   i386
    # 
   end 
    add 





    . 
   PHONY: all clean distclean dvi info install install-doc tar tarbin  
    
   
    speed test test2 html dvi info

BASE_CFLAGS    = 
   
BASE_LDFLAGS    = 
   

BASE_CFLAGS     += 
     
   $( 
   OS_CFLAGS 
   ) 
   
ifeq     ($( 
   ARCH 
   ), 
   sparc 
   ) 
   
BASE_CFLAGS     += 
    -mcpu 
   = 
   ultrasparc
endif
CPPFLAGS     += 
    -I 
   . 
    -D_GNU_SOURCE -D_FILE_OFFSET_BITS 
   = 
   64 
    -D_LARGEFILE_SOURCE
LIBS    = 
   
TOOLS    = 
   qemu-img 
   $( 
   EXESUF 
   ) 
   
ifdef CONFIG_STATIC
BASE_LDFLAGS     += 
    -static
endif
ifdef BUILD_DOCS
DOCS    = 
   qemu-doc 
   . 
   html qemu-tech 
   . 
   html qemu 
   . 
   1 
    qemu-img 
   . 
   1 
   
    else 
   
DOCS    = 
   
endif

ifndef CONFIG_DARWIN
ifndef CONFIG_WIN32
ifndef CONFIG_SOLARIS
LIBS    += 
   -lrt
endif
endif
endif

all:     $( 
   TOOLS 
   ) 
     
   $( 
   DOCS 
   ) 
    recurse-all

subdir-%: dyngen    $( 
   EXESUF 
   ) 
   
        $( 
   MAKE 
   ) 
    -C  
   $( 
   subst 
    subdir- 
   ,,$ 
   @ 
   ) 
    all

recurse-all:     $( 
   patsubst % 
   , 
   subdir-% 
   , 
     
   $( 
   TARGET_DIRS 
   )) 
   

qemu-img    $( 
   EXESUF 
   ) 
   : qemu-img 
   . 
   c cutils 
   . 
   c block 
   . 
   c block-raw 
   . 
   c block-cow 
   . 
   c block-qcow 
   . 
   c aes 
   . 
   c block-vmdk 
   . 
   c block-cloop 
   . 
   c block-dmg 
   . 
   c block-bochs 
   . 
   c block-vpc 
   . 
   c block-vvfat 
   . 
   c block-qcow2 
   . 
   c
        $( 
   CC 
   ) 
    -DQEMU_TOOL  
   $( 
   CFLAGS 
   ) 
     
   $( 
   CPPFLAGS 
   ) 
     
   $( 
   BASE_CFLAGS 
   ) 
     
   $( 
   LDFLAGS 
   ) 
     
   $( 
   BASE_LDFLAGS 
   ) 
    -o  
   $ 
   @  
   $ 
   ^ -lz  
   $( 
   LIBS 
   ) 
   

dyngen    $( 
   EXESUF 
   ) 
   : dyngen 
   . 
   c
        $( 
   HOST_CC 
   ) 
     
   $( 
   CFLAGS 
   ) 
     
   $( 
   CPPFLAGS 
   ) 
     
   $( 
   BASE_CFLAGS 
   ) 
    -o  
   $ 
   @  
   $ 
   ^

clean:
    # 
    avoid old build problems by removing potentially incorrect old  
   files 
   
    rm -f config    . 
   mak config 
   . 
   h op-i386 
   . 
   h opc-i386 
   . 
   h gen-op-i386 
   . 
   h op-arm 
   . 
   h opc-arm 
   . 
   h gen-op-arm 
   . 
   h 
    rm -f *    . 
   o * 
   . 
   a  
   $( 
   TOOLS 
   ) 
    dyngen 
   $( 
   EXESUF 
   ) 
    TAGS * 
   . 
   pod *~ * 
   / 
   *~
        $( 
   MAKE 
   ) 
    -C tests clean
        for 
    d in  
   $( 
   TARGET_DIRS 
   ); 
     
   do 
     
    
   
        $( 
   MAKE 
   ) 
    -C  
   $$ 
   d  
   $ 
   @ ||  
   exit 
     
   1 
     
   ; 
     
    
   
        done

distclean: clean
    rm -f config-host    . 
   mak config-host 
   . 
   h  
   $( 
   DOCS 
   ) 
   
    rm -f qemu-{doc    , 
   tech} 
   . 
   {info 
   , 
   aux 
   , 
   cp 
   , 
   dvi 
   , 
   fn 
   , 
   info 
   , 
   ky 
   , 
   log 
   , 
   pg 
   , 
   toc 
   , 
   tp 
   , 
   vr}
        for 
    d in  
   $( 
   TARGET_DIRS 
   ); 
     
   do 
     
    
   
    rm -rf     $$ 
   d ||  
   exit 
     
   1 
     
   ; 
     
    
   
        done

KEYMAPS    = 
   da     en-gb  et  fr     fr-ch  is  lt  modifiers  no  pt-br  sv  
    
   
ar      de     en-us  fi  fr-be  hr     it  lv  nl         pl  ru     th      
   
common  de-ch  es     fo  fr-ca  hu     ja  mk  nl-be      pt  sl     tr

install-doc:     $( 
   DOCS 
   ) 
   
        mkdir 
    -p  
   " 
   $(DESTDIR)$(docdir) 
   " 
   
        $( 
   INSTALL 
   ) 
    -m  
   644 
    qemu-doc 
   . 
   html  qemu-tech 
   . 
   html  
   " 
   $(DESTDIR)$(docdir) 
   " 
   
ifndef CONFIG_WIN32
        mkdir 
    -p  
   " 
   $(DESTDIR)$(mandir)/man1 
   " 
   
        $( 
   INSTALL 
   ) 
    qemu 
   . 
   1 
    qemu-img 
   . 
   1 
     
   " 
   $(DESTDIR)$(mandir)/man1 
   " 
   
endif

install: all     $( 
   if 
     
   $( 
   BUILD_DOCS 
   ), 
   install-doc 
   ) 
   
        mkdir 
    -p  
   " 
   $(DESTDIR)$(bindir) 
   " 
   
        $( 
   INSTALL 
   ) 
    -m  
   755 
    -s  
   $( 
   TOOLS 
   ) 
     
   " 
   $(DESTDIR)$(bindir) 
   " 
   
        mkdir 
    -p  
   " 
   $(DESTDIR)$(datadir) 
   " 
   
        for 
    x in bios 
   . 
   bin vgabios 
   . 
   bin vgabios-cirrus 
   . 
   bin ppc_rom 
   . 
   bin  
    
   
        video    . 
   x openbios-sparc32 linux_boot 
   . 
   bin pxe-ne2k_pci 
   . 
   bin  
    
   
        pxe-rtl8139    . 
   bin pxe-pcnet 
   . 
   bin 
   ; 
     
   do 
     
    
   
            $( 
   INSTALL 
   ) 
    -m  
   644 
     
   $( 
   SRC_PATH 
   )/ 
   pc-bios 
   /$$ 
   x  
   " 
   $(DESTDIR)$(datadir) 
   " 
   ; 
     
    
   
    done
ifndef CONFIG_WIN32
        mkdir 
    -p  
   " 
   $(DESTDIR)$(datadir)/keymaps 
   " 
   
        for 
    x in  
   $( 
   KEYMAPS 
   ); 
     
   do 
     
    
   
            $( 
   INSTALL 
   ) 
    -m  
   644 
     
   $( 
   SRC_PATH 
   )/ 
   keymaps 
   /$$ 
   x  
   " 
   $(DESTDIR)$(datadir)/keymaps 
   " 
   ; 
     
    
   
    done
endif
        for 
    d in  
   $( 
   TARGET_DIRS 
   ); 
     
   do 
     
    
   
        $( 
   MAKE 
   ) 
    -C  
   $$ 
   d  
   $ 
   @ ||  
   exit 
     
   1 
     
   ; 
     
    
   
        done

    # 
    various test targets
test speed test2: all
        $( 
   MAKE 
   ) 
    -C tests  
   $ 
   @

TAGS: 
    etags *    . 
   [ch] tests 
   / 
   * 
   . 
   [ch]

cscope:
    rm -f     ./ 
   cscope 
   . 
   *
        find 
     
   . 
    -name  
   " 
   *.[ch] 
   " 
    - 
   print 
     
   > 
     
   ./ 
   cscope 
   . 
   files 
   
    cscope -b

    # 
    documentation
%    . 
   html: % 
   . 
   texi
    texi2html -monolithic -number     $< 
   

%    . 
   info: % 
   . 
   texi
    makeinfo     $< 
    -o  
   $ 
   @

%    . 
   dvi: % 
   . 
   texi
    texi2dvi     $< 
   

qemu    . 
   1 
   : qemu-doc 
   . 
   texi
        $( 
   SRC_PATH 
   )/ 
   texi2pod 
   . 
   pl  
   $< 
    qemu 
   . 
   pod
    pod2man --section    = 
   1 
    --center 
   = 
   " 
     
   " 
    --release 
   = 
   " 
     
   " 
    qemu 
   . 
   pod  
   > 
     
   $ 
   @

qemu-img    . 
   1 
   : qemu-img 
   . 
   texi
        $( 
   SRC_PATH 
   )/ 
   texi2pod 
   . 
   pl  
   $< 
    qemu-img 
   . 
   pod
    pod2man --section    = 
   1 
    --center 
   = 
   " 
     
   " 
    --release 
   = 
   " 
     
   " 
    qemu-img 
   . 
   pod  
   > 
     
   $ 
   @

info: qemu-doc    . 
   info qemu-tech 
   . 
   info

dvi: qemu-doc    . 
   dvi qemu-tech 
   . 
   dvi

html: qemu-doc    . 
   html qemu-tech 
   . 
   html

VERSION ?    = 
     
   $( 
   shell 
    cat VERSION 
   ) 
   
FILE     = 
    qemu- 
   $( 
   VERSION 
   ) 
   

    # 
    tar release  
   ( 
   use 
    'make -k tar'  
   on 
    a checkouted  
   tree 
   ) 
   
tar:
    rm -rf     / 
   tmp 
   /$( 
   FILE 
   ) 
   
    cp -r     . 
     
   / 
   tmp 
   /$( 
   FILE 
   ) 
   
        ( 
     
   cd 
     
   / 
   tmp  
   ; 
    tar zcvf ~ 
   /$( 
   FILE 
   ). 
   tar 
   . 
   gz  
   $( 
   FILE 
   ) 
    --exclude CVS  
   ) 
   
    rm -rf     / 
   tmp 
   /$( 
   FILE 
   ) 
   

    # 
    generate a binary distribution
tarbin:
        ( 
     
   cd 
     
   / 
     
   ; 
    tar zcvf ~ 
   / 
   qemu- 
   $( 
   VERSION 
   ) 
   -i386 
   . 
   tar 
   . 
   gz  
    
   
        $( 
   bindir 
   )/ 
   qemu  
    
   
        $( 
   bindir 
   )/ 
   qemu-system-ppc  
    
   
        $( 
   bindir 
   )/ 
   qemu-system-sparc  
    
   
        $( 
   bindir 
   )/ 
   qemu-system-x86_64  
    
   
        $( 
   bindir 
   )/ 
   qemu-system-mips  
    
   
        $( 
   bindir 
   )/ 
   qemu-system-mipsel  
    
   
        $( 
   bindir 
   )/ 
   qemu-system-arm  
    
   
        $( 
   bindir 
   )/ 
   qemu-i386  
    
   
            $( 
   bindir 
   )/ 
   qemu-arm  
    
   
            $( 
   bindir 
   )/ 
   qemu-armeb  
    
   
            $( 
   bindir 
   )/ 
   qemu-sparc  
    
   
            $( 
   bindir 
   )/ 
   qemu-ppc  
    
   
            $( 
   bindir 
   )/ 
   qemu-mips  
    
   
            $( 
   bindir 
   )/ 
   qemu-mipsel  
    
   
            $( 
   bindir 
   )/ 
   qemu-img  
    
   
        $( 
   datadir 
   )/ 
   bios 
   . 
   bin  
    
   
        $( 
   datadir 
   )/ 
   vgabios 
   . 
   bin  
    
   
        $( 
   datadir 
   )/ 
   vgabios-cirrus 
   . 
   bin  
    
   
        $( 
   datadir 
   )/ 
   ppc_rom 
   . 
   bin  
    
   
        $( 
   datadir 
   )/ 
   video 
   . 
   x  
    
   
        $( 
   datadir 
   )/ 
   openbios-sparc32  
    
   
        $( 
   datadir 
   )/ 
   linux_boot 
   . 
   bin  
    
   
            $( 
   datadir 
   )/ 
   pxe-ne2k_pci 
   . 
   bin  
    
   
        $( 
   datadir 
   )/ 
   pxe-rtl8139 
   . 
   bin  
    
   
            $( 
   datadir 
   )/ 
   pxe-pcnet 
   . 
   bin  
    
   
        $( 
   docdir 
   )/ 
   qemu-doc 
   . 
   html  
    
   
        $( 
   docdir 
   )/ 
   qemu-tech 
   . 
   html  
    
   
        $( 
   mandir 
   )/ 
   man1 
   / 
   qemu 
   . 
   1 
     
   $( 
   mandir 
   )/ 
   man1 
   / 
   qemu-img 
   . 
   1 
     
   ) 
   

ifneq     ($( 
   wildcard  
   . 
   depend 
   ),) 
   
include     . 
   depend
endif


 上面的代码如果还看不出什么端倪,下面的代码则说明问题了:

/   *
  
Config.h

 Automatically generated by configure -  do not  modify 


*   /   
   #   include  
  " 
  ../config-host.h 
  " 
  
   #   define CONFIG_QEMU_PREFIX  
  " 
  /usr/gnemul/qemu-i386 
  " 
  
   #   define TARGET_ARCH  
  " 
  i386 
  " 
  
   #   define TARGET_I386  
  1  

  
/     *
    
Config-host.h


 Automatically generated by configure -  do not  modify 

*     /     
#define CONFIG_QEMU_SHAREDIR "/usr/local/share/qemu"     
#define HOST_I386 1     
#define HOST_LONG_BITS 32     
#define HAVE_BYTESWAP_H 1     
#define CONFIG_GDBSTUB 1     
#define CONFIG_SLIRP 1     
#define CONFIG_OSS 1     
#define QEMU_VERSION "0.9.0"     
#define CONFIG_UNAME_RELEASE ""

标签:GCC,Qemu,gcc,---,编译,include,qemu,hello,bindir
From: https://blog.51cto.com/maray/6566315

相关文章

  • 【五期邹昱夫】CCF-B(IEEE Access'19)Badnets: Evaluating backdooring attacks on deep
    "Gu,Tianyu,etal."Badnets:Evaluatingbackdooringattacksondeepneuralnetworks."IEEEAccess7(2019):47230-47244."  本文提出了外包机器学习时选择值得信赖的提供商的重要性,以及确保神经网络模型安全地托管和从在线存储库下载的重要性。并展示了迁移学习场......
  • java-集合类学习
    LinkedHashMapAspecialconstructorisprovidedtocreatealinkedhashmapwhoseorderofiterationistheorderinwhichitsentrieswerelastaccessed,fromleast-recentlyaccessedtomost-recently(access-order).Thiskindofmapiswell-suitedtobu......
  • linux命令学习-目录大小du
    du命令:显示目录包含的文件大小du可以让我们知道文件和目录所占的空间大小du命令会深入遍历每个目录的子目录,统计所有文件的大小是英语diskusage的缩写,表示“磁盘使用/占用”-h以Ko,Mo,Go的形式显示文件大小-a会显示目录和文件的大小-s只显示当前目录的总大小......
  • 01-点亮你的LED灯
    目录一.单片机的内部资源二.单片机最小系统三.点亮第一个小灯一.单片机的内部资源Flash程序存储空间:在早期单片机中,主要使用的是OTPROM(只能写入一次程序).后来出现Flash可重复擦写程序价格低,且断电依然可保存数据.RAM数据存储空间:用于存储程序运行过程中产生的......
  • pta第三部分总结oop训练集09-11
    一,前言:oop09:7-1统计Java程序中关键词的出现次数:对Java中字符串,元字符,正则表达式的应用。oop10:7-1容器-HashMap-检索:对Java程序中HashMap的特性对输入内容进行检索的应用。7-2容器-HashMap-排序:对Java升序中HashMap的无序性的应用将其排序。7-3课程成绩......
  • 海康硬盘录像机 DS-8800N-R84K介绍
    经销R-4K系列8盘位NVR可接驳符合ONVIF、RTSP标准及众多主流厂商的网络摄像机;支持H.265、Smart265、H.264、Smart264编码的前端设备自适应接入;支持最大网络接入带宽400Mbps,最大支持1200万像素高清网络视频的预览、存储与回放;支持热成像相机的接入、存储、报警;解码性能强劲,......
  • Linux扩展篇-shell编程(三)-shell运算符
    基本语法:格式一expr+、-、\*、/、%(加、减、乘、除、求余)格式二"$((运算式))"或者"$[运算式]"基本运算符Shell和其他编程语言一样,支持多种运算符,包括:算术运算符关系运算符布尔运算符字符串运算符文件测试运算符赋值运算符逻辑运算符(1)算术运算符运算符......
  • element-ui按需引入
    1.借助 babel-plugin-component,我们可以只引入需要的组件,以达到减小项目体积的目的。首先,安装babel-plugin-component:npminstallbabel-plugin-component-D2.修改babel.config.jsmodule.exports={presets:['@vue/cli-plugin-babel/preset',["@babel/prese......
  • 【五期邹昱夫】CCF-B(RAID'18)Fine-Pruning: Defending Against Backdooring Attacks on
    "Liu,Kang,BrendanDolan-Gavitt,andSiddharthGarg."Fine-pruning:Defendingagainstbackdooringattacksondeepneuralnetworks."ResearchinAttacks,Intrusions,andDefenses:21stInternationalSymposium,RAID2018,Heraklion,Crete,......
  • Online Temporal Calibration for Monocular Visual-Inertial Systems
    摘要:准确的状态估计是各种智能应用的基本模块,例如机器人导航、自动驾驶、虚拟和增强现实。近年来,视觉和惯性融合是一种流行的技术,用于6自由度状态估计。不同传感器测量记录的时间点对于系统的鲁棒性和准确性非常重要。实际上,每个传感器的时间戳通常会受到触发和传输延迟的影响,导......