Проблема с LD

Тема в разделе "WASM.UNIX", создана пользователем Mika0x65, 8 мар 2007.

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Мое почтение всем.

    Есть очень неприятная проблема с линкером -- не хочет линковать файлы в том порядке, в каком ему указываешь. Опишу чуть подробнее: у меня есть 16/32битный .asm файл и 32битный .c файл. Оба скомпилированы в объектные ELF файлы. В 32битной части .asm файла есть вызовы ф-ий из .c файла. Конечная цель линкования -- плоский бинарник, но с условием, что .asm файл в нем должен идти первым, чего достичь не удается. Линковал так: 'ld --oformat=binary -Ttext=0x10000 test.asm test.c -o test'. Такое ощущение, что порядок указания объектных файлов роли не играет -- пробовал 'ld --oformat=binary -Ttext=0x10000 test.c test.asm -o test2' -- файлы test & test2 одинаковы. Попробовал так же линковать с помощью скрипта:

    Код (Text):
    1. STARTUP(pm.o)
    2. SECTIONS
    3. {
    4.      . = 0x10000
    5.      .text : { pm.o(.text) console.o(.text) }
    6.      .data : { *(.data) }
    7.      .bss : { *(.bss) }
    8. }
    9. OUTPUT(test)
    10. OUTPUT_FORMAT(binary)
    и

    Код (Text):
    1. STARTUP(pm.o)
    2. SECTIONS
    3. {
    4.      . = 0x10000
    5.      .init : { pm.o(.text) }
    6.      .text : { console.o(.text) }
    7.      .data : { *(.data) }
    8.      .bss : { *(.bss) }
    9. }
    10. OUTPUT(test)
    11. OUTPUT_FORMAT(binary)
    эффект тот же. Безобразие происходит на: FreeBSD 6.0, binutils 2.17. Пробовал сначала на 2.15 -- то же самое. При этом на FreeBSD 4.6.2 с 'ld' версии 2.11.2 все Ок. Но беда в том, что 4.6.2 -- удаленный сервер, мне неподконтрольный, со старым 'gcc'. Как убедить линкер класть .asm в начале? В чем м.б. причина?

    Заранее благодарен :).
     
  2. Bob

    Bob New Member

    Публикаций:
    0
    Регистрация:
    2 авг 2004
    Сообщения:
    112
    Адрес:
    Ukraine
    А если получить раздельно два голых бинарника, а потом их просто склеить вместе (например при помощи cat) в нужном порядке?
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Я уже думал об этом. Мешает то, что в .asm файле есть вызов ф-ии из .c файла -- поэтому удобно компилировать оба в объектный, а потом клеить линкером, чтобы он разрешил вызовы. Да и хотелось бы понять, почему ld капризничает -- это, как я понял, только у меня так происходит...
     
  4. Bob

    Bob New Member

    Публикаций:
    0
    Регистрация:
    2 авг 2004
    Сообщения:
    112
    Адрес:
    Ukraine
    Вообще вся твоя конструкция очень напоминает загрузчик+kernel операционной системы. Есть такое?
    Если так, чем тебе может мешать вызов из asm файла? Ты ж все грузишь по известным тебе адресам,
    и ядро и загрузчик. Делай из asm-файла простой вызов call <имя_функции_в_С_файле>, и все.
    Только перед этим функцию надо экспортировать. Короче, посмотри вот тут http://sysbin.com/files/lowlevel/osdev9.htm
    живой пример.
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    kernel -- это громко сказано, я пока просто экспериментирую :).
    Да, но для этого мне и надо .asm файл и .c файл сохранять как ELF -- чтобы линкер сделал за меня эту работу, а затем слил это все в плоский бинарник.

    Именно так я и делаю -- указываю .asm файл первым. Но он почему-то в конечном бинарнике идет вторым...
     
  6. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    специально проверил
    Код (Text):
    1. /* a.S */
    2. .text
    3.     .long    0xAAAAAAAA
    4.     .long    0xBBBBBBBB
    Код (Text):
    1. /* b.c */
    2. void F() {
    3.     int a = 5;
    4. }
    если link.ld изменить на
    то в
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Дико извиняюсь, нашел проблему. Всего лишь навсего, FASM по умолчанию называет секцию кода '.flat', а не '.text', как было у меня скрипте. Всем спасибо (а отдельно rei3er
    -- навел на мысль проверить :) ).