Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to link the C Runtime Library with 'ld'?

I'm learning assembly with NASM for a class I have in college. I would like to link the C Runtime Library with ld, but I just can't seem to wrap my head around it. I have a 64 bit machine with Linux Mint installed.

The reason I'm confused is that -- to my knowledge -- instead of linking the C runtime, gcc copies the things that you need into your program. I might be wrong though, so don't hesitate to correct me on this, please.

What I did up to this point is, to link it using gcc. That produces a mess of a machine code that I'm unable to follow though, even for a small program like swapping rax with rbx, which isn't that great for learning purposes. (Please note that the program works.)

I'm not sure if it's relevant, but these are the commands that I'm using to compile and link:

# compilation
nasm -f elf64 swap.asm
# gcc
gcc -o swap swap.o
# ld, no c runtime
ld -s -o swap swap.o

Thank you in advance!


Conclusion:

Now that I have a proper answer to the question, here are a few things that I would like to mention. Linking glibc dynamically can be done like in Z boson's answer (for 64 bit systems). If you would like to do it statically, do follow this link (that I'm re-posting from Z boson's answer).

Here's an article that Jester posted, about how programs start in linux.

To see what gcc does to link your .o-s, try this command out: gcc -v -o swap swap.o. Note that 'v' stands for 'verbose'.

Also, you should read this if you are interested in 64 bit assembly.

Thank you for your answers and helpful insight! End of speech.

like image 891
mrDudePerson Avatar asked Dec 06 '15 13:12

mrDudePerson


People also ask

What is C runtime library?

The C runtime Library (CRT) is the part of the C++ Standard Library that incorporates the ISO C standard library. The Visual C++ libraries that implement the CRT support native code development, and both mixed native and managed code. All versions of the CRT support multi-threaded development.

What is runtime support library?

A runtime library is a collection of software programs used at program run time to provide one or more native program functions or services.

What are CRT functions?

Cathode ray tubes perform one function, which makes them unique as transistors: They convert an incoming electronic signal into a stream of electrons which is designed to create a picture by reacting with a substance on a screen.


1 Answers

Here is an example which uses libc without using GCC.

extern printf
extern _exit

section .data
    hello:     db 'Hello world!',10

section .text
    global _start   
_start:
    xor eax, eax
    mov edi, hello
    call printf
    mov rax, 0    
    jmp _exit

Compile and link like this:

nasm -f elf64 hello.asm
ld hello.o -dynamic-linker /lib64/ld-linux-x86-64.so.2 -lc -m elf_x86_64

This has worked fine so far for me but for static linkage it's complicated.

like image 187
Z boson Avatar answered Sep 19 '22 10:09

Z boson