我坚持使用以下两个文件,即Mcrt1.o和Scrt1.o。 任何人都可以帮助让我知道这两个文件是什么。 如何使用它? 以gcrt1.o为例,在使用-pg选项编译性能testing时,这非常有用。 谢谢
*crt*.o
格式的文件总是C运行时启动代码(C运行库的大部分往往存在于库中,启动代码是一个总是需要的对象文件)。
各种类型的描述可以在这里找到,下面复制,使答案自成一体。 首先是一些定义:
Mini FAQ about the misc libc/gcc crt files. Some definitions: PIC - position independent code (-fPIC) PIE - position independent executable (-fPIE -pie) crt - C runtime
然后,各种启动对象文件:
crt0.o Older style of the initial runtime code ? Usually not generated anymore with Linux toolchains, but often found in bare metal toolchains. Serves same purpose as crt1.o (see below). crt1.o Newer style of the initial runtime code. Contains the _start symbol which sets up the env with argc/argv/libc _init/libc _fini before jumping to the libc main. glibc calls this file 'start.S'. crti.o Defines the function prolog; _init in the .init section and _fini in the .fini section. glibc calls this 'initfini.c'. crtn.o Defines the function epilog. glibc calls this 'initfini.c'. Scrt1.o Used in place of crt1.o when generating PIEs. gcrt1.o Used in place of crt1.o when generating code with profiling information. Compile with -pg. Produces output suitable for the gprof util. Mcrt1.o Like gcrt1.o, but is used with the prof utility. glibc installs this as a dummy file as it's useless on linux systems.
还有一些:
crtbegin.o GCC uses this to find the start of the constructors. crtbeginS.o Used in place of crtbegin.o when generating shared objects/PIEs. crtbeginT.o Used in place of crtbegin.o when generating static executables. crtend.o GCC uses this to find the start of the destructors. crtendS.o Used in place of crtend.o when generating shared objects/PIEs.
最后,常用链接顺序:
General linking order: crt1.o crti.o crtbegin.o [-L paths] [user objects] [gcc libs] [C libs] [gcc libs] crtend.o crtn.o