Использование -dynamic-linker со скриптом компоновщика?
Я использую Linux 2.6.31-14 на 32-битном процессоре Intel.
C файл:
#include <stdio.h>
main()
{
printf("Hello World!\n");
}
Скриптер компоновщика:
SECTIONS{
.text 0x00000100 :{
*(.text)
}
}
Выход:
$ gcc -S test.c
$ as -o test.o test.s
$ ld -T linker.ld -dynamic-linker /lib/ld-linux.so.2 -o test test.o
test.o: In function `main':
test.c:(.text+0x11): undefined reference to `puts'
Что случилось? Как я могу заставить скрипт компоновщика использовать динамическую библиотеку C?
2 ответа
Я думаю, что вы должны связать свою программу со стандартной библиотекой C (libc.so), добавив опцию -lc к аргументам ld.
ld -T linker.ld -lc -dynamic-linker /lib/ld-linux.so.2 -o test test.o
Также у вас могут возникнуть некоторые проблемы с запуском вашей программы (ошибки сегментации), потому что у вашего test.o нет точки входа в программу (символ _start). Поэтому вам понадобится дополнительный объектный файл с точкой входа, который вызывает вашу функцию main() внутри test.o, а затем прерывает выполнение кода, вызывая системный вызов exit().
Вот код start.s
# Linux system calls constants
.equ SYSCALL_EXIT, 1
.equ INTERRUPT_LINUX_SYSCALL, 0x80
# Code section
.section .text
.globl _start
_start: # Program entry point
call main # Calling main function
# Now calling exit() system call
movl %eax, %ebx # Saving return value for exit() argument
movl $SYSCALL_EXIT, %eax # System call number
int $INTERRUPT_LINUX_SYSCALL # Raising programm interrupt
Тогда вы должны построить свою программу
gcc test.c -S
as test.s -o test.o
as start.s -o start.o
ld start.o test.o -o test -lc --dynamic-linker=/lib/ld-linux.so.2
Вы также можете зайти в эту статью https://blogs.oracle.com/ksplice/entry/hello_from_a_libc_free чтобы узнать больше о том, как работает компилятор C и стандартная библиотека.
Вы не ссылаетесь в библиотеке c.
На моей 64-битной системе это:
-dynamic-linker /lib64/ld-linux-x86-64.so.2 /lib64/libc.so.6