Visual Studio порядок линковки

Тема в разделе "WASM.BEGINNERS", создана пользователем gloomyraven, 2 сен 2009.

  1. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Здрасьте!

    Есть проект в VS2005, в проекте, допустим, 10 модулей, в одном из модулей есть функция func(), нужно сделать так, чтобы она была самой последней в выходном файле. Сейчас просто задаю порядок следования функций с помощью опции /ORDER, но с ростом проекта уже задолбался каждую функцию добавлять в этот список. (приходится утилитой DUMPBIN /symbols *.obj вытаскивать все имена и последней ставить func())

    Подскажите плиз как сделать сабж...
     
  2. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Так всё так. Только Pre-Link Step добавить, чтобы перед линковкой все нужные действия сами выполнялись. Если один кинет сюда минимальный проект для сборки с, допустим, двумя модулями и функциями в каждом, мы даже сгенерируем батник.
     
  3. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    а зачем сам проект вам (даже пустой), может проще сюда батник написать?..
     
  4. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    А чтобы батник потестить и косяки убрать – а свой проект создавать неохота, ага. Ну да ладно, вот однолинейник:
    Код (Text):
    1. @del order.txt & (@for %f in (*.obj) do @for /f "tokens=8" %i in ('dumpbin /symbols %f ^| findstr /R "\ notype\ ()    "') do @(@set func=%i & @if !func:~0^,1!==_ ( @echo !func:~1!>>order.txt ) else ( @echo %i>>order.txt ))) & @echo func>>order.txt
    К сожалению, оказалось, что это отвратный способ. Во-первых, не все функции захватывает, во-вторых, тормозит, в-третьих, выглядит отвратительно (даже если юзать ключи /ignore:4097 и /ignore:4037).

    Вместо этого вот ультимативный, великолепный способ:
    Код (Text):
    1. #pragma code_seg(push, ".text$zzz")
    2. void func()
    3. {
    4. ...
    5. }
    6. #pragma code_seg(pop)
    Линкер соберёт все секции ".text$***" в секцию ".text", причём расположит их в алфавитном порядке. (Валидно; Используется в CRT).
     
  5. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Sol_Ksacap
    Отлично! Большой сэнкс!
    А я извращался так: создавал отдельный .obj с одной функцией (кот. должна была идти последней), но линкер все равно пихал ее в середину экзешника... Тоже самое с именами: даже если я давал имя вместо func() zzzzzzzzzzzz() линкер также пихал в середину... А твой способ работает на ура :)
    Тема закрыта.