GCC выводит исполняемый файл ELF, когда я хочу общую библиотеку - PullRequest
5 голосов
/ 07 мая 2011

Я пытаюсь собрать общую библиотеку в Cygwin, используя кросс-компилятор i686-elf. Код очень прост:

int add(int a, int b) {
    return a + b;
}

void _init() {
    add(3, 4);
}

Я компилирую с помощью следующей команды:

i686-elf-gcc -fPIC -shared -nostdlib core.c -o libcore.so

Это должно быть создание общего объекта, верно? Но GCC выдает предупреждение о невозможности найти символ _start, который является точкой входа для исполняемых файлов, а не общих объектов. Кроме того, readelf говорит следующее:

$ readelf -a libcore.so
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  ...
  Type:                              EXEC (Executable file)
  ...

Что здесь не так?

Ответы [ 2 ]

2 голосов
/ 07 мая 2011

Что происходит не так, так это то, что вы нацелены на i686-elf, и никто не создает разделяемые библиотеки для этой цели.-Wl,-shared даст вам нечто, помеченное как разделяемая библиотека, но как именно вы планируете загрузить разделяемую библиотеку на голое железо?

0 голосов
/ 07 мая 2011

Я полагаю, что -shared на голых металлических объектах не работает (заставляет компилятор полагать, что опция не указана), и поэтому компилятор создает исполняемый файл. С info gcc в командной строке:

'-shared'
    Produce a shared object which can then be linked with other
    objects to form an executable.  Not all systems support this
    option.  For predictable results, you must also specify the same
    set of options that were used to generate code ('-fpic', '-fPIC',
    or model suboptions) when you specify this option.(1)

... и прокрутка вниз для сносок:

  (1) On some systems, 'gcc -shared' needs to build supplementary stub
  code for constructors to work.  On multi-libbed systems, 'gcc -shared'
  must select the correct support libraries to link against.  Failing to
  supply the correct flags may lead to subtle defects.  Supplying them in
  cases where they are not necessary is innocuous.
...