首页 > 编程语言 >C语言:详解gcc驱动程序完成编译、汇编、链接的过程

C语言:详解gcc驱动程序完成编译、汇编、链接的过程

时间:2024-06-06 19:04:33浏览次数:29  
标签:gcc 驱动程序 .. -- 4.8 C语言 64 x86

相关阅读

C语言icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12423166.html?spm=1001.2014.3001.5482


        gcc是一个命令,严格意义上说,它只是一个驱动程序,而不是一个编译器。gcc负责调用GNU工具链中的预处理器、编译器、汇编器、链接器等工具,通过传递不同的选项给gcc命令,可以让其只完成某些步骤,比如下面的命令,用于只对源文件进行预处理。

gcc -E test.c

        实际上,gcc命令的参数不仅可以是C语言源文件(.c后缀),也可以是C++语言(.cc、.cpp、.c++、.CPP等后缀), 还可以是fortran语言(.f、.for、.f90、.f95等后缀),ada语言(.adb、.adb后缀)等。

        具体支持的语言后缀,可以在gcc命令的源代码中找到,如下所示(也可以使用man命令在gcc的手册中找到)。

1409 static const struct compiler default_compilers[] =
1410 {
1411   /* Add lists of suffixes of known languages here.  If those languages
1412      were not present when we built the driver, we will hit these copies
1413      and be given a more meaningful error than "file not used since
1414      linking is not done".  */
1415   {".m",  "#Objective-C", 0, 0, 0}, {".mi",  "#Objective-C", 0, 0, 0},
1416   {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
1417   {".mii", "#Objective-C++", 0, 0, 0},
1418   {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
1419   {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
1420   {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
1421   {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
1422   {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
1423   {".f", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
1424   {".for", "#Fortran", 0, 0, 0}, {".FOR", "#Fortran", 0, 0, 0},
1425   {".ftn", "#Fortran", 0, 0, 0}, {".FTN", "#Fortran", 0, 0, 0},
1426   {".fpp", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
1427   {".f90", "#Fortran", 0, 0, 0}, {".F90", "#Fortran", 0, 0, 0},
1428   {".f95", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
1429   {".f03", "#Fortran", 0, 0, 0}, {".F03", "#Fortran", 0, 0, 0},
1430   {".f08", "#Fortran", 0, 0, 0}, {".F08", "#Fortran", 0, 0, 0},
1431   {".r", "#Ratfor", 0, 0, 0},
1432   {".go", "#Go", 0, 1, 0},
1433   {".d", "#D", 0, 1, 0}, {".dd", "#D", 0, 1, 0}, {".di", "#D", 0, 1, 0},
1434   /* Next come the entries for C.  */
1435   {".c", "@c", 0, 0, 1},
1436   {"@c",
1437    /* cc1 has an integrated ISO C preprocessor.  We should invoke the
1438       external preprocessor if -save-temps is given.  */
1439      "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1440       %{!E:%{!M:%{!MM:\
1441           %{traditional:\
1442 %eGNU C no longer supports -traditional without -E}\
1443       %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1444           %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1445             cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1446           %(cc1_options)}\
1447       %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1448           cc1 %(cpp_unique_options) %(cc1_options)}}}\
1449       %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 1},
1450   {"-",
1451    "%{!E:%e-E or -x required when input is from standard input}\
1452     %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
1453   {".h", "@c-header", 0, 0, 0},
1454   {"@c-header",
1455    /* cc1 has an integrated ISO C preprocessor.  We should invoke the
1456       external preprocessor if -save-temps is given.  */
1457      "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1458       %{!E:%{!M:%{!MM:\
1459           %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1460                 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1461                     cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1462                         %(cc1_options)\
1463                         %{!fsyntax-only:%{!S:-o %g.s} \
1464                             %{!fdump-ada-spec*:%{!o*:--output-pch=%i.gch}\
1465                                                %W{o*:--output-pch=%*}}%V}}\
1466           %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1467                 cc1 %(cpp_unique_options) %(cc1_options)\
1468                     %{!fsyntax-only:%{!S:-o %g.s} \
1469                         %{!fdump-ada-spec*:%{!o*:--output-pch=%i.gch}\
1470                                            %W{o*:--output-pch=%*}}%V}}}}}}}", 0, 0, 0},
1471   {".i", "@cpp-output", 0, 0, 0},
1472   {"@cpp-output",
1473    "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
1474   {".s", "@assembler", 0, 0, 0},
1475   {"@assembler",
1476    "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 0, 0},
1477   {".sx", "@assembler-with-cpp", 0, 0, 0},
1478   {".S", "@assembler-with-cpp", 0, 0, 0},
1479   {"@assembler-with-cpp",
1480 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1481    "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1482       %{E|M|MM:%(cpp_debug_options)}\
1483       %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1484        as %(asm_debug) %(asm_options) %|.s %A }}}}"
1485 #else
1486    "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1487       %{E|M|MM:%(cpp_debug_options)}\
1488       %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1489        as %(asm_debug) %(asm_options) %m.s %A }}}}"
1490 #endif
1491    , 0, 0, 0},
1492 
1493 #include "specs.h"
1494   /* Mark end of table.  */
1495   {0, 0, 0, 0, 0}
1496 };

         因为gcc命令使用后缀识别源代码,从而调用不同的工具,所以尝试向gcc命令传递一个没有后缀的文本文件是会报错的,即使文本文件的内容确实是源代码,如下所示。

$ gcc test
test: file not recognized: File format not recognized
collect2: error: ld returned 1 exit status

        下面我们以C语言举例,了解gcc命令是如何处理C源代码文件的。

// test.c
#define TT 1
int main()
{
    int a=TT;
}

        向gcc命令传递-v选项,可以让其打印其在执行期间调用的所有工具,如下所示。

$ gcc -v test.c -o test
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
COLLECT_GCC_OPTIONS='-v' '-o' 'test' '-mtune=generic' '-march=x86-64'
 /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/cc1 -quiet -v test.c -quiet -dumpbase test.c -mtune=generic -march=x86-64 -auxbase test -version -o /tmp/ccifUeJP.s
GNU C (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-39) (x86_64-redhat-linux)
	compiled by GNU C version 4.8.5 20150623 (Red Hat 4.8.5-39), GMP version 6.0.0, MPFR version 3.1.1, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../x86_64-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include
 /usr/local/include
 /usr/include
End of search list.
GNU C (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-39) (x86_64-redhat-linux)
	compiled by GNU C version 4.8.5 20150623 (Red Hat 4.8.5-39), GMP version 6.0.0, MPFR version 3.1.1, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: d8f4c208bcaf7e279b70f7290eda3265
COLLECT_GCC_OPTIONS='-v' '-o' 'test' '-mtune=generic' '-march=x86-64'
 as -v --64 -o /tmp/cceJQa5q.o /tmp/ccifUeJP.s
GNU assembler version 2.27 (x86_64-redhat-linux) using BFD version version 2.27-43.base.el7
COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/
LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'test' '-mtune=generic' '-march=x86-64'
 /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o test /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. /tmp/cceJQa5q.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o

        可以从上面的输出信息中注意到,gcc命令调用了cc1命令,这才是真正意义上的c编译器。

/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/cc1 -quiet -v test.c -quiet -dumpbase test.c -mtune=generic -march=x86-64 -auxbase test -version -o /tmp/ccifUeJP.s

        细心的你可能会发现,gcc命令并没有调用cpp(c preprocessor,C预处理器),这是因为这部分功能已经被整合进cc1命令中了。cc1命令编译的输出结果是一个汇编文件,保存为/tmp/ccifUeJP.s,因为它只是一个中间结果。

        下面gcc命令又调用了as命令,这是一个汇编器,输出结果是一个.o后缀的目标文件/tmp/cceJQa5q.o,与上面的汇编文件一样,它也是一个中间结果。

as -v --64 -o /tmp/cceJQa5q.o /tmp/ccifUeJP.s

        最后,gcc命令调用了collect2命令,这是链接器ld的一个封装,用于链接所有的目标文件,并生成最终的可执行文件test,这是我们最开始传递给gcc命令的参数。

 /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o test /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. /tmp/cceJQa5q.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o

        既然gcc命令可以处理不同语言的源代码,那为什么要针对C++语言推出g++驱动程序,对于fortran语言推出gfortran驱动程序,对于ada语言推出gnat驱动程序呢?下面以fortran语言举例说明。

! add_numbers.f90
program AddNumbers
    implicit none
    integer :: number1, number2, sum

    ! 用户输入两个整数
    print *, 'Enter two integers:'
    read *, number1, number2

    ! 计算两个数的和
    sum = number1 + number2

    ! 打印结果
    print *, 'The sum of ', number1, ' and ', number2, ' is ', sum
end program AddNumbers

        下面直接使用gcc命令编译它,输出结果如下所示。 

$ gcc -v add_numbers.f90 -o add_numbers
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
COLLECT_GCC_OPTIONS='-v' '-o' 'add_numbers' '-mtune=generic' '-march=x86-64'
 /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/f951 add_numbers.f90 -quiet -dumpbase add_numbers.f90 -mtune=generic -march=x86-64 -auxbase add_numbers -version -fintrinsic-modules-path /usr/lib/gcc/x86_64-redhat-linux/4.8.5/finclude -o /tmp/ccQACj24.s
GNU Fortran (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-39) (x86_64-redhat-linux)
	compiled by GNU C version 4.8.5 20150623 (Red Hat 4.8.5-39), GMP version 6.0.0, MPFR version 3.1.1, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
GNU Fortran (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-39) (x86_64-redhat-linux)
	compiled by GNU C version 4.8.5 20150623 (Red Hat 4.8.5-39), GMP version 6.0.0, MPFR version 3.1.1, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
COLLECT_GCC_OPTIONS='-v' '-o' 'add_numbers' '-mtune=generic' '-march=x86-64'
 as -v --64 -o /tmp/cctgPTMM.o /tmp/ccQACj24.s
GNU assembler version 2.27 (x86_64-redhat-linux) using BFD version version 2.27-43.base.el7
COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/
LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'add_numbers' '-mtune=generic' '-march=x86-64'
 /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o add_numbers /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. /tmp/cctgPTMM.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o
/tmp/cctgPTMM.o: In function `MAIN__':
add_numbers.f90:(.text+0x3f): undefined reference to `_gfortran_st_write'
add_numbers.f90:(.text+0x58): undefined reference to `_gfortran_transfer_character_write'
add_numbers.f90:(.text+0x67): undefined reference to `_gfortran_st_write_done'
add_numbers.f90:(.text+0x9f): undefined reference to `_gfortran_st_read'
add_numbers.f90:(.text+0xba): undefined reference to `_gfortran_transfer_integer'
add_numbers.f90:(.text+0xd5): undefined reference to `_gfortran_transfer_integer'
add_numbers.f90:(.text+0xe4): undefined reference to `_gfortran_st_read_done'
add_numbers.f90:(.text+0x127): undefined reference to `_gfortran_st_write'
add_numbers.f90:(.text+0x140): undefined reference to `_gfortran_transfer_character_write'
add_numbers.f90:(.text+0x15b): undefined reference to `_gfortran_transfer_integer_write'
add_numbers.f90:(.text+0x174): undefined reference to `_gfortran_transfer_character_write'
add_numbers.f90:(.text+0x18f): undefined reference to `_gfortran_transfer_integer_write'
add_numbers.f90:(.text+0x1a8): undefined reference to `_gfortran_transfer_character_write'
add_numbers.f90:(.text+0x1c3): undefined reference to `_gfortran_transfer_integer_write'
add_numbers.f90:(.text+0x1d2): undefined reference to `_gfortran_st_write_done'
/tmp/cctgPTMM.o: In function `main':
add_numbers.f90:(.text+0x1f4): undefined reference to `_gfortran_set_args'
add_numbers.f90:(.text+0x203): undefined reference to `_gfortran_set_options'
collect2: error: ld returned 1 exit status

        从上面的输出中可以看出,在对fortran文件进行预处理、汇编、编译、链接的过程中,gcc命令调用了f951编译器,as汇编器和collect2链接器,但是在最后的链接阶段却报错了,错误原因是ld找不到Fortran运行时库中的一些必要函数,如_gfortran_st_write等。

        这可以通过向gcc命令传递一些选项来解决,如下所示。

$ gcc -v add_numbers.f90 -lgfortran -o add_numbers
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
COLLECT_GCC_OPTIONS='-v' '-o' 'add_numbers' '-mtune=generic' '-march=x86-64'
 /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/f951 add_numbers.f90 -quiet -dumpbase add_numbers.f90 -mtune=generic -march=x86-64 -auxbase add_numbers -version -fintrinsic-modules-path /usr/lib/gcc/x86_64-redhat-linux/4.8.5/finclude -o /tmp/cc4GFhEz.s
GNU Fortran (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-39) (x86_64-redhat-linux)
	compiled by GNU C version 4.8.5 20150623 (Red Hat 4.8.5-39), GMP version 6.0.0, MPFR version 3.1.1, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
GNU Fortran (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-39) (x86_64-redhat-linux)
	compiled by GNU C version 4.8.5 20150623 (Red Hat 4.8.5-39), GMP version 6.0.0, MPFR version 3.1.1, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
COLLECT_GCC_OPTIONS='-v' '-o' 'add_numbers' '-mtune=generic' '-march=x86-64'
 as -v --64 -o /tmp/ccS7OrZX.o /tmp/cc4GFhEz.s
GNU assembler version 2.27 (x86_64-redhat-linux) using BFD version version 2.27-43.base.el7
COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/
LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'add_numbers' '-mtune=generic' '-march=x86-64'
 /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o add_numbers /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. /tmp/ccS7OrZX.o -lgfortran -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o
$ ./add_numbers 
Enter two integers:
1
2
The sum of            1  and            2  is            3

        如果使用gfortran命令,则无需添加选项,如下所示。

$ gfortran -v add_numbers.f90 -o add_numbers
Driving: gfortran -v add_numbers.f90 -o add_numbers -l gfortran -l m -shared-libgcc
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
COLLECT_GCC_OPTIONS='-v' '-o' 'add_numbers' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/f951 add_numbers.f90 -quiet -dumpbase add_numbers.f90 -mtune=generic -march=x86-64 -auxbase add_numbers -version -fintrinsic-modules-path /usr/lib/gcc/x86_64-redhat-linux/4.8.5/finclude -o /tmp/ccOxqcS0.s
GNU Fortran (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-39) (x86_64-redhat-linux)
	compiled by GNU C version 4.8.5 20150623 (Red Hat 4.8.5-39), GMP version 6.0.0, MPFR version 3.1.1, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
GNU Fortran (GCC) version 4.8.5 20150623 (Red Hat 4.8.5-39) (x86_64-redhat-linux)
	compiled by GNU C version 4.8.5 20150623 (Red Hat 4.8.5-39), GMP version 6.0.0, MPFR version 3.1.1, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
COLLECT_GCC_OPTIONS='-v' '-o' 'add_numbers' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
 as -v --64 -o /tmp/cc4yjj1R.o /tmp/ccOxqcS0.s
GNU assembler version 2.27 (x86_64-redhat-linux) using BFD version version 2.27-43.base.el7
Reading specs from /usr/lib/gcc/x86_64-redhat-linux/4.8.5/libgfortran.spec
rename spec lib to liborig
COLLECT_GCC_OPTIONS='-v' '-o' 'add_numbers' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/
LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'add_numbers' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o add_numbers /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. /tmp/cc4yjj1R.o -lgfortran -lm -lgcc_s -lgcc -lquadmath -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o

标签:gcc,驱动程序,..,--,4.8,C语言,64,x86
From: https://blog.csdn.net/weixin_45791458/article/details/139505557

相关文章

  • 【C语言】指针(4)
    一、回顾 在这之前,我们学习了很多关于指针的内容,我们先在这里简单的回顾一下。1、一级指针int*p;  --整形指针-指向整形的指针 char*p;...void*p;......2、二级指针int**p; char**p;...3、数组指针--指向数组的指针int(*p)[];intmain(){......
  • C语言杂谈:函数栈帧,函数调用时到底发生了什么
            我们都知道在调用函数时,要为函数在栈上开辟空间,函数后续内容都会在栈帧空间中保存,如非静态局部变量,返回值等。这段空间就叫栈帧。    当函数调用,就会开辟栈帧空间,函数返回时,栈帧空间就会被释放。这里的释放并非清空,而是让其无效化,可以后续的使用。1,......
  • 001__C语言程序入门
    一、第一个程序:helloworld配置部署好vsCode之后,就可以直接在上面写代码了,新建一个新的C程序文件,向屏幕输出一串字符“HelloWorld!”下面,从整体上来分析一下这个最简单的C语言程序,将这个最简程序的各个部分剖析清楚,明白我们写下的每一个字符的具体含义。二、C语言的基本结......
  • C语言—字符函数和字符串函数
    1.字符分类函数C语言中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。这些函数的使用都需要包含一个头文件ctype.h。例:将一句话中的小写字母改成大写字母。2.字符转换函数头文件:ctype.hC语言提供了2个字符转换函数:int tolower(intc);//将......
  • C语言 | 字符串函数(第二篇)【全网最详细,通俗易懂,必收藏】
    字符串函数(第二篇)一、strncpy1、strncpy的使用2、strncpy的模拟实现二、strncat1、strncat的使用2、strncat的模拟实现三、strncmp1、strncmp的使用2、strncmp的模拟实现四、strstr1、strstr的使用2、strstr的模拟实现一、strncpy1、strncpy的使用char*strnc......
  • C语言 | 找出单身狗2代码实现【全网最详细】
    找出单身狗2的代码实现一、单身狗1代码回顾1.1题目1.2代码实现思路1.3代码实现:二.单身狗22.1题目2.2代码实现的大思路2.3分组的具体步骤2.4代码的实现一、单身狗1代码回顾1.1题目有一个数组只有一个数字出现一次,其余数字都是成对出现的编写一个函数找......
  • static 在c语言中的价值
    1.概要static在c语言中的价值。static还有一个在文件内部使用有效的限制。如果在函数的外部,被static修饰的变量或者函数,是不可以在文件外部访问的,也就是说不同的文件中,被static修饰的函数或者变量是可以重名的。static的这个特性,在c++中显得有些鸡肋,但在c中的价值却很大,几......
  • TCP通信——基于C语言连接
    设计两个程序分别作为服务器和客户端,互相进行连接服务器/*************************************************************************************************************************** filename: tcp_server.c* author :Dazz* date :2024/6/5* functio......
  • 完全指南:C语言学习资源汇总
    C语言是编程学习的基石,无论是为了职业发展还是个人兴趣,掌握C语言都是技术生涯的重要一步。为了帮助初学者和有经验的程序员更好地学习和深化对C语言的理解,我们汇总了一系列优秀的书籍和在线资源。这些资源将帮助你从基础知识到高级概念,全面掌握C语言。推荐书籍1.《C语言入门......
  • C语言数据结构实现-单链表表基本操作
    链表插入元素同顺序表一样,向链表中增添元素,根据添加位置不同,可分为以下3种情况:插入到链表的头部(头节点之后),作为首元节点;插入到链表中间的某个位置;插入到链表的最末端,作为链表中最后一个数据元素;虽然新元素的插入位置不固定,但是链表插入元素的思想是固定的,只需做以下两步操......