Собрать exe-файл под x64 с релоками

Тема в разделе "LANGS.C", создана пользователем Rel, 14 июл 2010.

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.242
    как? собираю с флагами линкера /DYNAMICBASE и /FIXED:NO, под x86 собирается нормально (с релоками), под x64 таблица релоков не генерируется... объясните в чем проблема, может я что-то забыл (или не знал)? и гугл чет не помог в этот раз... (собираю Visual Studio 2010)
     
  2. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Rel
    у меня без доп настроек с релоками
    Код (Text):
    1. TECHNICAL FILE INFORMATION :
    2. File Type Description : Portable Executable (PE)
    3.  
    4. FILE CHARACTERISTICS :
    5.         File is executable  (i.e. no unresolved external references)
    6.         LARGE_ADDRESS_AWARE (can handle >2Gb Addresses)
    7. FILE HEADER :
    8.  
    9.     Machine:                        8664h (AMD64 (K8))
    10.     Number of Sections:             0007h
    11.     Time Date Stamp:                4C13F55Eh  -> 13/06/2010  01:00:14  
    12.     Symbols Pointer:                00000000h
    13.     Number Of Symbols:              00000000h
    14.     Size Of Optional Header:        00F0h
    15.     Flags:                          0022h
    16.  
    17. OPTIONAL HEADER :
    18.     Magic                           020Bh ( PE32+ : 64-bit ready )
    19.     Linker version                  10.00
    20.     Size of code                    00004400h
    21.     Size of initialized data        00004200h
    22.     Size of uninitialized data      00000000h
    23.     Address of Entry Point (RVA)    000011E0h
    24.     Base of code                    00001000h
    25.     Image base                      0000000140000000h
    26.     Section Alignment               00001000h
    27.     File Alignment                  00000200h
    28.     Required OS version             5.02
    29.     Image version                   0.00
    30.     Subsystem version               5.02
    31.     Reserved1                       0
    32.     Size of image                   0000E000h ( 57344 bytes)
    33.     Size of headers                 00000400h
    34.     Checksum                        00000000h
    35.     Subsystem                       0003h (Image runs in the Windows character subsystem)
    36.     DLL Characteristics             8140h
    37.                                     Image is Terminal Server aware
    38.     Size of Stack Reserve           0000000000100000h
    39.     Size of Stack Commit            0000000000001000h
    40.     Size of Heap Reserve            0000000000100000h
    41.     Size of Heap Commit             0000000000001000h
    42.     loader flags                    00000000h (obsolete)
    43.     Number of Data Directory        00000010h
    44.  
    45. DATA DIRECTORY (Virtual Address and Size)
    46.     Export Directory    rva: 00000000h      size: 00000000h
    47.     Import Directory    rva: 0000B000h      size: 0000003Ch
    48.     Resource Directory      rva: 0000C000h      size: 00000459h
    49.     Exception table     rva: 0000A000h      size: 00000264h
    50.     Security table      rva: 00000000h      size: 00000000h
    51.     Base Relocation table   rva: 0000D000h      size: 00000034h
    52.     Debug Directory     rva: 00006770h      size: 0000001Ch
    53.     Architecture Specific Data      rva: 00000000h      size: 00000000h
    54.     Global Pointer      rva: 00000000h      size: 00000000h
    55.     TLS Directory   rva: 00000000h      size: 00000000h
    56.     Load config table   rva: 00000000h      size: 00000000h
    57.     Bound Import table      rva: 00000000h      size: 00000000h
    58.     Import Address Table    rva: 0000B2E8h      size: 000002A8h
    59.     Delay import descriptor     rva: 00000000h      size: 00000000h
    60.     COM descriptor      rva: 00000000h      size: 00000000h
    61.     unused          rva: 00000000h      size: 00000000h
    62.  
    63. SECTION TABLE
    64. 01 .text    
    65.     VirtSize:   00004390h  VirtAddr:        00001000h
    66.     raw data offs:      00000400h  raw data size:   00004400h
    67.     relocation offs:    00000000h  relocations:     00000000h
    68.     line # offs:        00000000h  line #'s:        00000000h
    69.     characteristics:    60000020h
    70.     CODE  EXECUTE  READ  ALIGN_DEFAULT(16)  
    71. 02 .rdata    
    72.     VirtSize:   000021C3h  VirtAddr:        00006000h
    73.     raw data offs:      00004800h  raw data size:   00002200h
    74.     relocation offs:    00000000h  relocations:     00000000h
    75.     line # offs:        00000000h  line #'s:        00000000h
    76.     characteristics:    40000040h
    77.     INITIALIZED_DATA  READ  ALIGN_DEFAULT(16)  
    78. 03 .data    
    79.     VirtSize:   00000770h  VirtAddr:        00009000h
    80.     raw data offs:      00006A00h  raw data size:   00000200h
    81.     relocation offs:    00000000h  relocations:     00000000h
    82.     line # offs:        00000000h  line #'s:        00000000h
    83.     characteristics:    C0000040h
    84.     INITIALIZED_DATA  READ  WRITE  ALIGN_DEFAULT(16)  
    85. 04 .pdata    
    86.     VirtSize:   000003CCh  VirtAddr:        0000A000h
    87.     raw data offs:      00006C00h  raw data size:   00000400h
    88.     relocation offs:    00000000h  relocations:     00000000h
    89.     line # offs:        00000000h  line #'s:        00000000h
    90.     characteristics:    40000040h
    91.     INITIALIZED_DATA  READ  ALIGN_DEFAULT(16)  
    92. 05 .idata    
    93.     VirtSize:   00000A91h  VirtAddr:        0000B000h
    94.     raw data offs:      00007000h  raw data size:   00000C00h
    95.     relocation offs:    00000000h  relocations:     00000000h
    96.     line # offs:        00000000h  line #'s:        00000000h
    97.     characteristics:    C0000040h
    98.     INITIALIZED_DATA  READ  WRITE  ALIGN_DEFAULT(16)  
    99. 06 .rsrc    
    100.     VirtSize:   00000459h  VirtAddr:        0000C000h
    101.     raw data offs:      00007C00h  raw data size:   00000600h
    102.     relocation offs:    00000000h  relocations:     00000000h
    103.     line # offs:        00000000h  line #'s:        00000000h
    104.     characteristics:    40000040h
    105.     INITIALIZED_DATA  READ  ALIGN_DEFAULT(16)  
    106. 07 .reloc    
    107.     VirtSize:   0000010Fh  VirtAddr:        0000D000h
    108.     raw data offs:      00008200h  raw data size:   00000200h
    109.     relocation offs:    00000000h  relocations:     00000000h
    110.     line # offs:        00000000h  line #'s:        00000000h
    111.     characteristics:    42000040h
    112.     INITIALIZED_DATA  DISCARDABLE  READ  ALIGN_DEFAULT(16)
     
  3. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.242
    может какие-то флаги/настройки линкера влияют? там оптимизации всякие... вот командная строка линкера:
    Код (Text):
    1. /OUT:"D:\PROG\DFT\x64\Release\dft.exe" /INCREMENTAL:NO /NOLOGO /NODEFAULTLIB /MANIFEST:NO /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /PGD:"D:\PROG\DFT\x64\Release\dft.pgd" /LTCG /TLBID:1 /ENTRY:"WinMain" /DYNAMICBASE /FIXED:NO /NXCOMPAT:NO /MACHINE:X64 /ERRORREPORT:QUEUE
     
  4. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Может релоки не нужны? Попробуй собрать более крупный проект.
     
  5. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.242
    компилятору может и не нужны... я просто использую самописный лоудер (аля memfile, но с доработками), мне необходимо, чтобы компилятор создавал релоки, чтобы я мог загружать и исполнять такие файлы с произвольной базой образа... и одновременно они должны быть обычными exe-файлами (не dll), чтобы их возможно было запускать отдельно от лоудера... вот такой косяк... я чет не пойму, ведь судя по описанию /FIXED:NO должен давать возможность загружать образ не по стандартной базе, но релоки не создаются, как то странно...
     
  6. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    попробуйте поиграться со ссылками на глобальные объекты. например, функции и если опять не создаст релоков - брякнуться в около этого месте (собирать с дебуг инфой) и посмотреть во что компилится. может оно пиковское и не требует релоков?
     
  7. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.242
    да... помогло... не понял в чем дело было, но хотя бы теперь знаю, что можно попробовать сделать... спасибо!

    в том то и дело, что не пиковское... я пробовал грузить без релоков на произвольную базу, но поток вылетал на первом же обращении к таблице импорта, которая и должна быть релоцируема... не менее, чем хардкоженные строки и массивы например...
     
  8. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Я и имел ввиду что релоки не нужны загрузчику, но не твоему, а системному. Собери образ с имидж базой 0 и проверь, загрузит ли его ОС. Таблица импорта даже в 32 битах не требует фиксапов, обращения относительные. Вероятно что-то у тебя не так с кодом, наверняка через чур активно используются касты поинтеров? Ссылка на глобальный объект очевидно не решение, а проверка понял ли линкер ключи (не только /FIXED:NO но и /DYNAMICBASE дает при необходимости релоки)
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    J0E
    Обращения относительные разве что к таблице jmp-мостиков. К таблице импорта обращения всегда по абсолютным адресам.
     
  10. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    l_inc, ага спасибо, пойду убьюсь о стену :) Увы, автору темы твое замечание никак не поможет, поскольку он теперь не будет разбираться сам. Придется исправляться мне.

    Итак, сама таблица импорта, то есть данные, не требует релокации ни в одном из режимов. Обращения к ней это код, и в long mode FF 15 относительный.
     
  11. unc1e

    unc1e Active Member

    Публикаций:
    2
    Регистрация:
    28 июл 2017
    Сообщения:
    287
    Сама таблица импорта требует правки, обращение к ней относительно (через регистр rip + offset) и его фиксить не надо. Да-да, привет спустя 8 лет - пишу пакер в образовательных целях. Гы-гы, первое в жизни собеседование на носу, а я месяца4 ничего не кодил. Ну-с, с Богом.
     
  12. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Rel,

    А зачем там релоки. В 64 они не юзаются, так как релатив адресация, адреса вычисляются от PC как смещение. Фиксапы не нужны, не удивительно что компилер их не собирает. Да и вам они зачем не понятно.

    Именно таблицы в 64 имеют релоки.
     
  13. unc1e

    unc1e Active Member

    Публикаций:
    2
    Регистрация:
    28 июл 2017
    Сообщения:
    287
    Indy_, релейтив адресация не всегда юзается. Например, если передавать указатель на что-то - компилятор может впихнуть абсолютный адрес. Релоки нужны и для кода.
     
  14. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    unc1e,

    Не может, абсолютная адресация недопустима из за безопасности.
     
  15. unc1e

    unc1e Active Member

    Публикаций:
    2
    Регистрация:
    28 июл 2017
    Сообщения:
    287
    Indy_, могу дать семпл, который лично встретил. Я ж релоки не просто так фиксил