как? собираю с флагами линкера /DYNAMICBASE и /FIXED:NO, под x86 собирается нормально (с релоками), под x64 таблица релоков не генерируется... объясните в чем проблема, может я что-то забыл (или не знал)? и гугл чет не помог в этот раз... (собираю Visual Studio 2010)
Rel у меня без доп настроек с релоками Код (Text): TECHNICAL FILE INFORMATION : File Type Description : Portable Executable (PE) FILE CHARACTERISTICS : File is executable (i.e. no unresolved external references) LARGE_ADDRESS_AWARE (can handle >2Gb Addresses) FILE HEADER : Machine: 8664h (AMD64 (K8)) Number of Sections: 0007h Time Date Stamp: 4C13F55Eh -> 13/06/2010 01:00:14 Symbols Pointer: 00000000h Number Of Symbols: 00000000h Size Of Optional Header: 00F0h Flags: 0022h OPTIONAL HEADER : Magic 020Bh ( PE32+ : 64-bit ready ) Linker version 10.00 Size of code 00004400h Size of initialized data 00004200h Size of uninitialized data 00000000h Address of Entry Point (RVA) 000011E0h Base of code 00001000h Image base 0000000140000000h Section Alignment 00001000h File Alignment 00000200h Required OS version 5.02 Image version 0.00 Subsystem version 5.02 Reserved1 0 Size of image 0000E000h ( 57344 bytes) Size of headers 00000400h Checksum 00000000h Subsystem 0003h (Image runs in the Windows character subsystem) DLL Characteristics 8140h Image is Terminal Server aware Size of Stack Reserve 0000000000100000h Size of Stack Commit 0000000000001000h Size of Heap Reserve 0000000000100000h Size of Heap Commit 0000000000001000h loader flags 00000000h (obsolete) Number of Data Directory 00000010h DATA DIRECTORY (Virtual Address and Size) Export Directory rva: 00000000h size: 00000000h Import Directory rva: 0000B000h size: 0000003Ch Resource Directory rva: 0000C000h size: 00000459h Exception table rva: 0000A000h size: 00000264h Security table rva: 00000000h size: 00000000h Base Relocation table rva: 0000D000h size: 00000034h Debug Directory rva: 00006770h size: 0000001Ch Architecture Specific Data rva: 00000000h size: 00000000h Global Pointer rva: 00000000h size: 00000000h TLS Directory rva: 00000000h size: 00000000h Load config table rva: 00000000h size: 00000000h Bound Import table rva: 00000000h size: 00000000h Import Address Table rva: 0000B2E8h size: 000002A8h Delay import descriptor rva: 00000000h size: 00000000h COM descriptor rva: 00000000h size: 00000000h unused rva: 00000000h size: 00000000h SECTION TABLE 01 .text VirtSize: 00004390h VirtAddr: 00001000h raw data offs: 00000400h raw data size: 00004400h relocation offs: 00000000h relocations: 00000000h line # offs: 00000000h line #'s: 00000000h characteristics: 60000020h CODE EXECUTE READ ALIGN_DEFAULT(16) 02 .rdata VirtSize: 000021C3h VirtAddr: 00006000h raw data offs: 00004800h raw data size: 00002200h relocation offs: 00000000h relocations: 00000000h line # offs: 00000000h line #'s: 00000000h characteristics: 40000040h INITIALIZED_DATA READ ALIGN_DEFAULT(16) 03 .data VirtSize: 00000770h VirtAddr: 00009000h raw data offs: 00006A00h raw data size: 00000200h relocation offs: 00000000h relocations: 00000000h line # offs: 00000000h line #'s: 00000000h characteristics: C0000040h INITIALIZED_DATA READ WRITE ALIGN_DEFAULT(16) 04 .pdata VirtSize: 000003CCh VirtAddr: 0000A000h raw data offs: 00006C00h raw data size: 00000400h relocation offs: 00000000h relocations: 00000000h line # offs: 00000000h line #'s: 00000000h characteristics: 40000040h INITIALIZED_DATA READ ALIGN_DEFAULT(16) 05 .idata VirtSize: 00000A91h VirtAddr: 0000B000h raw data offs: 00007000h raw data size: 00000C00h relocation offs: 00000000h relocations: 00000000h line # offs: 00000000h line #'s: 00000000h characteristics: C0000040h INITIALIZED_DATA READ WRITE ALIGN_DEFAULT(16) 06 .rsrc VirtSize: 00000459h VirtAddr: 0000C000h raw data offs: 00007C00h raw data size: 00000600h relocation offs: 00000000h relocations: 00000000h line # offs: 00000000h line #'s: 00000000h characteristics: 40000040h INITIALIZED_DATA READ ALIGN_DEFAULT(16) 07 .reloc VirtSize: 0000010Fh VirtAddr: 0000D000h raw data offs: 00008200h raw data size: 00000200h relocation offs: 00000000h relocations: 00000000h line # offs: 00000000h line #'s: 00000000h characteristics: 42000040h INITIALIZED_DATA DISCARDABLE READ ALIGN_DEFAULT(16)
может какие-то флаги/настройки линкера влияют? там оптимизации всякие... вот командная строка линкера: Код (Text): /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
компилятору может и не нужны... я просто использую самописный лоудер (аля memfile, но с доработками), мне необходимо, чтобы компилятор создавал релоки, чтобы я мог загружать и исполнять такие файлы с произвольной базой образа... и одновременно они должны быть обычными exe-файлами (не dll), чтобы их возможно было запускать отдельно от лоудера... вот такой косяк... я чет не пойму, ведь судя по описанию /FIXED:NO должен давать возможность загружать образ не по стандартной базе, но релоки не создаются, как то странно...
попробуйте поиграться со ссылками на глобальные объекты. например, функции и если опять не создаст релоков - брякнуться в около этого месте (собирать с дебуг инфой) и посмотреть во что компилится. может оно пиковское и не требует релоков?
да... помогло... не понял в чем дело было, но хотя бы теперь знаю, что можно попробовать сделать... спасибо! в том то и дело, что не пиковское... я пробовал грузить без релоков на произвольную базу, но поток вылетал на первом же обращении к таблице импорта, которая и должна быть релоцируема... не менее, чем хардкоженные строки и массивы например...
Я и имел ввиду что релоки не нужны загрузчику, но не твоему, а системному. Собери образ с имидж базой 0 и проверь, загрузит ли его ОС. Таблица импорта даже в 32 битах не требует фиксапов, обращения относительные. Вероятно что-то у тебя не так с кодом, наверняка через чур активно используются касты поинтеров? Ссылка на глобальный объект очевидно не решение, а проверка понял ли линкер ключи (не только /FIXED:NO но и /DYNAMICBASE дает при необходимости релоки)
J0E Обращения относительные разве что к таблице jmp-мостиков. К таблице импорта обращения всегда по абсолютным адресам.
l_inc, ага спасибо, пойду убьюсь о стену Увы, автору темы твое замечание никак не поможет, поскольку он теперь не будет разбираться сам. Придется исправляться мне. Итак, сама таблица импорта, то есть данные, не требует релокации ни в одном из режимов. Обращения к ней это код, и в long mode FF 15 относительный.
Сама таблица импорта требует правки, обращение к ней относительно (через регистр rip + offset) и его фиксить не надо. Да-да, привет спустя 8 лет - пишу пакер в образовательных целях. Гы-гы, первое в жизни собеседование на носу, а я месяца4 ничего не кодил. Ну-с, с Богом.
Rel, А зачем там релоки. В 64 они не юзаются, так как релатив адресация, адреса вычисляются от PC как смещение. Фиксапы не нужны, не удивительно что компилер их не собирает. Да и вам они зачем не понятно. Именно таблицы в 64 имеют релоки.
Indy_, релейтив адресация не всегда юзается. Например, если передавать указатель на что-то - компилятор может впихнуть абсолютный адрес. Релоки нужны и для кода.