Подтвердить что ты не робот

Как создать программу на C с использованием пользовательской версии glibc и статической ссылки?

Я построил glibc 2.14 и установил его в каталог ~/GLIBC/glibc_install. Теперь я хочу создавать и запускать программы, используя эту C-библиотеку, а не мою библиотеку C по умолчанию для системы.

  • Чтобы убедиться, что я использовал свой пользовательский glibc, я добавил вызов, чтобы помещать в glibc/stdio-common/printf.c:__printf для печати сообщения.

  • Затем я перестроил и переустановил glibc.

  • Затем я написал программу "Hello, World" и попытался скомпилировать ее и связать следующим образом:

    gcc -nodefaultlibs -static -lgcc -L~/GLIBC/glibc_install/lib -o myprog myprog.c
    

Но я получаю следующий отчет об ошибке компоновщика:

/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start':
(.text+0x19): undefined reference to `__libc_csu_init'
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start':
(.text+0x25): undefined reference to `__libc_start_main'
/tmp/ccACTQEp.o: In function `main':
c1.c:(.text+0xa): undefined reference to `puts'
collect2: ld returned 1 exit status

Что я делаю неправильно?

4b9b3361

Ответ 1

Следуя нескольким предложениям из списка рассылки glibc ([email protected]), у меня есть решение. Оказывается, эта задача немного сложна, потому что вы должны сказать компоновщику опустить все, что обычно будет включать автоматически (и тихо), а затем включить обратно все, что ему нужно, включая кучу начальных и конечных файлов. Некоторые из начальных и конечных файлов поступают из libc, а некоторые - из gcc, поэтому правило make немного сложно. Ниже приведен общий пример файла makefile для иллюстрации подхода. Я предполагаю, что вы создаете программу под названием prog из исходного файла с именем prog.c и что вы установили свой пользовательский glibc в каталог /home/my_acct/glibc_install.

TARGET = prog
OBJ = $(TARGET).o
SRC = $(TARGET).c
CC = gcc
CFLAGS = -g
LDFLAGS = -nostdlib -nostartfiles -static
GLIBCDIR = /home/my_acct/glibc_install/lib
STARTFILES = $(GLIBCDIR)/crt1.o $(GLIBCDIR)/crti.o `gcc --print-file-name=crtbegin.o`
ENDFILES = `gcc --print-file-name=crtend.o` $(GLIBCDIR)/crtn.o
LIBGROUP = -Wl,--start-group $(GLIBCDIR)/libc.a -lgcc -lgcc_eh -Wl,--end-group

$(TARGET): $(OBJ)
        $(CC) $(LDFLAGS) -o [email protected] $(STARTFILES) $^ $(LIBGROUP) $(ENDFILES) 

$(OBJ): $(SRC)
        $(CC) $(CFLAGS) -c $^

clean:
        rm -f *.o *.~ $(TARGET)

Ответ 2

Вы командной строки просто фиктивный. Попробуйте:

gcc -nodefaultlibs -static -L~/GLIBC/glibc_install/lib -o myprog myprog.c -lgcc -lc -lgcc -lc

или аналогичный. Вы опустили -lc, а также ошибочно использовали ваши библиотеки перед вашими входными файлами.

И вы искали библиотеку с именем libibgcc, а не libgcc...