Использование -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?


person pflz    schedule 07.07.2011    source источник
comment
Я знаю, что это очень старо, но вы не надеялись создать из этого DOS COM-программу? Я спрашиваю только потому, что 0x00000100 в скрипте компоновщика предполагает, что это возможно.   -  person Michael Petch    schedule 02.04.2018


Ответы (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 и стандартная библиотека.

person min0ru    schedule 01.07.2012
comment
Извините, я ничего не сказал о скрипте компоновщика, но я думаю, что проблема не в скрипте, а в библиотеке libc. - person min0ru; 01.07.2012

Вы не связываетесь с библиотекой c.

В моей 64-битной системе это:

-dynamic-linker /lib64/ld-linux-x86-64.so.2 /lib64/libc.so.6
person Milan    schedule 07.07.2011
comment
ld -T linker.ld -dynamic-linker /lib/ld-linux.so.2 /lib/libc.so.6 -o test test.o... Все еще не работает - person pflz; 07.07.2011