You are on page 1of 34

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 <filename> gcc –S <filename>
foo.s bar.s
run assembler (as)
as <filename> as <filename>
foo.o bar.o
linker
ld <object files> ld <object files>
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
Sections:
file1.c: Idx Name Size VMA LMA File off Algn
0 .text 0000003e 00000000 00000000 00000034 2**2
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
#include <stdio.h> 1 .data 00000006 00000000 00000000 00000074 2**2
char a[] = "Hello"; CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000000 00000000 00000000 0000007c 2**2
extern void bar(); ALLOC
3 .rodata 00000003 00000000 00000000 0000007c 2**0
int main() CONTENTS, ALLOC, LOAD, READONLY, DATA
SYMBOL TABLE:
{ 00000000 l df *ABS* 00000000 file1.c
bar(); 00000000 l d .text 00000000
00000000 l d .data 00000000
} 00000000 l d .bss 00000000
00000000 l d .rodata 00000000
void baz(char *s) 00000000 l d .note.GNU-stack 00000000
00000000 l d .comment 00000000
{ 00000000 g O .data 00000006 a
printf("%s", s); 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 Size VMA LMA File off Algn
0 .text 0000002d 00000000 00000000 00000034 2**2
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
1 .data 00000000 00000000 00000000 00000064 2**2
file2.c: CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000006 00000000 00000000 00000064 2**2
ALLOC
#include <stdio.h> 3 .note.GNU-stack 00000000 00000000 00000000 00000064 2**0
CONTENTS, READONLY
4 .comment 00000031 00000000 00000000 00000064 2**0
extern char a[]; CONTENTS, READONLY
static char b[6]; SYMBOL TABLE:
00000000 l df *ABS* 00000000 file2.c
00000000 l d .text 00000000
void bar() 00000000 l d .data 00000000
00000000 l d .bss 00000000
{ 00000000 l O .bss 00000006 b
strcpy(b, a); 00000000 l d .note.GNU-stack 00000000
baz(b); 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

11/14/09 Linkers & Loaders 10


Before and After Linking

00000000 <main>: 080483a0 <main>:


0: 55 push %ebp 80483a0: 55 push %ebp
1: 89 e5 mov %esp,%ebp 80483a1: 89 e5 mov %esp,%ebp
3: 83 ec 08 sub $0x8,%esp 80483a3: 83 ec 08 sub $0x8,%esp
6: 83 e4 f0 and $0xfffffff0,%esp 80483a6: 83 e4 f0 and $0xfffffff0,%esp
9: b8 00 00 00 00 mov $0x0,%eax 80483a9: b8 00 00 00 00 mov $0x0,%eax
e: 83 c0 0f add $0xf,%eax 80483ae: 83 c0 0f add $0xf,%eax
11: 83 c0 0f add $0xf,%eax 80483b1: 83 c0 0f add $0xf,%eax
14: c1 e8 04 shr $0x4,%eax 80483b4: c1 e8 04 shr $0x4,%eax
17: c1 e0 04 shl $0x4,%eax 80483b7: c1 e0 04 shl $0x4,%eax
1a: 29 c4 sub %eax,%esp 80483ba: 29 c4 sub %eax,%esp
1c: e8 fc ff ff ff call 1d <main+0x1d> 80483bc: e8 1f 00 00 00 call 80483e0 <bar>
21: c9 leave 80483c1: c9 leave
22: c3 ret 80483c2: c3 ret

00000023 <baz>: 080483c3 <baz>:


23: 55 push %ebp 80483c3: 55 push %ebp
24: 89 e5 mov %esp,%ebp 80483c4: 89 e5 mov %esp,%ebp
26: 83 ec 08 sub $0x8,%esp 80483c6: 83 ec 08 sub $0x8,%esp
29: 83 ec 08 sub $0x8,%esp 80483c9: 83 ec 08 sub $0x8,%esp
2c: ff 75 08 pushl 0x8(%ebp) 80483cc: ff 75 08 pushl 0x8(%ebp)
2f: 68 00 00 00 00 push $0x0 80483cf: 68 f0 84 04 08 push $0x80484f0
34: e8 fc ff ff ff call 35 <baz+0x12> 80483d4: e8 ff fe ff ff call 80482d8 <printf@plt>
39: 83 c4 10 add $0x10,%esp 80483d9: 83 c4 10 add $0x10,%esp
3c: c9 leave 80483dc: c9 leave
3d: c3 ret 80483dd: c3 ret
80483de: 90 nop
80483df: 90 nop

11/14/09 Linkers & Loaders 11


Linking: Example

080483a0 <main>:
file1.c: 80483a0: 55 push %ebp
80483a1: 89 e5 mov %esp,%ebp
80483a3: 83 ec 08 sub $0x8,%esp
#include <stdio.h> 80483a6: 83 e4 f0 and $0xfffffff0,%esp
char a[] = "Hello"; 80483a9: b8 00 00 00 00 mov $0x0,%eax
80483ae: 83 c0 0f add $0xf,%eax
extern void bar(); 80483b1: 83 c0 0f add $0xf,%eax
80483b4: c1 e8 04 shr $0x4,%eax
80483b7: c1 e0 04 shl $0x4,%eax
int main() 80483ba: 29 c4 sub %eax,%esp
{ 80483bc: e8 1f 00 00 00 call 80483e0 <bar>
bar(); 80483c1: c9 leave
80483c2: c3 ret
} 080483c3 <baz>:
80483c3: 55 push %ebp
80483c4: 89 e5 mov %esp,%ebp
80483c6: 83 ec 08 sub $0x8,%esp
void baz(char *s) 80483c9: 83 ec 08 sub $0x8,%esp
{ 80483cc: ff 75 08 pushl 0x8(%ebp)
80483cf: 68 f0 84 04 08 push $0x80484f0
printf("%s", s); 80483d4: e8 ff fe ff ff call 80482d8 <printf@plt>
} 80483d9: 83 c4 10 add $0x10,%esp
80483dc: c9 leave
80483dd: c3 ret
80483de: 90 nop
80483df: 90 nop

11/14/09 Linkers & Loaders 12


Linking: Example

file2.c: 080483e0 <bar>:


80483e0: 55 push %ebp
80483e1: 89 e5 mov %esp,%ebp
#include <stdio.h> 80483e3: 83 ec 08 sub $0x8,%esp
80483e6: 83 ec 08 sub $0x8,%esp
80483e9: 68 fc 95 04 08 push $0x80495fc
extern char a[]; 80483ee: 68 08 96 04 08 push $0x8049608
80483f3: e8 f0 fe ff ff call 80482e8 <strcpy@plt>
static char b[6]; 80483f8: 83 c4 10 add $0x10,%esp
80483fb: 83 ec 0c sub $0xc,%esp
80483fe: 68 08 96 04 08 push $0x8049608
void bar() 8048403: e8 bb ff ff ff call 80483c3 <baz>
{ 8048408: 83 c4 10 add $0x10,%esp
804840b: c9 leave
strcpy(b, a); 804840c: c3 ret
baz(b); 804840d: 90 nop
804840e: 90 nop
} 804840f: 90 nop

11/14/09 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 sh_name; // name, index into the string table


int sh_type; // section type
int sh_flags; // flag bits, below
int sh_addr; // base memory address, if loadable, or zero
int sh_offset; // file position of beginning of section
int sh_size; // size in bytes
int sh_link; // section number with related info or zero
int sh_info; // more section-specific info
int sh_align; // alignment granularity if section is moved
int 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 Morgan-
Kauffman 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 test]$ LD_DEBUG=bindings ./file
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_res' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_IO_file_close' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__morecore' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__daylight' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__malloc_hook' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `h_nerr' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__malloc_initialize_hook' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/ld-linux.so.2: normal symbol `_r_debug' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `stdout' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__rcmd_errstr' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_nl_domain_bindings' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `re_syntax_options' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `argp_program_bug_address' [GLIBC_2.1]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__tzname' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_IO_stdout_' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_IO_funlockfile' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__realloc_hook' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_IO_stderr_' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `malloc' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_nl_msg_cat_cntr' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `optarg' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `loc2' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `h_errlist' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `opterr' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `error_message_count' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_environ' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `getdate_err' [GLIBC_2.1]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__environ' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `obstack_exit_failure' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/ld-linux.so.2: normal symbol `_rtld_global' [GLIBC_PRIVATE]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `error_print_progname' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__after_morecore_hook' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__ctype32_toupper' [GLIBC_2.2]
9049: binding file /lib/tls/libc.so.6 to /lib/ld-linux.so.2: normal symbol `_rtld_global_ro' [GLIBC_PRIVATE]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_IO_stdin_' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__key_encryptsession_pk_LOCAL' [GLIBC_2.1]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `argp_program_version' [GLIBC_2.1]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__ctype_toupper' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__fpu_control' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `optind' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_res_hconf' [GLIBC_2.2]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `stdin' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__progname' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `loc1' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `program_invocation_short_name' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `argp_err_exit_status' [GLIBC_2.1]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__ctype_tolower' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__check_rhosts_file' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `obstack_alloc_failed_handler' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `stderr' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__key_gendes_LOCAL' [GLIBC_2.1]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `optopt' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__timezone' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `svcauthdes_stats' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `mallwatch' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `svc_fdset' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__curbrk' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/ld-linux.so.2: normal symbol `__libc_enable_secure' [GLIBC_PRIVATE]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__ctype32_tolower' [GLIBC_2.2]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__free_hook' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_null_auth' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `error_one_per_line' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/ld-linux.so.2: normal symbol `_dl_argv' [GLIBC_PRIVATE]
9049: binding file /lib/tls/libc.so.6 to ./file: normal symbol `_IO_stdin_used'
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `program_invocation_name' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__ctype_b' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `svc_max_pollfd' [GLIBC_2.2]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `rpc_createerr' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `argp_program_version_hook' [GLIBC_2.1]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `svc_pollfd' [GLIBC_2.2]
9049: binding file /lib/tls/libc.so.6 to /lib/ld-linux.so.2: normal symbol `_dl_out_of_memory' [GLIBC_PRIVATE]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__key_decryptsession_pk_LOCAL' [GLIBC_2.1]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__ctype32_b' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__memalign_hook' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `__progname_full' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/ld-linux.so.2: normal symbol `__libc_stack_end' [GLIBC_2.1]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `free' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_IO_2_1_stderr_' [GLIBC_2.1]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_IO_2_1_stdout_' [GLIBC_2.1]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_IO_2_1_stdin_' [GLIBC_2.1]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `_Unwind_Find_FDE' [GCC_3.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `malloc' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `calloc' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `realloc' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `memalign' [GLIBC_2.0]
9049: binding file /lib/tls/libc.so.6 to /lib/ld-linux.so.2: normal symbol `___tls_get_addr' [GLIBC_2.3]
9049: binding file /lib/tls/libc.so.6 to /lib/tls/libc.so.6: normal symbol `free' [GLIBC_2.0]
9049: binding file /lib/ld-linux.so.2 to /lib/ld-linux.so.2: normal symbol `_r_debug' [GLIBC_2.0]
9049: binding file /lib/ld-linux.so.2 to /lib/tls/libc.so.6: normal symbol `__libc_memalign' [GLIBC_2.0]
9049: binding file /lib/ld-linux.so.2 to /lib/tls/libc.so.6: normal symbol `malloc' [GLIBC_2.0]
9049: binding file /lib/ld-linux.so.2 to /lib/tls/libc.so.6: normal symbol `calloc' [GLIBC_2.0]
9049: binding file /lib/ld-linux.so.2 to /lib/tls/libc.so.6: normal symbol `realloc' [GLIBC_2.0]
9049: binding file /lib/ld-linux.so.2 to /lib/tls/libc.so.6: normal symbol `free' [GLIBC_2.0]
9049:
9049: calling init: /lib/tls/libc.so.6
9049:
9049: binding file ./file to /lib/tls/libc.so.6: normal symbol `__libc_start_main' [GLIBC_2.0]
9049:
9049: initialize program: ./file
9049:
9049:
9049: transferring control: ./file
9049:
9049: binding file ./file to /lib/tls/libc.so.6: normal symbol `strcpy' [GLIBC_2.0]
9049: binding file ./file to /lib/tls/libc.so.6: normal symbol `printf' [GLIBC_2.0]
9049:
9049: calling fini: /lib/tls/libc.so.6 [0]
9049: