gcc - с++: названия функций в объектниках

Тема в разделе "WASM.UNIX", создана пользователем shi, 2 окт 2006.

  1. shi

    shi New Member

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    41
    Привет всем!

    Подскажите, как можно (и можно ли) в c++ задать, как будет названа та или иная функция в импортируемом объектнике, и как задать имя экспортируемой функции, которое будет объявлено в объектном файле.

    Это нужно, чтобы линковать срр с асмом. В С, например, имя в объектнике ожидается/создаётся такое же, как и в исходнике при объявлении. Но это не позволяет использовать перегрузку параметров функций.

    Или, может, можно задать в nasm поддержку линковки с срр?

    На крайняк, может, есть какая-нибудь консольная утила, которая меняет названия экспортируемых объектов в объектниках? Тогда, правда, придётся ещё разбираться в том, как срр называет в них функции :dntknw:
     
  2. censored

    censored New Member

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

    shi New Member

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    41
    Спасибо. А почему при линковке срр-файл просит какой-то __gxx_personality_v0?
    Типа,
     
  4. censored

    censored New Member

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

    shi New Member

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    41
    ?
    makefile?
    *.o?
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    обычно для компиляции в *nix используются makefiles.
     
  7. shi

    shi New Member

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    41
    а... для компиляции... вот он:
    Код (Text):
    1. #!/bin/sh
    2. clear
    3. echo '*****assembling go.asm'
    4. nasm -felf -o go.o go.asm
    5. echo '*****compiling init.cрр'
    6. gcc -c -o init.o init.cpp
    7. echo '*****compiling video.cрр'
    8. gcc -c -o video.o video.cpp
    9. echo '*****assembling intel.asm'
    10. nasm -felf -o intel.o intel.asm
    11.  
    12. echo '*****linking'
    13. ld --oformat binary -Ttext 0x00000 -o system.bin go.o intel.o video.o init.o
    Этот?
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    не совсем, но пойдет, теперь ждём censored, ибо сам я под никсами не программирую ;)
     
  9. shi

    shi New Member

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    41
    censored,
    не позволяет, к сожалению, перегружать функции. Но я разобрался с тем, как гсс-срр называет функции, так что это ок.

    Всё-таки, разъясните мне, плиз, что же такое есть этот таинственный мейкфайл... я под никсами недавно, к тому же вокруг меня одни винды => с общей терминологией не знаком :dntknw:
     
  10. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    1) makefiles в виндоус мало чем отличаются от makefiles в *никс :), то, что Вы привели более похоже на make.bat, но тоже рабочий вариант :).
    2) из исходного вопроса я понял, что Вы из ассемблерного кода вызывается сишную (С++) функцию, так? не совсем понимаю в чем проблема, но все же предположу.... что мешает делать так?
    Код (Text):
    1. // C++ code
    2. extern "C" {
    3. void foo_void(void) {}
    4. void foo_int(int) {}
    5. void foo_str(const char *) {}
    6. }
    в таком случаем никакого манглежа функций не будет; они будут очень просто именоваться: _foo_void, _foo_int, _foo_str (или без подчеркивания -- не помню :)), и никаких проблем с вызовом из асма быть не должно. если же я неправильно понял исходный вопрос, пардон :)
     
  11. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    shi
    Можно переименовать *.cpp в *.c, если нет особой нужды в плюсах. Или линковать линкером g++. Символ __gxx_personality_v0 определён в стандартной либе C++.
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Спец. скрипт, который интерпретируется make, и в котором содержится последовательность действий для получения нужных тебе файлов.
     
  13. shi

    shi New Member

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    41
    censored,
    разумеется, ничто не мешает :). Я пока так и делаю. Это вопрос удобства.
    Только у меня они, почему-то, назвались так:
    _Z8foo_voidv,_Z7foo_inti,_Z7foo_strPc
    (последняя так - если без const)

    А фишки
    я не знал - спасибо.

    И спасибо всем за ответы!