5

i'm trying to create a dynamically linked executable (elf_i386) without gcc. The program is very simple (only a printf)...here the commands:

$ gcc -c simple.c
$ ld -o simple -dynamic-linker /lib/ld-linux.so.2 --entry main /usr/lib/crt1.o /usr/lib/crti.o simple.o -lc /usr/lib/crtn.o

The executable is created and also file command and ldd command show the right output... However when i launch the program after the call to printf i get a segmentation fault...i've examined with objdump the executable and i think the problem is about the dtors...seems that compiling with:

$gcc -o simple simple.c

a section .dtors is present while it is not present inside the executable created directly with ld :(

Any ideas?

1
  • You'll need to show your code if you want anyone to help. Commented May 24, 2011 at 11:02

2 Answers 2

7

Lose the --entry main. main isn't your entry point, _start is. Try this:

$ gcc -c hello.c
$ ld -o hello -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o hello.o -lc /usr/lib/crtn.o
$ ./hello
hello, world
$ 
Sign up to request clarification or add additional context in comments.

2 Comments

And for x86_64 + C++, use this : ld -o hello hello.o --dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib64/crt1.o /usr/lib64/crti.o -lstdc++ -lc /usr/lib64/crtn.o -L/usr/lib/gcc/x86_64-redhat-linux/4.1.2/ -lgcc_s -L /usr/lib64 Replace the .../x86_64-redhat-linux/ dir with the right path to your libstd++.so, use "g++ -print-search-dirs"
thank you, the magic is -dynamic-linker /lib/ld-linux* /lib/crt*
2

It is not necessary to include the C run time environment i guess unless you are using return from your main().

We can strip the CRT and just link using :

ld -o hello -lc -dynamic-linker /lib/ld-linux.so.2 hello.o -e main

Will work.

2 Comments

This works on Linux with glibc because glibc uses dynamic linking hooks to get its startup functions called. If you statically link glibc and call functions like printf or malloc without having manually called its init functions, you will segfault. stackoverflow.com/questions/36861903/…
Other platforms, like MinGW, don't have this, and you need to manually call libc init functions from _start before you can use some functions.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.