Linkers & Loaders Sai Rahul Reddy P, M.Tech 2nd year, SIT, IIT Kharagpur. http://blog.sairahul.com
11/14/09
Linkers & Loaders
1
Basics
Compiler in Action… gcc foo.c bar.c –o a.out
foo.c
bar.c run preprocessor (cpp) & compiler proper (cc1)
gcc –S
gcc –S
foo.s
bar.s run assembler (as)
as
foo.o
as
bar.o linker
ld
ld
a.out a.out = fully linked executable 11/14/09
Linkers & Loaders
2
11/14/09
Linkers & Loaders
3
What is Linker ?
Combines multiple relocatable object files Produces fully linked executable – directly loadable in memory
How? Symbol resolution – associating one symbol definition with each symbol reference Relocation – relocating different sections of input relocatable files
11/14/09
Linkers & Loaders
4
Linkers vs. Loaders Linkers and loaders perform various related but conceptually different tasks: Program Loading: This refers to copying a program image from hard disk to the main memory in order to put the program in a ready-to-run state. In some cases, program loading also might involve allocating storage space or mapping virtual addresses to disk pages. Relocation: Compilers and assemblers generate the object code for each input module with a starting address of zero. Relocation is the process of assigning load addresses to different parts of the program by merging all sections of the same type into one section. The code and data section also are adjusted so they point to the correct runtime addresses. Symbol Resolution: A program is made up of multiple subprograms; reference of one subprogram to another is made through symbols. A linker's job is to resolve the reference by noting the symbol's location and patching the caller's object code.
11/14/09
Linkers & Loaders
5
Symbol Resolution
Global symbols defined by the module and referenced by other modules. All non-static functions and global variables fall in this category. Global symbols referenced by the input module but defined elsewhere. All functions and variables with extern declaration fall in this category. Local symbols defined and referenced exclusively by the input module. All static functions and static variables fall here.
Linker Resolves the symbols using the following rules
Multiple strong symbols are not allowed. Given a single strong symbol and multiple weak symbols, choose the strong symbol. Given multiple weak symbols, choose any of the weak symbols.
11/14/09
Linkers & Loaders
6
Linking
11/14/09
Linkers & Loaders
7
Linking
11/14/09
Linkers & Loaders
8
Object files file1.c: #include <stdio.h> char a[] = "Hello"; extern void bar(); int main() { bar(); } void baz(char *s) { printf("%s", s); }
Sections: Idx Name 0 .text
Size VMA LMA File off Algn 0000003e 00000000 00000000 00000034 2**2 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 1 .data 00000006 00000000 00000000 00000074 2**2 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000000 00000000 00000000 0000007c 2**2 ALLOC 3 .rodata 00000003 00000000 00000000 0000007c 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA SYMBOL TABLE: 00000000 l df *ABS* 00000000 file1.c 00000000 l d .text 00000000 00000000 l d .data 00000000 00000000 l d .bss 00000000 00000000 l d .rodata 00000000 00000000 l d .note.GNU-stack 00000000 00000000 l d .comment 00000000 00000000 g O .data 00000006 a 00000000 g F .text 00000023 main 00000000 *UND* 00000000 bar 00000023 g F .text 0000001b baz 00000000 *UND* 00000000 printf RELOCATION RECORDS FOR [.text]: OFFSET TYPE VALUE 0000001d R_386_PC32 bar 00000030 R_386_32 .rodata 00000035 R_386_PC32 printf
11/14/09
Linkers & Loaders
9
Object files Sections: Idx Name 0 .text
file2.c: #include <stdio.h> extern char a[]; static char b[6]; void bar() { strcpy(b, a); baz(b); }
11/14/09
Size VMA LMA File off Algn 0000002d 00000000 00000000 00000034 2**2 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 1 .data 00000000 00000000 00000000 00000064 2**2 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000006 00000000 00000000 00000064 2**2 ALLOC 3 .note.GNU-stack 00000000 00000000 00000000 00000064 2**0 CONTENTS, READONLY 4 .comment 00000031 00000000 00000000 00000064 2**0 CONTENTS, READONLY SYMBOL TABLE: 00000000 l df *ABS* 00000000 file2.c 00000000 l d .text 00000000 00000000 l d .data 00000000 00000000 l d .bss 00000000 00000000 l O .bss 00000006 b 00000000 l d .note.GNU-stack 00000000 00000000 l d .comment 00000000 00000000 g F .text 0000002d bar 00000000 *UND* 00000000 a 00000000 *UND* 00000000 strcpy 00000000 *UND* 00000000 baz RELOCATION RECORDS FOR [.text]: OFFSET TYPE VALUE 0000000a R_386_32 a 0000000f R_386_32 .bss 00000014 R_386_PC32 strcpy 0000001f R_386_32 .bss 00000024 R_386_PC32 baz
Linkers & Loaders
10
Before and After Linking 00000000 <main>: 0: 55 1: 89 e5 3: 83 ec 08 6: 83 e4 f0 9: b8 00 00 00 00 e: 83 c0 0f 11: 83 c0 0f 14: c1 e8 04 17: c1 e0 04 1a: 29 c4 1c: e8 fc ff ff ff 21: c9 22: c3
push %ebp mov %esp,%ebp sub $0x8,%esp and $0xfffffff0,%esp mov $0x0,%eax add $0xf,%eax add $0xf,%eax shr $0x4,%eax shl $0x4,%eax sub %eax,%esp call 1d <main+0x1d> leave ret
00000023 : 23: 55 push %ebp 24: 89 e5 mov %esp,%ebp 26: 83 ec 08 sub $0x8,%esp 29: 83 ec 08 sub $0x8,%esp 2c: ff 75 08 pushl 0x8(%ebp) 2f: 68 00 00 00 00 push $0x0 34: e8 fc ff ff ff call 35 39: 83 c4 10 add $0x10,%esp 3c: c9 leave 3d: c3 ret
11/14/09
080483a0 <main>: 80483a0: 55 push %ebp 80483a1: 89 e5 mov %esp,%ebp 80483a3: 83 ec 08 sub $0x8,%esp 80483a6: 83 e4 f0 and $0xfffffff0,%esp 80483a9: b8 00 00 00 00 mov $0x0,%eax 80483ae: 83 c0 0f add $0xf,%eax 80483b1: 83 c0 0f add $0xf,%eax 80483b4: c1 e8 04 shr $0x4,%eax 80483b7: c1 e0 04 shl $0x4,%eax 80483ba: 29 c4 sub %eax,%esp 80483bc: e8 1f 00 00 00 call 80483e0 80483c1: c9 leave 80483c2: c3 ret 080483c3 : 80483c3: 55 80483c4: 89 e5 80483c6: 83 ec 08 80483c9: 83 ec 08 80483cc: ff 75 08 80483cf: 68 f0 84 04 08 80483d4: e8 ff fe ff ff 80483d9: 83 c4 10 80483dc: c9 80483dd: c3 80483de: 90 80483df: 90
Linkers & Loaders
push %ebp mov %esp,%ebp sub $0x8,%esp sub $0x8,%esp pushl 0x8(%ebp) push $0x80484f0 call 80482d8 <printf@plt> add $0x10,%esp leave ret nop nop
11
Linking: Example file1.c: #include <stdio.h> char a[] = "Hello"; extern void bar(); int main() { bar(); } void baz(char *s) { printf("%s", s); }
11/14/09
080483a0 <main>: 80483a0: 55 80483a1: 89 e5 80483a3: 83 ec 08 80483a6: 83 e4 f0 80483a9: b8 00 00 00 00 80483ae: 83 c0 0f 80483b1: 83 c0 0f 80483b4: c1 e8 04 80483b7: c1 e0 04 80483ba: 29 c4 80483bc: e8 1f 00 00 00 80483c1: c9 80483c2: c3 080483c3 : 80483c3: 55 80483c4: 89 e5 80483c6: 83 ec 08 80483c9: 83 ec 08 80483cc: ff 75 08 80483cf: 68 f0 84 04 08 80483d4: e8 ff fe ff ff 80483d9: 83 c4 10 80483dc: c9 80483dd: c3 80483de: 90 80483df: 90
Linkers & Loaders
push %ebp mov %esp,%ebp sub $0x8,%esp and $0xfffffff0,%esp mov $0x0,%eax add $0xf,%eax add $0xf,%eax shr $0x4,%eax shl $0x4,%eax sub %eax,%esp call 80483e0 leave ret push %ebp mov %esp,%ebp sub $0x8,%esp sub $0x8,%esp pushl 0x8(%ebp) push $0x80484f0 call 80482d8 <printf@plt> add $0x10,%esp leave ret nop nop
12
Linking: Example
file2.c: #include <stdio.h> extern char a[]; static char b[6]; void bar() { strcpy(b, a); baz(b); }
11/14/09
080483e0 : 80483e0: 55 push %ebp 80483e1: 89 e5 mov %esp,%ebp 80483e3: 83 ec 08 sub $0x8,%esp 80483e6: 83 ec 08 sub $0x8,%esp 80483e9: 68 fc 95 04 08 push $0x80495fc 80483ee: 68 08 96 04 08 push $0x8049608 80483f3: e8 f0 fe ff ff call 80482e8 <strcpy@plt> 80483f8: 83 c4 10 add $0x10,%esp 80483fb: 83 ec 0c sub $0xc,%esp 80483fe: 68 08 96 04 08 push $0x8049608 8048403: e8 bb ff ff ff call 80483c3 8048408: 83 c4 10 add $0x10,%esp 804840b: c9 leave 804840c: c3 ret 804840d: 90 nop 804840e: 90 nop 804840f: 90 nop
Linkers & Loaders
13
Object File Formats
.com (no relocation information. Program starts at fixed location 0x100) .exe format char signature[2] = "MZ";// magic number short lastsize; // # bytes used in last block short nblocks; // number of 512 byte blocks short nreloc; // number of relocation entries short hdrsize; // size of file header in 16 byte paragraphs short minalloc; // minimum extra memory to allocate short maxalloc; // maximum extra memory to allocate void far *sp; // initial stack pointer short checksum; // ones complement of file sum void far *ip; // initial instruction pointer short relocpos; // location of relocation fixup table short noverlay; // Overlay number, 0 for program char extra[]; // extra material for overlays, etc. void far *relocs[]; // relocation entries, starts at relocpos
11/14/09
Linkers & Loaders
14
ELF Object Format
11/14/09
Linkers & Loaders
15
ELF Object Format ELF Header char magic[4] = "\177ELF";// magic number char class; // address size, 1 = 32 bit, 2 = 64 bit char byteorder; // 1 = little-endian, 2 = big-endian char hversion; // header version, always 1 char pad[9]; short filetype; // 1 = relocatable, 2 = executable, 3 = shared object, 4 = core image short archtype; // 2 = SPARC, 3 = x86, 4 = 68K, etc. int fversion; // file version, always 1 int entry; // entry point if executable int phdrpos; // file position of program header or 0 int shdrpos; // file position of section header or 0 int flags; // architecture specific flags, usually 0 short hdrsize; // size of this ELF header short phdrent; // size of an entry in program header short phdrcnt; // number of entries in program header or 0 short shdrent; // size of an entry in section header short phdrcnt; // number of entries in section header or 0 short strsec; // section number that contains section name strings 11/14/09
Linkers & Loaders
16
ELF Object Format
#include<stdio.h> #include<math.h> int abc; int main() { int a = 25; int b; printf("Hello World: %f\n",sqrt(a)); }
Example C file considered in the following discussion
11/14/09
Linkers & Loaders
17
ELF Object Format
Sample ELF Header 11/14/09
Linkers & Loaders
18
ELF Object Format Section Header int int int int int int int int int int
sh_name; // name, index into the string table sh_type; // section type sh_flags; // flag bits, below sh_addr; // base memory address, if loadable, or zero sh_offset; // file position of beginning of section sh_size; // size in bytes sh_link; // section number with related info or zero sh_info; // more section-specific info sh_align; // alignment granularity if section is moved sh_entsize; // size of entries if section is an array
11/14/09
Linkers & Loaders
19
11/14/09
Linkers & Loaders
20
ELF Object Format Section Types PROGBITS
Program contains code, data and debugger info.
NOBITS
Used for BSS data allocation at load time
SYMTAB & DYNSYM
Symbol table
STRTAB
String table
REL & RELA
Relocation information
DYNAMIC & HASH
Dynamic linking information and the runtime symbol hash table
Symbol Table int name; // position of name string in string table int value; // symbol value, section relative in reloc, // absolute in executable int size; // object or function size char type:4; // data object, function, section, or special case file char bind:4; // local, global, or weak char other; // spare short sect; // section number, ABS, COMMON or UNDEF 11/14/09
Linkers & Loaders
21
Symbol table 11/14/09
Linkers & Loaders
22
ELF Program Header 11/14/09
Linkers & Loaders
23
Static libraries
Problems Change in library requires re-linking Copying library contents to target program wastes disk space and memory especially for commonly used libraries such as the C library. With large number of active programs considerable amount of memory goes to storing these copies of library functions.
Difference between filesize of static and dynamic link executables
11/14/09
Linkers & Loaders
24
Shared libraries
The primary difference between static and shared libraries is that shared libraries delays the actual task of linking to runtime, where it is performed by special dynamic linker-loader. Rather than copying the contents of the libraries into the target executable, the linker simply records the name of the libraries in a list of executable.
Example Hello[sairahul@c1 test]$ ldd file libc.so.6 => /lib/tls/libc.so.6 (0x001ae000) /lib/ld-linux.so.2 (0x00191000)
11/14/09
Linkers & Loaders
25
Shared libraries
The dynamic linker searches libraries in the same order as they were specified on the link line and uses the first definition of the symbol encountered. Duplicate symbols normally don’t occur. Linking processes happens at each program invocation. To minimize the performance overhead, shared libraries use both indirection tables and lazy symbol binding. That is, the location of external symbols actually refers to table entries, which remain unbound until the application actually needs them. To implement lazy symbol binding, the static linker creates jump table known as procedure-linking table and includes it as part of the final executable.
11/14/09
Linkers & Loaders
26
Shared library Linking
The internal structure of an executable linked with shared libraries. External library calls point to procedure-linking table entries, which remain unresolved until the dynamic linker fills them in at runtime.
11/14/09
Linkers & Loaders
27
Shared library Linking
The dynamic binding of library symbols in shared libraries: malloc is bound to the C library, and printf has not yet been used and is bound to the dynamic linker.
11/14/09
Linkers & Loaders
28
Library Loading
Library names are never encoded with absolute pathnames. To locate the libraries, the dynamic linker uses a configurable library search path. This path’s default value is normally stored in a system configuration file such as /etc/ld.so.conf or specified by the user in the LD_LIBRARY_PATH environment variable. directory traversal is relatively slow, the loader does not look at the directories in /etc/ld.so.conf every time it runs to find library files, but consults a cache file instead. Normally named /etc/ld.so.cache, this cache file is a table that matches library names to full pathnames. A better solution to the library path is to embed customized search paths in the executable itself using special linker options such as -R or -Wl, -rpath—for example
$ cc $SRCS –Wl,-rpath=/home/beazley/libs -L/home/beazleys/libs -lfoo
11/14/09
Linkers & Loaders
29
Library loading [sairahul@c1 test]$ LD_DEBUG=libs ./file 9024: find library=libc.so.6 [0]; searching 9024: search cache=/etc/ld.so.cache 9024: trying file=/lib/tls/libc.so.6 9024: 9024: 9024: calling init: /lib/tls/libc.so.6 9024: 9024: 9024: initialize program: ./file 9024: 9024: 9024: transferring control: ./file 9024: 9024: 9024: calling fini: /lib/tls/libc.so.6 [0] 9024: We can obtain detailed information about how the dynamic linker loads libraries by setting the LD_DEBUG environment variable to libs. 11/14/09
Linkers & Loaders
30
[sairahul@c1 test]$ strace ./file execve("./file", ["./file"], [/* 32 vars */]) = 0 uname({sys="Linux", node="c1.grid-iitkgp.com", ...}) = 0 brk(0) = 0x9a6b000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) =3 fstat64(3, {st_mode=S_IFREG|0644, st_size=183440, ...}) = 0 old_mmap(NULL, 183440, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7fd3000 close(3) =0 open("/lib/tls/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0 /\34\000"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=1512400, ...}) = 0 old_mmap(0x1ae000, 1207532, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x1ae000 old_mmap(0x2cf000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x120000) = 0x2cf000 old_mmap(0x2d3000, 7404, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2d3000 close(3) =0 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fd2000 mprotect(0x2cf000, 8192, PROT_READ) =0 mprotect(0x1a6000, 4096, PROT_READ) =0 set_thread_area({entry_number:-1 -> 6, base_addr:0xb7fd2940, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0 munmap(0xb7fd3000, 183440) =0 fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 4), ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fff000 write(1, "Hello", 5Hello) =5 munmap(0xb7fff000, 4096) =0 exit_group(5) =?
References
http://www.linuxjournal.com/article/6463 (Article on Linkers & Loaders) Linkers and Loaders by John Levine, published by MorganKauffman in October 1999, ISBN 1-55860-496-0 Linkers and Libraries Guide from Sun ( http://docs.sun.com/app/docs?p=/doc/816-1386) Lecture slides from columbia university ( http://www1.cs.columbia.edu/~sedwards/classes/2003/w4115f/ ) Beazley et. al, “The inside story on shared libraries and dynamic loading”, Computing in Science & Engineering, Sep/Oct 2001. Presser, L and White, J.R., "Linkers and Loaders," ACM Computing Surveys, Sep 1972.
11/14/09
Linkers & Loaders
32
Thank you
[sairahul@c1 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049: 9049:
test]$ LD_DEBUG=bindings ./file binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_res' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_IO_file_close' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__morecore' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__daylight' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__malloc_hook' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `h_nerr' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__malloc_initialize_hook' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/ld-linux.so.2: normal symbol `_r_debug' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `stdout' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__rcmd_errstr' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_nl_domain_bindings' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `re_syntax_options' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `argp_program_bug_address' [GLIBC_2.1] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__tzname' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_IO_stdout_' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_IO_funlockfile' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__realloc_hook' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_IO_stderr_' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `malloc' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_nl_msg_cat_cntr' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `optarg' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `loc2' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `h_errlist' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `opterr' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `error_message_count' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_environ' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `getdate_err' [GLIBC_2.1] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__environ' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `obstack_exit_failure' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/ld-linux.so.2: normal symbol `_rtld_global' [GLIBC_PRIVATE] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `error_print_progname' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__after_morecore_hook' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__ctype32_toupper' [GLIBC_2.2] binding file /lib/tls/libc.so.6 to /lib/ld-linux.so.2: normal symbol `_rtld_global_ro' [GLIBC_PRIVATE] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_IO_stdin_' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__key_encryptsession_pk_LOCAL' [GLIBC_2.1] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `argp_program_version' [GLIBC_2.1] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__ctype_toupper' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__fpu_control' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `optind' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_res_hconf' [GLIBC_2.2] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `stdin' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__progname' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `loc1' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `program_invocation_short_name' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `argp_err_exit_status' [GLIBC_2.1] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__ctype_tolower' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__check_rhosts_file' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `obstack_alloc_failed_handler' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `stderr' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__key_gendes_LOCAL' [GLIBC_2.1] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `optopt' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__timezone' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `svcauthdes_stats' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `mallwatch' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `svc_fdset' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__curbrk' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/ld-linux.so.2: normal symbol `__libc_enable_secure' [GLIBC_PRIVATE] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__ctype32_tolower' [GLIBC_2.2] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__free_hook' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_null_auth' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `error_one_per_line' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/ld-linux.so.2: normal symbol `_dl_argv' [GLIBC_PRIVATE] binding file /lib/tls/libc.so.6 to ./file: normal symbol `_IO_stdin_used' binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `program_invocation_name' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__ctype_b' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `svc_max_pollfd' [GLIBC_2.2] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `rpc_createerr' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `argp_program_version_hook' [GLIBC_2.1] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `svc_pollfd' [GLIBC_2.2] binding file /lib/tls/libc.so.6 to /lib/ld-linux.so.2: normal symbol `_dl_out_of_memory' [GLIBC_PRIVATE] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__key_decryptsession_pk_LOCAL' [GLIBC_2.1] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__ctype32_b' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__memalign_hook' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__progname_full' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/ld-linux.so.2: normal symbol `__libc_stack_end' [GLIBC_2.1] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `free' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_IO_2_1_stderr_' [GLIBC_2.1] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_IO_2_1_stdout_' [GLIBC_2.1] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_IO_2_1_stdin_' [GLIBC_2.1] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_Unwind_Find_FDE' [GCC_3.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `malloc' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `calloc' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `realloc' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `memalign' [GLIBC_2.0] binding file /lib/tls/libc.so.6 to /lib/ld-linux.so.2: normal symbol `___tls_get_addr' [GLIBC_2.3] binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `free' [GLIBC_2.0] binding file /lib/ld-linux.so.2 to /lib/ld-linux.so.2: normal symbol `_r_debug' [GLIBC_2.0] binding file /lib/ld-linux.so.2 to /lib/tls/libc.so.6: normal symbol `__libc_memalign' [GLIBC_2.0] binding file /lib/ld-linux.so.2 to /lib/tls/libc.so.6: normal symbol `malloc' [GLIBC_2.0] binding file /lib/ld-linux.so.2 to /lib/tls/libc.so.6: normal symbol `calloc' [GLIBC_2.0] binding file /lib/ld-linux.so.2 to /lib/tls/libc.so.6: normal symbol `realloc' [GLIBC_2.0] binding file /lib/ld-linux.so.2 to /lib/tls/libc.so.6: normal symbol `free' [GLIBC_2.0] calling init: /lib/tls/libc.so.6 binding file ./file to /lib/tls/libc.so.6: normal symbol `__libc_start_main' [GLIBC_2.0] initialize program: ./file transferring control: ./file binding file ./file to /lib/tls/libc.so.6: normal symbol `strcpy' [GLIBC_2.0] binding file ./file to /lib/tls/libc.so.6: normal symbol `printf' [GLIBC_2.0] calling fini: /lib/tls/libc.so.6 [0]