📜  编译后的C文件类型(1)

📅  最后修改于: 2023-12-03 15:11:42.702000             🧑  作者: Mango

编译后的C文件类型

在C语言中,源代码是以文本形式存在的,需要通过编译器将其转换成可执行文件或者静态库等可执行文件类型。编译后的C文件类型可以是不同的,本文将介绍常用的四种类型。

1. 可执行文件(Executable File)

可执行文件是指经过编译和链接后生成的文件,也称为二进制文件。它包含着程序的全部实现代码和数据,可以直接运行。

可执行文件的格式取决于操作系统,例如Windows系统使用PE格式,Linux系统使用ELF格式。可执行文件的扩展名也不同,Windows系统使用.exe,Linux系统没有特定的扩展名,一般以无扩展名的形式存在。

在Linux系统中,可以使用objdump命令查看可执行文件的相关信息,例如:

$ objdump -f a.out

a.out:     file format elf64-x86-64
architecture: i386:x86-64, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x00000000004003f0

可执行文件无需其他文件支持就可以直接运行,是最常用的文件类型。

2. 目标文件(Object File)

目标文件是指编译器把源代码编译成的机器代码,但是还没有经过链接。目标文件包含了程序的指令和数据,但是缺少外部函数和变量的信息,也未进行重定位处理。这种文件类型可以作为静态库的组成部分,或者作为动态库的中间文件。

目标文件的格式也因平台而异,例如Windows系统使用COFF格式,Linux系统使用ELF格式。目标文件的扩展名一般为.obj或者.o。

在Linux系统中,可以使用objdump命令查看目标文件的相关信息,例如:

$ objdump -x foo.o

foo.o:     file format elf64-x86-64
foo.o
architecture: i386:x86-64, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x0000000000000000

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         00000028  0000000000000000  0000000000000000  00000040  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000000  0000000000000000  0000000000000028  00000068  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  0000000000000000  0000000000000028  00000068  2**0
                  ALLOC
  3 .rodata       00000006  0000000000000000  0000000000000028  00000068  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
3. 静态库文件(Static Library File)

静态库文件是指将多个目标文件打包成一个文件,其中也包含了函数和变量的定义。这种文件不会被连接器自动链接,需要手动调用编译器进行链接。

静态库文件的扩展名为.lib(Windows系统)或.a(Linux系统),可以使用ar命令对其进行打包、解包和查询,例如:

# 打包
$ ar rcs libfoo.a foo1.o foo2.o

# 解包
$ ar -x libfoo.a

# 查询
$ ar -t libfoo.a
foo1.o
foo2.o
4. 动态库文件(Dynamic Library File)

动态库文件是指被多个应用程序共享的文件,它的代码和数据在运行时才会被加载。与静态库不同,动态库一般不会被打包到可执行文件中,而是以独立的文件存在。因为动态库是在运行时加载的,所以它可以动态更新,同时还能节省系统内存。

动态库文件的扩展名为.dll(Windows系统)或.so(Linux系统),可以使用ldd命令查看可执行文件依赖的动态库,例如:

$ ldd a.out
        linux-vdso.so.1 =>  (0x00007ffd45182000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fcf5b2fb000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcf5af0e000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fcf5b514000)

以上就是编译后的C文件类型的介绍,不同的文件类型在执行方式和使用场景上都有所不同,程序员需要根据具体需求选择合适的文件类型。