[fpc-pascal] Linking object file
Tomas Hajny
XHajT03 at hajny.biz
Thu Mar 20 10:21:58 CET 2014
On Wed, March 19, 2014 23:49, Darius Blaszyk wrote:
Hi,
> I was wondering if it's possible to link FPC object files by using the
> $Link directive? At least I have troubles in getting this to work and
> therefore I'm asking here. Please consider the minimal example I have
> attached to this email.
>
> When linking the object file that implements the test_proc procedure I
> get the following compiler output:
>
> Hint: Start of reading config file
> C:lazarusfpc2.6.2binx86_64-win64fpc.cfg
> Hint: End of reading config file C:lazarusfpc2.6.2binx86_64-win64fpc.cfg
> Free Pascal Compiler version 2.6.2 [2014/02/28] for x86_64
> Copyright (c) 1993-2012 by Florian Klaempfl and others
> Target OS: Win64 for x64
> Compiling test.pp
> Linking test.exe
> test.pp(8,1) Error: Undefined symbol: TEST_INT_TEST_PROC
> test.pp(8,1) Fatal: There were 1 errors compiling module, stopping
>
> What is needed in the test_impl.pas file so the linker can find the
> implemented function? Do I need to create a library and export the
> function perhaps?
Basically, you have two options:
1) Provide the import declaration with the mangled name (i.e. the name
really stored within the .o file). This may possibly change between
different FPC versions, but if you intend to link to an existing object
file, you would already know which one was used. In your case, this would
mean changing line 7 in test_int.pas to:
procedure test_proc; external name 'TEST_IMPL_TEST_PROC';
(the mangled name may be found either by using -a when compiling
test_impl.pas and looking into the generated test_impl.s or e.g. by using
'objdump -t test_impl.o'.
2) Specify your own name during rather than relying on some mangling rules
- change line 7 in test_impl.pas to:
procedure test_proc; export alias: 'My_Test_Proc';
and then line 7 in test_int.pas needs to change accordingly to:
procedure test_proc; external name 'My_Test_Proc';
Tomas
More information about the fpc-pascal
mailing list