Линковка OBJ с С++

Тема в разделе "WASM.BEGINNERS", создана пользователем qvant, 30 окт 2007.

  1. qvant

    qvant New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2006
    Сообщения:
    38
    Есть реализация алгоритмов сжатия на NASM http://vx.org.ua/herm1t/compr.zip,
    пытаюсь собрать и использовать в своём C++ проекте. Делаю так:
    компилю .obj "nasmw -f win32 rle.asm", дальше в С++:
    Код (Text):
    1. extern  int  __cdecl rle_compress(unsigned char *,unsigned char *,unsigned long);
    Линкер стал ругаться
    Код (Text):
    1. TestCompress.obj : error LNK2019: unresolved external symbol "int __cdecl rle_compress(unsigned char *,unsigned char *,unsigned long)" (?rle_compress@@YAHPAE0K@Z) referenced in function _main
    Чтобы было соответствие по параметрам изменил имя функции в rle.asm на ?rle_compress@@YAHPAE0K@Z,
    снова попытался собрать:
    Код (Text):
    1. TestCompress.obj : error LNK2019: unresolved external symbol "int __cdecl rle_compress(unsigned char *,unsigned char *,unsigned long)" (?rle_compress@@YAHPAE0K@Z) referenced in function _main
    2. rle.obj : error LNK2001: unresolved external symbol "int __cdecl rle_compress(unsigned char *,unsigned char *,unsigned long)" (?rle_compress@@YAHPAE0K@Z)
    3. rle.obj : error LNK2001: unresolved external symbol "?rle_compress@@YAHPAE0K@Z.rstc" (?rle_compress@@YAHPAE0K@Z.rstc)
    4. ...
    Как всё таки собрать это дело?
    Спасибо.
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    extern "C"
     
  3. qvant

    qvant New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2006
    Сообщения:
    38
    В смысле,
    Код (Text):
    1. extern "C" int  __cdecl rle_compress(unsigned char *,unsigned char *,unsigned long); ??
    Тоже самое..
     
  4. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    под рукой nasm'a нету, но кажись можно так nasmw -f obj rle.asm
     
  5. qvant

    qvant New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2006
    Сообщения:
    38
    ..\..\compr\nasm-0.98.39\rle.obj : fatal error LNK1107: invalid or corrupt file: cannot read at 0x121

    Уже по-всякому пробовал - не получается.. :dntknw:

    Если есть возможность - проверь, пожалуйста, у себя..
    nasm можно скачать тут: http://www.wasm.ru/baixado.php?mode=tool&id=50
    Спасибо.
     
  6. mathio

    mathio New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    110
    Во-первых, без явного указания принадлежности процедуры секции кода, NASM сгенерит такой coff файл, что в нем в symbol table все метки(даже определенные в данном asm файле) будут помечены, как неинициализированные/внешние, тоесть для них не будет указана секция в объектнике. Ессно, линкер при связывании будет искать их "снаружи".
    Во-вторых, NASM генерит имя метки в полном соответствии с именем заданным пользователем, т.е. без префиксного "_", что однако добавляет транслятор Си.

    Теперь как лечить.

    Первое, для построения правильного объектника из .asm файла явно указываем секцию для инициализированных меток
    Код (Text):
    1. section .text
    2. global  rle_compress, rle_expand
    3. rle_compress:   pusha
    Второе, домангливаем asm-имена до вида генерируемого extern "C"
    Код (Text):
    1. section .text
    2. global  _rle_compress, _rle_expand
    3. _rle_compress:  pusha
    Ну и третье, в .cpp файле юзаем для всех ф-ий из этих .asm файлов префикс extern "C"
     
  7. qvant

    qvant New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2006
    Сообщения:
    38
    Спасибо! Проблема решена..