Проблема с LD

Discussion in 'WASM.UNIX' started by Mika0x65, Mar 8, 2007.

  1. Mika0x65

    Mika0x65 New Member

    Blog Posts:
    0
    Joined:
    Jul 30, 2005
    Messages:
    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 одинаковы. Попробовал так же линковать с помощью скрипта:

    Code (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)
    и

    Code (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

    Blog Posts:
    0
    Joined:
    Aug 2, 2004
    Messages:
    112
    Location:
    Ukraine
    А если получить раздельно два голых бинарника, а потом их просто склеить вместе (например при помощи cat) в нужном порядке?
     
  3. Mika0x65

    Mika0x65 New Member

    Blog Posts:
    0
    Joined:
    Jul 30, 2005
    Messages:
    1,384
    Я уже думал об этом. Мешает то, что в .asm файле есть вызов ф-ии из .c файла -- поэтому удобно компилировать оба в объектный, а потом клеить линкером, чтобы он разрешил вызовы. Да и хотелось бы понять, почему ld капризничает -- это, как я понял, только у меня так происходит...
     
  4. Bob

    Bob New Member

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

    Mika0x65 New Member

    Blog Posts:
    0
    Joined:
    Jul 30, 2005
    Messages:
    1,384
    kernel -- это громко сказано, я пока просто экспериментирую :).
    Да, но для этого мне и надо .asm файл и .c файл сохранять как ELF -- чтобы линкер сделал за меня эту работу, а затем слил это все в плоский бинарник.

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

    rei3er maxim

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    917
    Location:
    minsk
    специально проверил
    Code (Text):
    1. /* a.S */
    2. .text
    3.     .long    0xAAAAAAAA
    4.     .long    0xBBBBBBBB
    Code (Text):
    1. /* b.c */
    2. void F() {
    3.     int a = 5;
    4. }
    если link.ld изменить на
    то в
     
  7. Mika0x65

    Mika0x65 New Member

    Blog Posts:
    0
    Joined:
    Jul 30, 2005
    Messages:
    1,384
    Дико извиняюсь, нашел проблему. Всего лишь навсего, FASM по умолчанию называет секцию кода '.flat', а не '.text', как было у меня скрипте. Всем спасибо (а отдельно rei3er
    -- навел на мысль проверить :) ).