What exactly happened behind gcc-static hello. c?
You may often use gcc-static ***. c. What commands and libraries are used for this static link?
First, let's analyze what libc. a is. We already know that xxx. so is a dynamic link library, xxx. o is a static link library or relocated file, And/bin/bash is an executable file.
Libc. a is actually a collection of many relocated files, and generally only one function is written in each relocated file. For example, printf. o only has one printf function to link less useless libraries during static connections.
First use the command locate libc. a, we will find libc. a is located in/usr/lib/x86_64-linux-gnu/libc. a, and then use the command ar-t libc. a to check the number of relocable files. You can give it a try. There are a lot of relocated files in it, and one screen won't be displayed. This includes printf. o.
Run the ar-x libc. a command to decompress the file and find the printf. o file. Run the nm printf. o command. The following result is displayed:
Once again, it is confirmed that printf. o only has one printf function. The purpose is to link less useless libraries during static connections.
Below we attach the source code hello. c:
#include
int main(){printf("HelloWorld\n");return 0;}
Run the gcc-static -- verbose-fno-builtin hello. c, -- verbose command to enter the compilation details.-fno-builtin prevents the compiler from converting printf to puts. The result is as follows:
Using built-in specs.
COLLECT_GCC = gcc
COLLECT_LTO_WRAPPER =/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper
Target: x86_64-linux-gnu
Configured :.. /src/configure-v -- with-pkgversion = 'ubuntu/Linaro 4.6.3-1ubuntu5' -- with-bugurl = file: // usr/share/doc/gcc-4.6/README. bugs -- enable-languages ages = c, c ++, fortran, objc, obj-c ++ -- prefix =/usr -- program-suffix =-4.6 -- enable-shared -- enable-linker-build-id -- with-system-zlib -- libexecdir =/usr /lib -- without-included-gettext -- enable-threads = posix -- with-gxx-include-dir =/usr/include/c ++/4.6 -- libdir =/usr/lib -- enable-nls -- with-sysroot =/-- enable-clocale = gnu -- enable-libstdcxx-debug -- enable-libstdcxx-time = yes -- enable-gnu-unique-object -- enable -plugin -- enable-objc-gc -- disable-werror -- with-arch-32 = i686 -- with-tune = generic -- enable-checking = release -- build = x86_64-linux-gnu -- host = x86_64-linux-gnu -- target = x86_64-linux-gnu
Thread model: posix
Gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
COLLECT_GCC_OPTIONS = '-static ''-v''-fno-builtin''-mtune = generic ''-march = x86-64'
/Usr/lib/gcc/x86_64-linux-gnu/4.6/PC3-quiet-v-imultilib. -imultiarch x86_64-linux-gnu hello. c-quiet-dumpbase hello. c-mtune = generic-march = x86-64-auxbase hello-version-fno-builtin-fstack-protector-o/tmp/ccrSGv2J. s
Gnu c (Ubuntu/Linaro 4.6.3-1ubuntu5) version 4.6.3 (x86_64-linux-gnu)
Compiled by gnu c version 4.6.3, GMP version 5.0.2, MPFR version 3.1.0-p3, MCM version 0.9
GGC heuristics: -- param ggc-min-expand = 100 -- param ggc-min-heapsize = 131072
Ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
Ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.6/.../x86_64-linux-gnu/include"
# Include "..." search starts here:
# Include <...> search starts here:
/Usr/lib/gcc/x86_64-linux-gnu/4.6/include
/Usr/local/include
/Usr/lib/gcc/x86_64-linux-gnu/4.6/include-fixed
/Usr/include/x86_64-linux-gnu
/Usr/include
End of search list.
Gnu c (Ubuntu/Linaro 4.6.3-1ubuntu5) version 4.6.3 (x86_64-linux-gnu)
Compiled by gnu c version 4.6.3, GMP version 5.0.2, MPFR version 3.1.0-p3, MCM version 0.9
GGC heuristics: -- param ggc-min-expand = 100 -- param ggc-min-heapsize = 131072
Compiler executable checksum: 75e879ed14f91af504f4150eadeaa0e6
COLLECT_GCC_OPTIONS = '-static ''-v''-fno-builtin''-mtune = generic ''-march = x86-64'
As -- 64-o/tmp/cc5x9Ffe. o/tmp/ccrSGv2J. s
COMPILER_PATH =/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu /: /usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH =/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/4.6 /.. /.. /.. /x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.6 /.. /.. /.. /.. /lib/:/lib/x86_64-linux-gnu //:/lib /.. /lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib /.. /lib/:/usr/lib/gcc/x86_64-linux-gnu/4.6 /.. /.. /.. /:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS = '-static ''-v''-fno-builtin''-mtune = generic ''-march = x86-64'
/Usr/lib/gcc/x86_64-linux-gnu/4.6/collect2 -- sysroot =/-- build-id -- no-add-needed -- as-needed-m elf_x86_64 -- hash-style = gnu- static-z relro/usr/lib/gcc/x86_64-linux-gnu/4.6 /.. /.. /.. /x86_64-linux-gnu/crt1.o/usr/lib/gcc/x86_64-linux-gnu/4.6 /.. /.. /.. /x86_64-linux-gnu/crti. o/usr/lib/gcc/x86_64-linux-gnu/4.6/crtbeginT. o-L/usr/lib/gcc/x86_64-linux-gnu/4.6-L/usr/lib/gcc/x86_64-linux-gnu/4.6 /.. /.. /.. /x86_64-linux-gnu-L/usr/lib/gcc/x86_64-linux-gnu/4.6 /.. /.. /.. /.. /lib-L/lib/x86_64-linux-gnu-L/lib /.. /lib-L/usr/lib/x86_64-linux-gnu-L/usr/lib /.. /lib-L/usr/lib/gcc/x86_64-linux-gnu/4.6 /.. /.. /.. /tmp/cc5x9Ffe. o -- start-group-lgcc-lgcc_eh-lc -- end-group/usr/lib/gcc/x86_64-linux-gnu/4.6/crtend. o/usr/lib/gcc/x86_64-linux-gnu/4.6 /.. /.. /.. /x86_64-linux-gnu/crtn. o
The red text above
Step 1: compile and use command to compile hello. c into/tmp/ccrSGv2J. s.
Step 2: Compile and run the as command to generate/tmp/cc5x9Ffe. o from/tmp/ccrSGv2J. s.
Step 3: Link to the static Link Library of/tmp/cc5x9Ffe. o with the command collect2 (which can be regarded as an upgraded ld.
So far, the story behind gcc-static hello. c has been analyzed. This article will refer to the self-cultivation of programmers.