Всем привет.
Задача стоит в "выдёргивании" скомпилированного кода из *.o файлов, с целью его последующего самостоятельного выполнения.
Не подскажите, где можно почитать о его структуре?
Модератор: Модераторы
Фактически, ты будешь вынужден делать линковку, а это довольно дорогая процедура, и релокации в загруженных секциях, ну и не забудь, что может потребоваться (если ты используешь виндовый RTL, то обязательно потребуется) импорт DLL
alex@notebook:~/prj/codetools/trunk/link> svn info
Path: .
URL: svn://svn.shamangrad.net/codetools/trunk/link
Repository Root: svn://svn.shamangrad.net/codetools
Repository UUID: 8795bce7-64d0-dd11-9702-0030485a0448
Revision: 5
Node Kind: directory
Schedule: normal
Last Changed Author: shade
Last Changed Rev: 5
Last Changed Date: 2008-12-23 02:55:10 +0300 (Втр, 23 Дек 2008)
alex@notebook:~/prj/codetools/trunk/link> ./test.sh
compile dload...
Free Pascal Compiler version 2.2.2 [2008/10/25] for i386
Copyright (c) 1993-2008 by Florian Klaempfl
Target OS: Linux for i386
Compiling dload.pas
Compiling sys.pas
Compiling soff.pas
Compiling mylink.pas
Compiling coff.pas
Compiling ar.pas
Compiling aout.pas
Linking dload
3180 lines compiled, 0.3 sec
compile hello.pas
Free Pascal Compiler version 2.2.2 [2008/10/25] for i386
Copyright (c) 1993-2008 by Florian Klaempfl
Target OS: Linux for i386
Compiling hello.pas
Assembling hello
20 lines compiled, 0.0 sec
run dload...
dload 0.1.0, (c) 2008, zolotov-alex@shamangrad.net
loading hello.o
mark sections...
relocate...
resolve...
run...
hello world :)
ok
alex@notebook:~/prj/codetools/trunk/link>
echo compile dload...
fpc -Mobjfpc dload.pas
echo compile hello.pas
fpc -al -Anasmobj hello.pas
nasm -f coff hello.s -o hello.o
echo run dload...
./dload -entry HELLO_MAIN hello.o
bw писал(а):Не понятно, как этот код работает.
В hello.o отсутствует реализация PrintLn/WriteLn.
println_sys := TSymbol.Create(nil);
println_sys.Name := 'SYS_PRINTLN$ANSISTRING';
println_sys.Offset := Longword( @println );
println_sys.SymType := SOFF_EXTERN;
println_sys.Section := dummy;
Linker.Globals.Add(println_sys);
XProger писал(а):А если объектный файл абсолютно независим (не использует API и RTL/CRT), то такие фокусы не понадобятся? Релоки нужно учитывать только при взаимосвязях модулей? )
alex@notebook:~> fpc -h | grep PIC
-Cg Generate PIC code
-fPIC Same as -Cg
alex@notebook:~>
// Создаем компоновщик
Linker := TRuntimeLinker.Create;
try
// Используем оригинальный COFF
Linker.UseMSCOFF := false;
// подключаем API
api := Linker.Modules.Add.Sections.Add;
api.AddGlobal('SYS_PRINTLN$ANSISTRING', @println);
api.AddGlobal('FPC_PUSHEXCEPTADDR', @FPC_PUSHEXCEPTADDR);
api.AddGlobal('FPC_SETJMP', @FPC_SETJMP);
api.AddGlobal('FPC_POPADDRSTACK', @FPC_POPADDRSTACK);
api.AddGlobal('FPC_RERAISE', @FPC_RERAISE);
api.AddGlobal('FPC_ANSISTR_DECR_REF', @FPC_ANSISTR_DECR_REF);
api.AddGlobal('fpc_shortstr_to_ansistr', @fpc_shortstr_to_ansistr);
api.AddGlobal('SYSTEM_TOBJECT_$__CLASSNAME$$SHORTSTRING', @TObject.ClassName);
// Загружаем объектный модуль
mod_hello := Linker.LoadFile('hello.o');
// Компонуем
Linker.Link;
// Выполняем код
Linker.Execute('HELLO_MAIN');
// выгрузить mod_hello
Linker.Modules.Remove(mod_hello);
// загрузить другой модуль 'showclass.o'
mod_showclass := Linker.LoadFile('showclass.o');
// перекомпонуем
Linker.Link;
Linker.Execute('SHOWCLASS_SHOWCLASSNAME$TOBJECT', Linker);
Linker.Execute('SHOWCLASS_SHOWCLASSNAME$TOBJECT', mod_showclass);
finally
// Почистить мусор
Linker.Free;
end;
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13