I have a Linux Ubuntu(20.04) machine with gcc and clang installed. I figured out the directory containing the default linker script:
/usr/lib/x86_64-linux-gnu/ldscripts$ ls
elf32_x86_64.x elf32_x86_64.xsw elf_i386.xr elf_iamcu.xde elf_k1om.xc elf_k1om.xu elf_l1om.xsc elf_x86_64.xdwe i386pep.xn
elf32_x86_64.xbn elf32_x86_64.xswe elf_i386.xs elf_iamcu.xdw elf_k1om.xce elf_k1om.xw elf_l1om.xsce elf_x86_64.xe i386pep.xr
elf32_x86_64.xc elf32_x86_64.xu elf_i386.xsc elf_iamcu.xdwe elf_k1om.xd elf_k1om.xwe elf_l1om.xse elf_x86_64.xn i386pep.xu
elf32_x86_64.xce elf32_x86_64.xw elf_i386.xsce elf_iamcu.xe elf_k1om.xdc elf_l1om.x elf_l1om.xsw elf_x86_64.xr i386pe.x
elf32_x86_64.xd elf32_x86_64.xwe elf_i386.xse elf_iamcu.xn elf_k1om.xdce elf_l1om.xbn elf_l1om.xswe elf_x86_64.xs i386pe.xa
elf32_x86_64.xdc elf_i386.x elf_i386.xsw elf_iamcu.xr elf_k1om.xde elf_l1om.xc elf_l1om.xu elf_x86_64.xsc i386pe.xbn
elf32_x86_64.xdce elf_i386.xbn elf_i386.xswe elf_iamcu.xs elf_k1om.xdw elf_l1om.xce elf_l1om.xw elf_x86_64.xsce i386pe.xe
elf32_x86_64.xde elf_i386.xc elf_i386.xu elf_iamcu.xsc elf_k1om.xdwe elf_l1om.xd elf_l1om.xwe elf_x86_64.xse i386pe.xn
elf32_x86_64.xdw elf_i386.xce elf_i386.xw elf_iamcu.xsce elf_k1om.xe elf_l1om.xdc elf_x86_64.x elf_x86_64.xsw i386pe.xr
elf32_x86_64.xdwe elf_i386.xd elf_i386.xwe elf_iamcu.xse elf_k1om.xn elf_l1om.xdce elf_x86_64.xbn elf_x86_64.xswe i386pe.xu
elf32_x86_64.xe elf_i386.xdc elf_iamcu.x elf_iamcu.xsw elf_k1om.xr elf_l1om.xde elf_x86_64.xc elf_x86_64.xu
elf32_x86_64.xn elf_i386.xdce elf_iamcu.xbn elf_iamcu.xswe elf_k1om.xs elf_l1om.xdw elf_x86_64.xce elf_x86_64.xw
elf32_x86_64.xr elf_i386.xde elf_iamcu.xc elf_iamcu.xu elf_k1om.xsc elf_l1om.xdwe elf_x86_64.xd elf_x86_64.xwe
elf32_x86_64.xs elf_i386.xdw elf_iamcu.xce elf_iamcu.xw elf_k1om.xsce elf_l1om.xe elf_x86_64.xdc i386pep.x
elf32_x86_64.xsc elf_i386.xdwe elf_iamcu.xd elf_iamcu.xwe elf_k1om.xse elf_l1om.xn elf_x86_64.xdce i386pep.xa
elf32_x86_64.xsce elf_i386.xe elf_iamcu.xdc elf_k1om.x elf_k1om.xsw elf_l1om.xr elf_x86_64.xde i386pep.xbn
elf32_x86_64.xse elf_i386.xn elf_iamcu.xdce elf_k1om.xbn elf_k1om.xswe elf_l1om.xs elf_x86_64.xdw i386pep.xe
Can someone explain what is with the extension .x , .xdw , .xe, etc ? What do they tell about the linker script and why do they exist ?
How does the default linker script know the sections it must amalgamate ? Is there any documentation/consortium of sort where people gather to identify the list of sections an elf file must contain ? Put it other way: how was it determined that these are the sections any elf based executable/library must have on a Linux system ? I get the .data, .text, .bss but what about the other sections(debug, interp, ini, fini, hash, ctors, dtors, ldata, lbss, stab, etc..) I see listed, who decided to put them in, for what purpose and where is it documented ? Where is the official list of the purpose of each section ?
What is the definition of a well formed elf binary ?
For
lld
the linker provided by clang, why is there no list of default linker scripts ? When I compile a simple C program using thelld
linker with verbose output I do NOT see the default linker script used as shown when using theld
.
clang main.c -fuse-ld=lld -Wl,--verbose
ld.lld: /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crt1.o
ld.lld: /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o
ld.lld: /usr/bin/../lib/gcc/x86_64-linux-gnu/9/crtbegin.o
ld.lld: /tmp/main-bafb70.o
ld.lld: /usr/bin/../lib/gcc/x86_64-linux-gnu/9/libgcc.a
ld.lld: /usr/bin/../lib/gcc/x86_64-linux-gnu/9/libgcc_s.so
ld.lld: /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libgcc_s.so.1
ld.lld: /usr/bin/../lib/gcc/x86_64-linux-gnu/9/libgcc.a
ld.lld: /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libc.so
ld.lld: /lib/x86_64-linux-gnu/libc.so.6
ld.lld: /usr/lib/x86_64-linux-gnu/libc_nonshared.a
ld.lld: /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
ld.lld: /usr/bin/../lib/gcc/x86_64-linux-gnu/9/libgcc.a
ld.lld: /usr/bin/../lib/gcc/x86_64-linux-gnu/9/libgcc_s.so
ld.lld: /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libgcc_s.so.1
ld.lld: /usr/bin/../lib/gcc/x86_64-linux-gnu/9/libgcc.a
ld.lld: /usr/bin/../lib/gcc/x86_64-linux-gnu/9/crtend.o
ld.lld: /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o
vs
$clang main.c -fuse-ld=ld -Wl,--verbose
GNU ld (GNU Binutils for Ubuntu) 2.34
Supported emulations:
elf_x86_64
elf32_x86_64
elf_i386
elf_iamcu
elf_l1om
elf_k1om
i386pep
i386pe
using internal linker script:
==================================================
/* Script for -z combreloc -z separate-code */
/* Copyright (C) 2014-2020 Free Software Foundation, Inc.
Copying and distribution of this script, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. */
OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64",
"elf64-x86-64")
OUTPUT_ARCH(i386:x86-64)
ENTRY(_start)
SEARCH_DIR("=/usr/local/lib/x86_64-linux-gnu"); SEARCH_DIR("=/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/lib/x86_64-linux-gnu64"); SEARCH_DIR("=/usr/local/lib64"); SEARCH_DIR("=/lib64"); SEARCH_DIR("=/usr/lib64"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib"); SEARCH_DIR("=/usr/x86_64-linux-gnu/lib64"); SEARCH_DIR("=/usr/x86_64-linux-gnu/lib");
SECTIONS
{
PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000)); . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS;
.interp : { *(.interp) }
.note.gnu.build-id : { *(.note.gnu.build-id) }
.hash : { *(.hash) }
.gnu.hash : { *(.gnu.hash) }
.
.
.
.
- Is the list of sections produced by clang vs gcc universally the same ? Is there any disparity ? Is the list of sections produced toolchain/platform/arch specific ? If so where can I get it from clang/gcc documentation ?
lld
is a completely different beast compared told
. So aregold
andmold
. There are overlaps in functionality, but they have quite different internals. Just likeclang
is always a cross-compiler by default, while for GCC things are quite different and usually specific toolchains have to be built to target different platforms/architectures. You should check out the binutils source if you really want to delve in. You may also want to split up your questions by topic instead of cramming everything into a single "question".