[fpc-devel]Library linking with C explanation
Sergey Korshunoff
Sergey.Korshunoff at p5.f2666.n5020.z2.fidonet.org
Wed Jun 20 00:29:19 CEST 2001
>> >> Reply-To: core at freepascal.org
>> >> Date: Sun, 3 Jun 2001 15:12:42 +0200 (CEST)
>> >> From: Peter Vreman <pfv at cooldown.demon.nl>
>> >> X-Sender: pfv at dell
>> >> To: core at freepascal.org
>> >> Subject: Library linking with C working !
>> >>
>> >>
>> >> It was more easy than i first thought. No need for .ctor and
>> >> .dtor stuff. Just pass "-init <Symbolname>" to the linker and the
>> >> symbol to run at load of the library is set. The same for -fini.
>> >>
>> >> The 1.0.5 compiler works correctly.
>>
>> Congratulation!
>> We speak about last variant of 1.0.5 -- that is right?
>> FPC 1.0.5 from 14 march 2001 do not works correctly.
As I see from compiler source LOG, changes are made at 6 june 2001.
And "-init SYMBOL" key is quite new for ld. My old ld do not have it.
It upgraded to GNU ld 2.10.90 (Copyright 2000 Free Software Foundation).
I use glibc v2.1.1. Result:
In my configuration 1.0.5 _do not_ work correctly.
There is problem with argc, argv, envp.
Are You shure, that INIT function for *.so can get this args?
I look sources from ld-linux.so. As I understand, this args are
send to global constructors and not to *.so INIT function.
I examine DCC behavior.
There is no ParamCount and ParamStr avaible for library functions
( ParamCount result in DCC compiled example is 0).
And GetEnvironmentVariable() in DCC use function from libc
There is error in FPC 1.0.5 ParamCount:
it result is -1 when argc is 0
My patches:
=========================================
diff -urN 1.0.5-010619/rtl/linux/i386/dllprt0.as rtl/linux/i386/dllprt0.as
-+- 1.0.5-010619/rtl/linux/i386/dllprt0.as Wed Jun 13 03:39:42 2001
+++ rtl/linux/i386/dllprt0.as Tue Jun 19 18:27:48 2001
@@ -26,12 +26,16 @@
pushl %ebp
movl %esp,%ebp
- movl 8(%ebp),%eax
- movl 12(%ebp),%ecx
- movl 16(%ebp),%edx
-
+# movl 8(%ebp),%eax
+ movl $0,%eax
movl %eax,U_SYSLINUX_ARGC /* Move the argument counter */
+
+# movl 12(%ebp),%ecx
+ movl $0,%ecx
movl %ecx,U_SYSLINUX_ARGV /* Move the argument pointer */
+
+# movl 16(%ebp),%edx
+ movl $0,%edx
movl %edx,U_SYSLINUX_ENVP /* Move the environment pointer */
movb $1,U_SYSLINUX_ISLIBRARY
diff -urN 1.0.5-010619/rtl/objpas/syspch.inc rtl/objpas/syspch.inc
-+- 1.0.5-010619/rtl/objpas/syspch.inc Wed Jan 31 05:15:26 2001
+++ rtl/objpas/syspch.inc Tue Jun 19 19:17:21 2001
@@ -37,8 +37,11 @@
function StrPas(Str: PChar): string;
begin
- SetLength(result, StrLen(Str));
- Move(Str^, result[1], Length(result));
+ if Str = nil then StrPas:=''
+ else begin
+ SetLength(result, StrLen(Str));
+ Move(Str^, result[1], Length(result));
+ end;
end ;
{ StrAlloc allocates a buffer of Size + 4
diff -urN 1.0.5-010619/rtl/unix/sysunix.inc rtl/unix/sysunix.inc
-+- 1.0.5-010619/rtl/unix/sysunix.inc Wed Jun 13 03:40:26 2001
+++ rtl/unix/sysunix.inc Wed Jun 20 03:01:48 2001
@@ -55,7 +55,9 @@
Function ParamCount: Longint;
Begin
- Paramcount:=argc-1
+ if argc = 0 then
+ Paramcount:=argc else
+ Paramcount:=argc-1;
End;
=========================================
Regards,
Sergey Korshunoff
More information about the fpc-devel
mailing list