Заглушки Newlib в статической библиотеке

Я использую Eclipse для разработки приложений без операционной системы. Я ссылаюсь на newlib, поэтому я предоставил свою собственную реализацию _sbrk (). Эта функция обычно включалась в мой проект, и все работало отлично.

Теперь я пытаюсь перенести эту функцию в статическую библиотеку, которую разработал в последние месяцы.

Во время связывания выдает undefined reference to _sbrk ошибку. Путь, по которому находится файл, правильно включен в настройки Eclipse (другие файлы в том же каталоге связаны правильно).

Очевидно, существует некоторая проблема с порядком, в котором компоновщик просматривает мой код, и эта функция отбрасывается.

Я пробовал использовать __attribute__((used)), но безуспешно.

Как я могу решить эту проблему, с помощью настроек Eclipse? (компиляция на основе Makefile или из командной строки не является решением, которое мне нужно).


person Fotis Panagiotopoulos    schedule 03.03.2016    source источник


Ответы (2)


Повторяющиеся библиотеки

Чтобы это работало, вам необходимо убедиться, что ваша «новая» статическая библиотека появляется после newlib (библиотека C) в командной строке компоновщика. GCC автоматически добавит -lc в командную строку компоновщика после всех других объектов и библиотек. Однако вам разрешено повторить их при необходимости.

Итак, предположим, что ваша библиотека называется mylibrary, а ваше приложение и основной файл называются SO, установка параметров компоновщика, как это, будет работать:

gcc  -o SO ./src/SO.o -lc -lmylibrary

Это разрешает это (упрощенно!) На компоновщике:

ld -o SO ./src/SO.o -lc -lmylibrary -lc -lgcc

В настройках это выглядит так:

настройки библиотеки

Чтобы получить правильную комбинацию, вам, возможно, придется несколько отрегулировать / добавить повторение. Особенно, если "mylibrary" зависит от других частей newlib, которые, в свою очередь, зависят от других частей mylibrary.

Принудительное раннее связывание

Другая альтернатива - убедиться, что _sbrk просто связан на ранней стадии. Это можно сделать несколькими способами:

  • добавление зависимости в скрипт компоновщика
  • adding use of _sbrk from an object file that is passed directly to GCC. e.g.:
    • call _sbrk from an extern (i.e. not optimized out) function that is itself not used
    • возьмите адрес _sbrk в файле c
    • добавить _sbrk ссылку на файл сборки, возможно, в разделе, который не попадает в цель, если места мало

Почему?

Вы не спрашивали, почему это происходит, но для других читателей, которые хотят знать, есть хорошие вопросы и ответы здесь: Почему порядок, в котором связаны библиотеки, иногда вызывает ошибки в GCC? подробнее о том, почему порядок имеет значение .

person Jonah Graham    schedule 04.03.2016

Я решил свою проблему, просто добавив следующий код в свой скрипт компоновщика.

GROUP(
   libgcc.a
   libg.a
   libc.a
   libm.a
   libnosys.a
 )

Таким образом, не требуется никаких изменений каких-либо настроек или команд компоновщика.

person Fotis Panagiotopoulos    schedule 06.03.2016