I have a legacy static library written in Pascal which I need to call
from a C++ application targeting both PowerPC and x86 processors on
the Mac OS X platform ( a so-called universal binary). After
compiling and linking everything together, I'm having trouble calling
the Pascal runtime libraries: i.e. I crash.
Software used:
glenn% gpc -v
Reading specs from /Developer/Pascal/gpc345u2/lib/gcc/powerpc-apple-
darwin8/3.4.5/specs
Configured with: ../gcc-3.4.5/configure --enable-languages=pascal,c --
enable-threads=posix --target=powerpc-apple-darwin8 --host=powerpc-
apple-darwin8 --build=powerpc-apple-darwin8 --prefix=/Developer/
Pascal/gpc345u2
Thread model: posix
gpc version 20051116, based on gcc-3.4.5
gpc-i386 -vReading specs from /Developer/Pascal/gpc345u2/lib/gcc/i386-
apple-darwin8/3.4.5/specs
Configured with: ../gcc-3.4.5/configure --enable-languages=pascal,c --
enable-threads=posix --target=i386-apple-darwin8 --host=powerpc-apple-
darwin8 --build=powerpc-apple-darwin8 --prefix=/Developer/Pascal/
gpc345u2 --with-sysroot=/Developer/SDKs/MacOSX10.4u.sdk/ --with-
arch=pentium-m --with-tune=prescott
Thread model: posix
gpc version 20051116, based on gcc-3.4.5
Mac OS X 10.4.4
XCode 2.2.1
Source:
34 files of legacy Pascal which I've gone through and fixed all of
the compiler errorss and most of the warnings.
Steps I've taken.
1) Compiled and packaged using gpc, libtool, and lipo:
gpc -c --automake -Wl,-framework,Carbon -funit-path=/Developer/Pascal/
GPCPInterfaces/ MySrc.p
libtool -static *.o -o MyLibPPC.a
rm *.gpi
rm *.o
gpc-i386 -c --automake -Wl,-framework,Carbon -funit-path=/Developer/
Pascal/GPCPInterfaces/ MySrc.p
libtool -static *.o -o MyLibx86.a
lipo *.a -create -output MyLib.a
2) Made a universal version of the gpc.a library
lipo /Developer/Pascal/gpc345u2/lib/gcc/i386-apple-darwin8/3.4.5/
libgpc.a /Developer/Pascal/gpc345u2/lib/gcc/powerpc-apple-
darwin8/3.4.5/libgpc.a -create -output gpc.a
3) Added both libraries to my XCode 2.2.1 C++ application
4) Compile and Links without running, crashes as soon as it tries to
call WriteLn, if I remove the WriteLn, it crashes later in a call to
the file routine Assign, which might be the first runtime library call.
I declare the entry in C++ as:
extern "C" short MyEntry(const char *path);
In Pascal, I declare it as
const MaxPointerChars = 20000;
Type
PAPointerChar=^APointerChar;
APointerChar = Packed Array [0..MaxPointerChars] of Char;
Int16 = Integer attribute ( size = 16);
...
function MyEntry(DllPathC:PAPointerChar):Int16; attribute (name =
'MyEntry');
...
function MyEntry(aCString:PAPointerChar):Int16;
var
DLLPath:String2048;
pathLength:Int32;
i:Int32;
begin
pathLength := StrLen(aCString);
if pathLength > 2048 then pathLength := 2048;
DLLPath := '';
for i := 1 to pathLength do
begin
DLLPath := DLLPath + aCString^[i-1];
end;
WriteLn(DLLPath); { crashes here}
...
gdb gives me the following console output:
Running…
Program received signal: "EXC_BAD_ACCESS".
Unable to disassemble _p_Write_Init.
5) I've written a little test application in Pascal to debug the
libraries code (when it is not packaged as a library but compiled
directly into the application) and the code works perfectly well in
that environment. The debugging was done with XCode 2.1 as I believe
there is a problem with gpc and XCode 2.2.
So how do I fix this?