public inbox for cygwin@cygwin.com
 help / color / mirror / Atom feed
* Building cpan module that links with proprietary libs
@ 2014-05-29  4:25 Andrew DeFaria
  2014-05-29  8:58 ` Csaba Raduly
  0 siblings, 1 reply; 9+ messages in thread
From: Andrew DeFaria @ 2014-05-29  4:25 UTC (permalink / raw)
  To: cygwin

I'm attempting to build a cpan module (well actually it's not a cpan 
module but rather a module that uses MakeMaker and has the familiar perl 
Makefile.PL, make, make test, make install installation procedure. 
Additionally I need to link it to a set of proprietary libs that I am 
given only the .lib files for. If you must know this is for Perforce's 
P4Perl which I'd like to get working with Cygwin's Perl natively.

I download the P4API bundle (the package that has include files and the 
.lib files pre-compiled). Next I need to do:

$ perl Makefile.PL --api-dir /.../path/to/unzipped/p4api

This works fine and I procedure with the make. This fails with things like:

make[1]: Leaving directory '/cygdrive/a/perl/P4Perl.Cygwin/lib'
g++ -c  -I/cygdrive/a/perl/p4api.windows/include/p4 -Ilib -x c++ 
-DUSEIMPORTLIB -O3   -DVERSION=\"2014.1\" -DXS_VERSION=\"2014.1\" 
"-I/usr/lib/perl5/5.14/x86_64-cygwin-threads/CORE" 
-DID_OS="\"CYGWIN17THREAD\"" -DID_REL="\"2014.1\"" 
-DID_PATCH="\"842847\"" -DID_Y="\"2014\"" -DID_M="\"05\"" 
-DID_D="\"06\"" -DOS_CYGWIN -DOS_CYGWIN17 -DOS_CYGWIN17THREAD 
-DOS_CYGWINTHREAD -DP4API_VERSION="515585" -DID_API="\"2014.1/821990\"" P4.c
Running Mkbootstrap for P4 ()
chmod 644 P4.bs
rm -f blib/arch/auto/P4/P4.dll
g++  -shared P4.o  -o blib/arch/auto/P4/P4.dll lib/libp4.a      \
   /usr/lib/perl5/5.14/x86_64-cygwin-threads/CORE/cygperl5_14.dll        \

P4.o:P4.c:(.text+0x45ac): undefined reference to 
`ClientApi::SetClient(char const*)'
P4.o:P4.c:(.text+0x45ac): relocation truncated to fit: R_X86_64_PC32 
against undefined symbol `ClientApi::SetClient(char const*)'
P4.o:P4.c:(.text+0x4a9c): undefined reference to 
`ClientApi::SetHost(char const*)'

Notice that it removes P4.dll, so it seems to know it's working with 
dll's, but then it calls g++ with a -o for libp4.a! Why a .a? Shouldn't 
this be .dll?

Meantime it fails with many undefined references. I think I might need 
to do perl Makefile.PL with other opts to tell it that while it's using 
Cygwin and can be very Linux-like, it needs to produce .dll's and not 
.a's or .o's.

Has anybody managed to do this? What am I doing wrong?
-- 
Andrew DeFaria
http://defaria.com


--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Building cpan module that links with proprietary libs
  2014-05-29  4:25 Building cpan module that links with proprietary libs Andrew DeFaria
@ 2014-05-29  8:58 ` Csaba Raduly
  2014-05-29 20:34   ` Andrew DeFaria
  0 siblings, 1 reply; 9+ messages in thread
From: Csaba Raduly @ 2014-05-29  8:58 UTC (permalink / raw)
  To: cygwin list

Hi Andrew,

On Thu, May 29, 2014 at 4:12 AM, Andrew DeFaria  wrote:
> I'm attempting to build a cpan module (well actually it's not a cpan module
> but rather a module that uses MakeMaker and has the familiar perl
> Makefile.PL, make, make test, make install installation procedure.
> Additionally I need to link it to a set of proprietary libs that I am given
> only the .lib files for. If you must know this is for Perforce's P4Perl
> which I'd like to get working with Cygwin's Perl natively.
>
> I download the P4API bundle (the package that has include files and the .lib
> files pre-compiled).

The C++ P4 API is platform-specific; which platform did you choose?
If it really contains .lib files (not .a), those are not recognized by
Cygwin's gcc.

> Next I need to do:
>
> $ perl Makefile.PL --api-dir /.../path/to/unzipped/p4api
>
> This works fine and I procedure with the make. This fails with things like:
>
> make[1]: Leaving directory '/cygdrive/a/perl/P4Perl.Cygwin/lib'
> g++ -c  -I/cygdrive/a/perl/p4api.windows/include/p4 -Ilib -x c++
> -DUSEIMPORTLIB -O3   -DVERSION=\"2014.1\" -DXS_VERSION=\"2014.1\"
> "-I/usr/lib/perl5/5.14/x86_64-cygwin-threads/CORE"
> -DID_OS="\"CYGWIN17THREAD\"" -DID_REL="\"2014.1\"" -DID_PATCH="\"842847\""
> -DID_Y="\"2014\"" -DID_M="\"05\"" -DID_D="\"06\"" -DOS_CYGWIN -DOS_CYGWIN17
> -DOS_CYGWIN17THREAD -DOS_CYGWINTHREAD -DP4API_VERSION="515585"
> -DID_API="\"2014.1/821990\"" P4.c
> Running Mkbootstrap for P4 ()
> chmod 644 P4.bs
> rm -f blib/arch/auto/P4/P4.dll
> g++  -shared P4.o  -o blib/arch/auto/P4/P4.dll lib/libp4.a      \
>   /usr/lib/perl5/5.14/x86_64-cygwin-threads/CORE/cygperl5_14.dll        \
>
> P4.o:P4.c:(.text+0x45ac): undefined reference to `ClientApi::SetClient(char
> const*)'
> P4.o:P4.c:(.text+0x45ac): relocation truncated to fit: R_X86_64_PC32 against
> undefined symbol `ClientApi::SetClient(char const*)'
> P4.o:P4.c:(.text+0x4a9c): undefined reference to `ClientApi::SetHost(char
> const*)'
>
> Notice that it removes P4.dll, so it seems to know it's working with dll's,
> but then it calls g++ with a -o for libp4.a!

No it doesn't. The argument to -o is blib/arch/auto/P4/P4.dll
lib/libp4.a is the next input file. What does the following say?

nm lib/libp4.a | c++filt

> Meantime it fails with many undefined references. I think I might need to do
> perl Makefile.PL with other opts to tell it that while it's using Cygwin and
> can be very Linux-like, it needs to produce .dll's and not .a's or .o's.

It seems to be on the right track; "g++ -shared -o P4.dll" sounds good to me.

Csaba
-- 
GCS a+ e++ d- C++ ULS$ L+$ !E- W++ P+++$ w++$ tv+ b++ DI D++ 5++
The Tao of math: The numbers you can count are not the real numbers.
Life is complex, with real and imaginary parts.
"Ok, it boots. Which means it must be bug-free and perfect. " -- Linus Torvalds
"People disagree with me. I just ignore them." -- Linus Torvalds

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Building cpan module that links with proprietary libs
  2014-05-29  8:58 ` Csaba Raduly
@ 2014-05-29 20:34   ` Andrew DeFaria
  2014-05-30  6:49     ` Larry Hall (Cygwin)
  0 siblings, 1 reply; 9+ messages in thread
From: Andrew DeFaria @ 2014-05-29 20:34 UTC (permalink / raw)
  To: cygwin

[-- Attachment #1: Type: text/plain, Size: 3866 bytes --]

On 5/29/2014 1:29 AM, Csaba Raduly wrote:
> Hi Andrew,
>
> On Thu, May 29, 2014 at 4:12 AM, Andrew DeFaria  wrote:
>> I'm attempting to build a cpan module (well actually it's not a cpan module
>> but rather a module that uses MakeMaker and has the familiar perl
>> Makefile.PL, make, make test, make install installation procedure.
>> Additionally I need to link it to a set of proprietary libs that I am given
>> only the .lib files for. If you must know this is for Perforce's P4Perl
>> which I'd like to get working with Cygwin's Perl natively.
>>
>> I download the P4API bundle (the package that has include files and the .lib
>> files pre-compiled).
>
> The C++ P4 API is platform-specific; which platform did you choose?
> If it really contains .lib files (not .a), those are not recognized by
> Cygwin's gcc.

I had two archives two choose from. One was for Windows and contained 
the .lib files. The other was for Linux and contains .a files. I first 
tried the Linux one but that failed with:

g++  -shared P4.o  -o blib/arch/auto/P4/P4.dll lib/libp4.a      \
   /usr/lib/perl5/5.14/x86_64-cygwin-threads/CORE/cygperl5_14.dll 
-L/cygdrive/a/p4perlBuild/p4api/lib -lclient -lrpc -lsupp -lp4sslstub 
        \

collect2: error: ld terminated with signal 11 [Segmentation fault], core 
dumped
Makefile:531: recipe for target 'blib/arch/auto/P4/P4.dll' failed
make: *** [blib/arch/auto/P4/P4.dll] Error 1
Adefaria-lt:

I can give you more output if you need it.

Then I switched to the Windows archive that contained the .lib files.

I think the issue is that their Windows P4Perl build system uses Visual 
Studio to build and on Linux it uses g++. Their installation package is 
only for ActiveState. Supposedly at 5.18 ActiveState is changing to a 
g++ based backend using MingW I think so they'll eventually have to 
figure this out. Meantime I'm just trying to get it working under 
Cygwin's Perl...

>> Next I need to do:
>>
>> $ perl Makefile.PL --api-dir /.../path/to/unzipped/p4api
>>
>> This works fine and I procedure with the make. This fails with things like:
>>
>> make[1]: Leaving directory '/cygdrive/a/perl/P4Perl.Cygwin/lib'
>> g++ -c  -I/cygdrive/a/perl/p4api.windows/include/p4 -Ilib -x c++
>> -DUSEIMPORTLIB -O3   -DVERSION=\"2014.1\" -DXS_VERSION=\"2014.1\"
>> "-I/usr/lib/perl5/5.14/x86_64-cygwin-threads/CORE"
>> -DID_OS="\"CYGWIN17THREAD\"" -DID_REL="\"2014.1\"" -DID_PATCH="\"842847\""
>> -DID_Y="\"2014\"" -DID_M="\"05\"" -DID_D="\"06\"" -DOS_CYGWIN -DOS_CYGWIN17
>> -DOS_CYGWIN17THREAD -DOS_CYGWINTHREAD -DP4API_VERSION="515585"
>> -DID_API="\"2014.1/821990\"" P4.c
>> Running Mkbootstrap for P4 ()
>> chmod 644 P4.bs
>> rm -f blib/arch/auto/P4/P4.dll
>> g++  -shared P4.o  -o blib/arch/auto/P4/P4.dll lib/libp4.a      \
>>    /usr/lib/perl5/5.14/x86_64-cygwin-threads/CORE/cygperl5_14.dll        \
>>
>> P4.o:P4.c:(.text+0x45ac): undefined reference to `ClientApi::SetClient(char
>> const*)'
>> P4.o:P4.c:(.text+0x45ac): relocation truncated to fit: R_X86_64_PC32 against
>> undefined symbol `ClientApi::SetClient(char const*)'
>> P4.o:P4.c:(.text+0x4a9c): undefined reference to `ClientApi::SetHost(char
>> const*)'
>>
>> Notice that it removes P4.dll, so it seems to know it's working with dll's,
>> but then it calls g++ with a -o for libp4.a!
>
> No it doesn't. The argument to -o is blib/arch/auto/P4/P4.dll
> lib/libp4.a is the next input file.

Good catch! I missed that.

 > What does the following say?
>
> nm lib/libp4.a | c++filt

Attached.

>> Meantime it fails with many undefined references. I think I might need to do
>> perl Makefile.PL with other opts to tell it that while it's using Cygwin and
>> can be very Linux-like, it needs to produce .dll's and not .a's or .o's.
>
> It seems to be on the right track; "g++ -shared -o P4.dll" sounds good to me.

Thanks for your help.
-- 
Andrew DeFaria
http://defaria.com

[-- Attachment #2: nm.libp4.a.out --]
[-- Type: text/plain, Size: 32798 bytes --]


p4actionmerge.o:
0000000000000000 b .bss
0000000000000000 d .data
0000000000000000 p .pdata
0000000000000000 r .rdata
0000000000000000 r .rdata$.refptr._ZN6StrBuf10nullStrBufE
0000000000000000 r .rdata$zzz
0000000000000000 R .refptr._ZN6StrBuf10nullStrBufE
0000000000000000 t .text
0000000000000000 r .xdata
                 U Perl_newSVpv
                 U _Unwind_Resume
0000000000000350 T P4ActionMergeData::GetMergeHint()
0000000000000080 T P4ActionMergeData::GetMergeInfo()
0000000000000140 T P4ActionMergeData::GetYourAction()
0000000000000090 T P4ActionMergeData::GetMergeAction()
00000000000001f0 T P4ActionMergeData::GetTheirAction()
00000000000002a0 T P4ActionMergeData::GetType()
0000000000000380 T P4ActionMergeData::GetString()
0000000000000000 T P4ActionMergeData::P4ActionMergeData(ClientUser*, ClientResolveA*, StrPtr&, sv*)
0000000000000000 T P4ActionMergeData::P4ActionMergeData(ClientUser*, ClientResolveA*, StrPtr&, sv*)
                 U StrBuf::nullStrBuf
                 U StrBuf::Append(StrPtr const*)
                 U StrBuf::Append(char const*)
                 U Error::Fmt(StrBuf&, int) const
                 U operator delete[](void*)
                 U __gxx_personality_seh0
                 U __imp_PL_thr_key
                 U __real__ZdaPv
                 U pthread_getspecific

p4clientprogress.o:
0000000000000000 b .bss
0000000000000000 d .data
0000000000000000 p .pdata
0000000000000000 p .pdata$_ZN14ClientProgressD0Ev
0000000000000000 p .pdata$_ZN14ClientProgressD1Ev
0000000000000000 r .rdata$_ZTI14ClientProgress
0000000000000000 r .rdata$_ZTI16P4ClientProgress
0000000000000000 r .rdata$_ZTS14ClientProgress
0000000000000000 r .rdata$_ZTS16P4ClientProgress
0000000000000000 r .rdata$_ZTV14ClientProgress
0000000000000000 r .rdata$_ZTV16P4ClientProgress
0000000000000000 r .rdata$zzz
0000000000000000 t .text
0000000000000000 t .text$_ZN14ClientProgressD0Ev
0000000000000000 t .text$_ZN14ClientProgressD1Ev
0000000000000000 r .xdata
0000000000000000 r .xdata$_ZN14ClientProgressD0Ev
0000000000000000 r .xdata$_ZN14ClientProgressD1Ev
0000000000000000 T ClientProgress::~ClientProgress()
0000000000000000 T ClientProgress::~ClientProgress()
0000000000000010 T P4ClientProgress::Description(StrPtr const*, int)
0000000000000040 T P4ClientProgress::Done(int)
0000000000000080 T P4ClientProgress::Init(int)
0000000000000020 T P4ClientProgress::Total(long)
0000000000000030 T P4ClientProgress::Update(long)
0000000000000060 T P4ClientProgress::P4ClientProgress(sv*, int)
0000000000000060 T P4ClientProgress::P4ClientProgress(sv*, int)
0000000000000050 T P4ClientProgress::~P4ClientProgress()
0000000000000000 T P4ClientProgress::~P4ClientProgress()
0000000000000000 T P4ClientProgress::~P4ClientProgress()
0000000000000000 R typeinfo for ClientProgress
0000000000000000 R typeinfo for P4ClientProgress
0000000000000000 R typeinfo name for ClientProgress
0000000000000000 R typeinfo name for P4ClientProgress
0000000000000000 R vtable for ClientProgress
0000000000000000 R vtable for P4ClientProgress
                 U vtable for __cxxabiv1::__class_type_info
                 U vtable for __cxxabiv1::__si_class_type_info
                 U operator delete(void*)
                 U __cxa_pure_virtual
                 U __real__ZdlPv

p4mapmaker.o:
0000000000000000 b .bss
0000000000000000 d .data
0000000000000000 p .pdata
0000000000000000 r .rdata
0000000000000000 r .rdata$.refptr._ZN6StrBuf10nullStrBufE
0000000000000000 r .rdata$zzz
0000000000000000 R .refptr._ZN6StrBuf10nullStrBufE
0000000000000000 t .text
0000000000000000 r .xdata
                 U Perl_av_push
                 U Perl_newSV_type
                 U Perl_newSVpv
                 U Perl_sv_2pv_flags
                 U _Unwind_Resume
0000000000000ec0 T P4MapMaker::SplitMapping(StrPtr const&, StrBuf&, StrBuf&)
0000000000000820 T P4MapMaker::Lhs()
00000000000009c0 T P4MapMaker::Rhs()
0000000000000b20 T P4MapMaker::ToA()
0000000000000d30 T P4MapMaker::Dump()
00000000000001e0 T P4MapMaker::Join(P4MapMaker*, P4MapMaker*)
00000000000005e0 T P4MapMaker::Clear()
00000000000005d0 T P4MapMaker::Count()
0000000000001050 T P4MapMaker::Insert(sv*)
0000000000000270 T P4MapMaker::Insert(sv*, sv*)
00000000000005f0 T P4MapMaker::Reverse()
00000000000006a0 T P4MapMaker::Translate(sv*, int)
0000000000000070 T P4MapMaker::P4MapMaker(P4MapMaker const&)
0000000000000000 T P4MapMaker::P4MapMaker()
0000000000000070 T P4MapMaker::P4MapMaker(P4MapMaker const&)
0000000000000000 T P4MapMaker::P4MapMaker()
0000000000000040 T P4MapMaker::~P4MapMaker()
0000000000000040 T P4MapMaker::~P4MapMaker()
                 U MapApi::Join(MapApi*, MapDir, MapApi*, MapDir)
                 U MapApi::Clear()
                 U MapApi::Count()
                 U MapApi::Insert(StrPtr const&, StrPtr const&, MapType)
                 U MapApi::GetLeft(int)
                 U MapApi::GetType(int)
                 U MapApi::GetRight(int)
                 U MapApi::Translate(StrPtr const&, StrBuf&, MapDir)
                 U MapApi::MapApi()
                 U MapApi::~MapApi()
                 U StrBuf::nullStrBuf
                 U StrBuf::Grow(unsigned int)
                 U StrBuf::Append(StrPtr const*)
                 U StrBuf::Append(char const*)
                 U operator delete[](void*)
                 U operator delete(void*)
                 U operator new(unsigned long)
                 U __gxx_personality_seh0
                 U __imp_PL_thr_key
                 U __real__ZdaPv
                 U __real__ZdlPv
                 U __real__Znwm
                 U pthread_getspecific
                 U strchr
                 U strlen

p4mergedata.o:
0000000000000000 b .bss
0000000000000000 d .data
0000000000000000 p .pdata
0000000000000000 r .rdata
0000000000000000 r .rdata$.refptr._ZN6StrBuf10nullStrBufE
0000000000000000 r .rdata$zzz
0000000000000000 R .refptr._ZN6StrBuf10nullStrBufE
0000000000000000 t .text
0000000000000000 r .xdata
                 U Perl_newSVpv
                 U _Unwind_Resume
00000000000001e0 T P4MergeData::GetBaseName()
00000000000002d0 T P4MergeData::GetBasePath()
0000000000000180 T P4MergeData::GetYourName()
0000000000000210 T P4MergeData::GetYourPath()
00000000000003b0 T P4MergeData::GetMergeHint()
00000000000001b0 T P4MergeData::GetTheirName()
0000000000000260 T P4MergeData::GetTheirPath()
00000000000003e0 T P4MergeData::RunMergeTool()
0000000000000340 T P4MergeData::GetResultPath()
00000000000004e0 T P4MergeData::GetString()
0000000000000000 T P4MergeData::P4MergeData(ClientUser*, ClientMerge*, StrPtr&)
0000000000000000 T P4MergeData::P4MergeData(ClientUser*, ClientMerge*, StrPtr&)
                 U Error::~Error()
                 U StrBuf::nullStrBuf
                 U StrBuf::Append(StrPtr const*)
                 U StrBuf::Append(char const*)
                 U StrDict::GetVar(char const*)
                 U operator delete[](void*)
                 U __gxx_personality_seh0
                 U __imp_PL_thr_key
                 U __real__ZdaPv
                 U pthread_getspecific

p4result.o:
0000000000000000 b .bss
0000000000000000 d .data
0000000000000000 p .pdata
0000000000000000 r .rdata
0000000000000000 r .rdata$.refptr._ZN5P4Tag8l_clientE
0000000000000000 r .rdata$.refptr._ZN6StrBuf10nullStrBufE
0000000000000000 r .rdata$zzz
0000000000000000 R .refptr._ZN5P4Tag8l_clientE
0000000000000000 R .refptr._ZN6StrBuf10nullStrBufE
0000000000000000 t .text
0000000000000000 r .xdata
                 U PerlIO_stdoutf
                 U Perl_av_clear
                 U Perl_av_len
                 U Perl_av_push
                 U Perl_av_undef
                 U Perl_gv_stashpv
                 U Perl_newRV_noinc
                 U Perl_newSV_type
                 U Perl_newSViv
                 U Perl_newSVpv
                 U Perl_sv_2mortal
                 U Perl_sv_bless
                 U _Unwind_Resume
                 U Error::operator=(Error const&)
                 U P4Tag::l_client
                 U StrBuf::nullStrBuf
0000000000000330 T P4Result::AddMessage(Error*)
00000000000005f0 T P4Result::ErrorCount()
0000000000000650 T P4Result::TrackCount()
0000000000000540 T P4Result::DeleteTrack()
00000000000005c0 T P4Result::OutputCount()
0000000000000620 T P4Result::WarningCount()
0000000000000000 T P4Result::Init()
0000000000000160 T P4Result::Clear()
0000000000000240 T P4Result::Reset()
0000000000000570 T P4Result::AddTrack(sv*)
00000000000004e0 T P4Result::AddTrack(char const*)
00000000000002e0 T P4Result::AddOutput(sv*)
00000000000001f0 T P4Result::GetOutput()
00000000000000a0 T P4Result::P4Result()
00000000000000a0 T P4Result::P4Result()
00000000000000d0 T P4Result::~P4Result()
00000000000000d0 T P4Result::~P4Result()
                 U Error::Fmt(StrBuf&, int) const
                 U operator delete[](void*)
                 U operator new(unsigned long)
                 U __gxx_personality_seh0
                 U __imp_PL_thr_key
                 U __real__ZdaPv
                 U __real__Znwm
                 U atoi
                 U pthread_getspecific

p4specdata.o:
0000000000000000 b .bss
0000000000000000 d .data
0000000000000000 p .pdata
0000000000000000 p .pdata$_ZN12SpecDataPerlD0Ev
0000000000000000 p .pdata$_ZN12SpecDataPerlD1Ev
0000000000000000 r .rdata
0000000000000000 r .rdata$.refptr._ZN6StrBuf10nullStrBufE
0000000000000000 r .rdata$.refptr._ZTV8SpecData
0000000000000000 r .rdata$_ZTI12SpecDataPerl
0000000000000000 r .rdata$_ZTI8SpecData
0000000000000000 r .rdata$_ZTS12SpecDataPerl
0000000000000000 r .rdata$_ZTS8SpecData
0000000000000000 r .rdata$_ZTV12SpecDataPerl
0000000000000000 r .rdata$zzz
0000000000000000 R .refptr._ZN6StrBuf10nullStrBufE
0000000000000000 R .refptr._ZTV8SpecData
0000000000000000 t .text
0000000000000000 t .text$_ZN12SpecDataPerlD0Ev
0000000000000000 t .text$_ZN12SpecDataPerlD1Ev
0000000000000000 r .xdata
0000000000000000 r .xdata$_ZN12SpecDataPerlD0Ev
0000000000000000 r .xdata$_ZN12SpecDataPerlD1Ev
                 U Perl_av_fetch
                 U Perl_av_store
                 U Perl_hv_common_key_len
                 U Perl_newRV_noinc
                 U Perl_newSV_type
                 U Perl_newSVpv
                 U Perl_sv_2pv_flags
                 U Perl_warn_nocontext
                 U _Unwind_Resume
0000000000000000 T SpecDataPerl::GetLine(SpecElem*, int, char const**)
00000000000001a0 T SpecDataPerl::SetLine(SpecElem*, int, StrPtr const*, Error*)
0000000000000470 T SpecDataPerl::SpecDataPerl(hv*)
00000000000003b0 T SpecDataPerl::SpecDataPerl(sv*)
0000000000000470 T SpecDataPerl::SpecDataPerl(hv*)
00000000000003b0 T SpecDataPerl::SpecDataPerl(sv*)
0000000000000000 T SpecDataPerl::~SpecDataPerl()
0000000000000000 T SpecDataPerl::~SpecDataPerl()
                 U StrBuf::nullStrBuf
                 U StrBuf::Append(char const*)
                 U SpecData::Get(SpecElem*, int, char const**, char const**)
                 U SpecData::Get(SpecElem*, int, char**, char**)
                 U SpecData::Set(SpecElem*, int, char const**, Error*)
                 U SpecData::Set(SpecElem*, int, char**, Error*)
0000000000000000 R typeinfo for SpecDataPerl
0000000000000000 R typeinfo for SpecData
0000000000000000 R typeinfo name for SpecDataPerl
0000000000000000 R typeinfo name for SpecData
0000000000000000 R vtable for SpecDataPerl
                 U vtable for SpecData
                 U vtable for __cxxabiv1::__class_type_info
                 U vtable for __cxxabiv1::__si_class_type_info
                 U operator delete[](void*)
                 U operator delete(void*)
                 U __gxx_personality_seh0
                 U __imp_PL_thr_key
                 U __real__ZdaPv
                 U __real__ZdlPv
                 U pthread_getspecific

perlclientapi.o:
0000000000000000 b .bss
0000000000000000 d .data
0000000000000000 p .pdata
0000000000000000 r .rdata
0000000000000000 r .rdata$.refptr._ZN5P4Tag10v_progressE
0000000000000000 r .rdata$.refptr._ZN5P4Tag8l_clientE
0000000000000000 r .rdata$.refptr._ZN5P4Tag8v_nocaseE
0000000000000000 r .rdata$.refptr._ZN5P4Tag9v_server2E
0000000000000000 r .rdata$.refptr._ZN5P4Tag9v_unicodeE
0000000000000000 r .rdata$.refptr._ZN6StrBuf10nullStrBufE
0000000000000000 r .rdata$.refptr._ZN9P4Tunable4listE
0000000000000000 r .rdata$zzz
0000000000000000 R .refptr._ZN5P4Tag10v_progressE
0000000000000000 R .refptr._ZN5P4Tag8l_clientE
0000000000000000 R .refptr._ZN5P4Tag8v_nocaseE
0000000000000000 R .refptr._ZN5P4Tag9v_server2E
0000000000000000 R .refptr._ZN5P4Tag9v_unicodeE
0000000000000000 R .refptr._ZN6StrBuf10nullStrBufE
0000000000000000 R .refptr._ZN9P4Tunable4listE
0000000000000000 t .text
0000000000000000 r .xdata
                 U PerlIO_stdoutf
                 U Perl_newSViv
                 U Perl_newSVpv
                 U Perl_sv_isobject
                 U Perl_warn_nocontext
                 U _Unwind_Resume
0000000000000000 d ident
                 U CharSetApi::Lookup(char const*)
                 U StrBufDict::StrBufDict()
                 U StrBufDict::~StrBufDict()
00000000000001e0 T PerlClientApi::Disconnect()
0000000000001330 T PerlClientApi::FormatSpec(char const*, hv*)
0000000000000590 T PerlClientApi::GetCharset()
0000000000000730 T PerlClientApi::GetHandler()
00000000000008d0 T PerlClientApi::GetVersion()
00000000000003f0 T PerlClientApi::SetCharset(char const*)
0000000000000c00 T PerlClientApi::SetHandler(sv*)
0000000000000970 T PerlClientApi::SetStreams(int)
0000000000000560 T PerlClientApi::GetApiLevel()
0000000000000750 T PerlClientApi::GetLanguage()
0000000000000b50 T PerlClientApi::GetMessages()
0000000000000820 T PerlClientApi::GetPassword()
0000000000000740 T PerlClientApi::GetProgress()
0000000000000b30 T PerlClientApi::GetWarnings()
0000000000000350 T PerlClientApi::SetApiLevel(int)
0000000000000c70 T PerlClientApi::SetProgress(sv*)
0000000000000550 T PerlClientApi::SetProtocol(char const*, char const*)
0000000000000cd0 T PerlClientApi::SetResolver(sv*)
0000000000000bf0 T PerlClientApi::ClearHandler()
0000000000000b90 T PerlClientApi::GetErrorCount()
0000000000000a60 T PerlClientApi::GetIgnoreFile()
0000000000000790 T PerlClientApi::GetMaxResults()
00000000000009e0 T PerlClientApi::GetTicketFile()
0000000000001230 T PerlClientApi::ServerUnicode()
0000000000000bb0 T PerlClientApi::SetDebugLevel(int)
0000000000000a10 T PerlClientApi::SetIgnoreFile(char const*)
0000000000000990 T PerlClientApi::SetTicketFile(char const*)
00000000000007f0 T PerlClientApi::GetMaxLockTime()
00000000000007c0 T PerlClientApi::GetMaxScanRows()
0000000000000b70 T PerlClientApi::GetOutputCount()
00000000000011b0 T PerlClientApi::GetServerLevel()
0000000000000b60 T PerlClientApi::GetTrackOutput()
0000000000000b80 T PerlClientApi::GetWarningCount()
0000000000000ba0 T PerlClientApi::GetTrackOutputCount()
00000000000011f0 T PerlClientApi::ServerCaseSensitive()
0000000000000ee0 T PerlClientApi::Run(char const*, int, char* const*)
0000000000001070 t PerlClientApi::Run(char const*, int, char* const*) [clone .constprop.37]
0000000000000650 T PerlClientApi::GetCwd()
0000000000000690 T PerlClientApi::GetEnv(char const*)
0000000000000ce0 T PerlClientApi::RunCmd(char const*, ClientUser*, int, char* const*)
0000000000000480 T PerlClientApi::SetCwd(char const*)
00000000000004c0 T PerlClientApi::SetEnv(char const*, char const*)
0000000000000900 T PerlClientApi::Tagged(int)
00000000000000b0 T PerlClientApi::Connect()
00000000000006f0 T PerlClientApi::GetHost()
0000000000000860 T PerlClientApi::GetPort()
00000000000008a0 T PerlClientApi::GetProg()
0000000000000ae0 T PerlClientApi::GetUser()
0000000000000000 T PerlClientApi::Identify()
0000000000000310 T PerlClientApi::SetInput(sv*)
0000000000000920 T PerlClientApi::SetTrack(int)
00000000000002c0 T PerlClientApi::Connected()
0000000000000610 T PerlClientApi::GetClient()
00000000000005d0 T PerlClientApi::GetConfig()
0000000000000b40 T PerlClientApi::GetErrors()
0000000000000b20 T PerlClientApi::GetOutput()
0000000000000a90 T PerlClientApi::IsIgnored(char const*)
0000000000001270 T PerlClientApi::ParseSpec(char const*, char const*)
00000000000014f0 T PerlClientApi::PerlClientApi()
00000000000014f0 T PerlClientApi::PerlClientApi()
0000000000001800 T PerlClientApi::~PerlClientApi()
0000000000001800 T PerlClientApi::~PerlClientApi()
                 U PerlClientUser::GetHandler()
                 U PerlClientUser::SetHandler(sv*)
                 U PerlClientUser::GetProgress()
                 U PerlClientUser::SetApiLevel(int)
                 U PerlClientUser::SetProgress(sv*)
                 U PerlClientUser::ClearHandler()
                 U PerlClientUser::Reset()
                 U PerlClientUser::SetInput(sv*)
                 U PerlClientUser::PerlClientUser(SpecMgr*)
                 U Error::~Error()
                 U Ident::GetMessage(StrBuf*, int)
                 U P4Tag::v_progress
                 U P4Tag::l_client
                 U P4Tag::v_nocase
                 U P4Tag::v_server2
                 U P4Tag::v_unicode
                 U Enviro::Get(char const*)
                 U Enviro::Set(char const*, char const*, Error*)
                 U Enviro::Config(StrPtr const&)
                 U Enviro::Enviro()
                 U Enviro::~Enviro()
                 U Ignore::Reject(StrPtr const&, StrPtr const&)
                 U StrBuf::nullStrBuf
                 U StrBuf::Append(char const*)
                 U StrBuf::operator<<(int)
                 U HostEnv::GetTicketFile(StrBuf&, Enviro*)
                 U HostEnv::GetCwd(StrBuf&, Enviro*)
                 U SpecMgr::SpecToString(char const*, hv*, StrBuf&, Error*)
                 U SpecMgr::StringToSpec(char const*, char const*, Error*)
                 U SpecMgr::SpecMgr()
                 U SpecMgr::~SpecMgr()
                 U StrDict::SetVar(char const*)
                 U StrDict::SetVar(char const*, StrPtr const&)
                 U StrDict::SetVar(char const*, char const*)
                 U StrDict::SetVar(char const*, int)
                 U StrDict::SetArgv(int, char* const*)
                 U P4Result::ErrorCount()
                 U P4Result::TrackCount()
                 U P4Result::OutputCount()
                 U P4Result::WarningCount()
                 U P4Result::GetOutput()
                 U ClientApi::GetCharset()
                 U ClientApi::SetCharset(char const*)
                 U ClientApi::SetVersion(StrPtr const*)
                 U ClientApi::GetLanguage()
                 U ClientApi::GetPassword()
                 U ClientApi::GetProtocol(char const*)
                 U ClientApi::SetProtocol(char const*, char const*)
                 U ClientApi::GetIgnoreFile()
                 U ClientApi::SetIgnoreFile(char const*)
                 U ClientApi::SetTicketFile(char const*)
                 U ClientApi::Run(char const*, ClientUser*)
                 U ClientApi::Init(Error*)
                 U ClientApi::Final(Error*)
                 U ClientApi::GetCwd()
                 U ClientApi::SetCwd(char const*)
                 U ClientApi::Dropped()
                 U ClientApi::GetHost()
                 U ClientApi::GetPort()
                 U ClientApi::GetUser()
                 U ClientApi::SetProg(char const*)
                 U ClientApi::SetBreak(KeepAlive*)
                 U ClientApi::SetTrans(int, int, int, int)
                 U ClientApi::GetClient()
                 U ClientApi::GetConfig()
                 U ClientApi::GetIgnore()
                 U ClientApi::ClientApi()
                 U P4Tunable::list
                 U Error::Fmt(StrBuf&, int) const
                 U operator delete[](void*)
                 U operator delete(void*)
                 U operator new(unsigned long)
                 U __gxx_personality_seh0
                 U __imp_PL_thr_key
                 U __real__ZdaPv
                 U __real__ZdlPv
                 U __real__Znwm
                 U atoi
                 U pthread_getspecific
                 U strlen

perlclientuser.o:
0000000000000000 b .bss
0000000000000000 d .data
0000000000000000 p .pdata
0000000000000000 p .pdata$_ZN10ClientUser10OutputInfoEcPc
0000000000000000 p .pdata$_ZN10ClientUser10OutputTextEPci
0000000000000000 p .pdata$_ZN10ClientUser11OutputErrorEPc
0000000000000000 p .pdata$_ZN10ClientUser12OutputBinaryEPci
0000000000000000 p .pdata$_ZN10ClientUser4HelpEPKPc
0000000000000000 p .pdata$_ZN14PerlClientUser7IsAliveEv
0000000000000000 p .pdata$_ZN9KeepAliveD0Ev
0000000000000000 p .pdata$_ZN9KeepAliveD1Ev
0000000000000000 r .rdata
0000000000000000 r .rdata$.refptr._ZN6StrBuf10nullStrBufE
0000000000000000 r .rdata$.refptr._ZTV10ClientUser
0000000000000000 r .rdata$_ZTI10ClientUser
0000000000000000 r .rdata$_ZTI14PerlClientUser
0000000000000000 r .rdata$_ZTI9KeepAlive
0000000000000000 r .rdata$_ZTS10ClientUser
0000000000000000 r .rdata$_ZTS14PerlClientUser
0000000000000000 r .rdata$_ZTS9KeepAlive
0000000000000000 r .rdata$_ZTV14PerlClientUser
0000000000000000 r .rdata$_ZTV9KeepAlive
0000000000000000 r .rdata$zzz
0000000000000000 R .refptr._ZN6StrBuf10nullStrBufE
0000000000000000 R .refptr._ZTV10ClientUser
0000000000000000 t .text
0000000000000000 t .text$_ZN10ClientUser10OutputInfoEcPc
0000000000000000 t .text$_ZN10ClientUser10OutputTextEPci
0000000000000000 t .text$_ZN10ClientUser11OutputErrorEPc
0000000000000000 t .text$_ZN10ClientUser12OutputBinaryEPci
0000000000000000 t .text$_ZN10ClientUser4HelpEPKPc
0000000000000000 t .text$_ZN14PerlClientUser7IsAliveEv
0000000000000000 t .text$_ZN9KeepAliveD0Ev
0000000000000000 t .text$_ZN9KeepAliveD1Ev
0000000000000000 t .text$_ZThn40_N14PerlClientUser7IsAliveEv
0000000000000000 r .xdata
0000000000000000 r .xdata$_ZN10ClientUser10OutputInfoEcPc
0000000000000000 r .xdata$_ZN10ClientUser10OutputTextEPci
0000000000000000 r .xdata$_ZN10ClientUser11OutputErrorEPc
0000000000000000 r .xdata$_ZN10ClientUser12OutputBinaryEPci
0000000000000000 r .xdata$_ZN10ClientUser4HelpEPKPc
0000000000000000 r .xdata$_ZN14PerlClientUser7IsAliveEv
0000000000000000 r .xdata$_ZN9KeepAliveD0Ev
0000000000000000 r .xdata$_ZN9KeepAliveD1Ev
                 U PerlIO_stdoutf
                 U Perl_av_fetch
                 U Perl_av_len
                 U Perl_av_shift
                 U Perl_call_method
                 U Perl_free_tmps
                 U Perl_gv_stashpv
                 U Perl_markstack_grow
                 U Perl_newRV
                 U Perl_newRV_noinc
                 U Perl_newSViv
                 U Perl_newSVpv
                 U Perl_pop_scope
                 U Perl_push_scope
                 U Perl_save_int
                 U Perl_stack_grow
                 U Perl_sv_2iv_flags
                 U Perl_sv_2mortal
                 U Perl_sv_2pv_flags
                 U Perl_sv_bless
                 U Perl_sv_free
                 U Perl_warn_nocontext
                 U _Unwind_Resume
                 U ClientUser::ErrorPause(char*, Error*)
0000000000000000 T ClientUser::OutputInfo(char, char*)
0000000000000000 T ClientUser::OutputText(char*, int)
                 U ClientUser::HandleError(Error*)
                 U ClientUser::OutputError(char const*)
0000000000000000 T ClientUser::OutputError(char*)
0000000000000000 T ClientUser::OutputBinary(char*, int)
                 U ClientUser::SetOutputCharset(int)
                 U ClientUser::DisableTmpCleanup()
                 U ClientUser::Diff(FileSys*, FileSys*, FileSys*, int, char*, Error*)
                 U ClientUser::Edit(FileSys*, Error*)
                 U ClientUser::File(FileSysType)
                 U ClientUser::Help(char const* const*)
0000000000000000 T ClientUser::Help(char* const*)
                 U ClientUser::Merge(FileSys*, FileSys*, FileSys*, FileSys*, Error*)
                 U ClientUser::Prompt(StrPtr const&, StrBuf&, int, int, Error*)
                 U ClientUser::SetQuiet()
                 U ClientUser::~ClientUser()
                 U P4MergeData::P4MergeData(ClientUser*, ClientMerge*, StrPtr&)
                 U SpecDataTable::SpecDataTable(StrDict*)
                 U SpecDataTable::~SpecDataTable()
0000000000001120 T PerlClientUser::GetHandler()
0000000000000c10 T PerlClientUser::OutputInfo(char, char const*)
0000000000001e80 T PerlClientUser::OutputStat(StrDict*)
0000000000000d90 T PerlClientUser::OutputText(char const*, int)
00000000000010e0 T PerlClientUser::SetHandler(sv*)
00000000000011a0 T PerlClientUser::GetProgress()
00000000000011d0 T PerlClientUser::MkMergeData(ClientMerge*, StrPtr&)
0000000000001150 T PerlClientUser::SetApiLevel(int)
0000000000001160 T PerlClientUser::SetProgress(sv*)
00000000000010a0 T PerlClientUser::ClearHandler()
0000000000000cd0 T PerlClientUser::OutputBinary(char const*, int)
0000000000000f70 T PerlClientUser::ProcessOutput(char const*, sv*)
0000000000000380 T PerlClientUser::CreateProgress(int)
0000000000000ff0 T PerlClientUser::ProcessMessage(Error*)
0000000000000910 T PerlClientUser::CallOutputMethod(char const*, sv*)
0000000000001820 T PerlClientUser::MkActionMergeData(ClientResolveA*, StrPtr&)
0000000000000110 T PerlClientUser::ProgressIndicator()
0000000000000400 T PerlClientUser::Diff(FileSys*, FileSys*, int, char*, Error*)
00000000000008e0 T PerlClientUser::Reset()
00000000000000c0 T PerlClientUser::Prompt(StrPtr const&, StrBuf&, int, Error*)
0000000000000000 T PerlClientUser::IsAlive()
00000000000001b0 T PerlClientUser::Message(Error*)
00000000000012b0 T PerlClientUser::Resolve(ClientMerge*, Error*)
0000000000001950 T PerlClientUser::Resolve(ClientResolveA*, int, Error*)
0000000000000140 T PerlClientUser::Finished()
0000000000001040 T PerlClientUser::SetInput(sv*)
00000000000001f0 T PerlClientUser::InputData(StrBuf*, Error*)
00000000000007f0 T PerlClientUser::PerlClientUser(SpecMgr*)
00000000000007f0 T PerlClientUser::PerlClientUser(SpecMgr*)
0000000000000730 T PerlClientUser::~PerlClientUser()
0000000000000000 T PerlClientUser::~PerlClientUser()
0000000000000000 T PerlClientUser::~PerlClientUser()
                 U P4ClientProgress::P4ClientProgress(sv*, int)
                 U P4ActionMergeData::P4ActionMergeData(ClientUser*, ClientResolveA*, StrPtr&, sv*)
                 U Diff::CloseOutput(Error*)
                 U Diff::DiffWithFlags(DiffFlags const&)
                 U Diff::SetInput(FileSys*, FileSys*, DiffFlags const&, Error*)
                 U Diff::SetOutput(char const*, Error*)
                 U Diff::Diff()
                 U Diff::~Diff()
                 U Spec::Parse(char const*, SpecData*, Error*, int)
                 U Spec::Spec(char const*, char const*, Error*)
                 U Spec::~Spec()
                 U Error::~Error()
                 U StrBuf::nullStrBuf
                 U StrBuf::Append(char const*)
                 U FileSys::MakeGlobalTemp()
                 U FileSys::Create(FileSysType)
                 U FileSys::Compare(FileSys*, Error*)
                 U SpecMgr::AddSpecDef(char const*, char const*)
                 U SpecMgr::SpecToString(char const*, hv*, StrBuf&, Error*)
                 U SpecMgr::StrDictToHash(StrDict*, sv*)
                 U SpecMgr::StrDictToSpec(StrDict*, StrPtr*)
                 U StrDict::GetVar(char const*)
                 U P4Result::AddMessage(Error*)
                 U P4Result::DeleteTrack()
                 U P4Result::Reset()
                 U P4Result::AddTrack(sv*)
                 U P4Result::AddOutput(sv*)
                 U P4Result::P4Result()
                 U P4Result::~P4Result()
                 U DiffFlags::Init(char const*)
0000000000000000 T KeepAlive::~KeepAlive()
0000000000000000 T KeepAlive::~KeepAlive()
                 U ClientResolveA::AutoResolve(MergeForce) const
0000000000000000 R typeinfo for ClientUser
0000000000000000 R typeinfo for PerlClientUser
0000000000000000 R typeinfo for KeepAlive
0000000000000000 R typeinfo name for ClientUser
0000000000000000 R typeinfo name for PerlClientUser
0000000000000000 R typeinfo name for KeepAlive
                 U vtable for ClientUser
0000000000000000 R vtable for PerlClientUser
0000000000000000 R vtable for KeepAlive
                 U vtable for __cxxabiv1::__class_type_info
                 U vtable for __cxxabiv1::__vmi_class_type_info
0000000000000000 T non-virtual thunk to PerlClientUser::IsAlive()
00000000000007e0 T non-virtual thunk to PerlClientUser::~PerlClientUser()
00000000000000b0 T non-virtual thunk to PerlClientUser::~PerlClientUser()
                 U operator delete[](void*)
                 U operator delete(void*)
                 U operator new(unsigned long)
                 U __cxa_pure_virtual
                 U __getreent
                 U __gxx_personality_seh0
                 U __imp_PL_thr_key
                 U __real__ZdaPv
                 U __real__ZdlPv
                 U __real__Znwm
                 U fwrite
                 U pthread_getspecific
                 U strlen

specmgr.o:
0000000000000000 b .bss
0000000000000000 d .data
0000000000000000 p .pdata
0000000000000000 p .pdata$_ZN12SpecDataPerlD1Ev
0000000000000000 r .rdata
0000000000000000 r .rdata$.refptr._ZN6StrBuf10nullStrBufE
0000000000000000 r .rdata$.refptr._ZTV12SpecDataPerl
0000000000000000 r .rdata$.refptr._ZTV8SpecData
0000000000000000 r .rdata$zzz
0000000000000000 R .refptr._ZN6StrBuf10nullStrBufE
0000000000000000 R .refptr._ZTV12SpecDataPerl
0000000000000000 R .refptr._ZTV8SpecData
0000000000000000 t .text
0000000000000000 t .text$_ZN12SpecDataPerlD1Ev
0000000000000000 r .xdata
0000000000000000 r .xdata$_ZN12SpecDataPerlD1Ev
                 U PerlIO_stdoutf
                 U Perl_av_fetch
                 U Perl_av_len
                 U Perl_av_store
                 U Perl_call_method
                 U Perl_free_tmps
                 U Perl_hv_common_key_len
                 U Perl_markstack_grow
                 U Perl_newRV_noinc
                 U Perl_newSV_type
                 U Perl_newSVpv
                 U Perl_pop_scope
                 U Perl_push_scope
                 U Perl_save_int
                 U Perl_stack_grow
                 U Perl_sv_2mortal
                 U Perl_warn_nocontext
                 U _Unwind_Resume
                 U StrBufDict::StrBufDict()
                 U SpecDataPerl::SpecDataPerl(hv*)
                 U SpecDataPerl::SpecDataPerl(sv*)
0000000000000000 T SpecDataPerl::~SpecDataPerl()
                 U SpecDataTable::SpecDataTable(StrDict*)
                 U SpecDataTable::~SpecDataTable()
                 U Spec::Get(int)
                 U Spec::Count()
                 U Spec::Parse(char const*, SpecData*, Error*, int)
                 U Spec::Format(SpecData*, StrBuf*)
                 U Spec::Spec(char const*, char const*, Error*)
                 U Spec::~Spec()
                 U Error::Set(ErrorId const&)
                 U Error::~Error()
                 U StrBuf::nullStrBuf
                 U StrBuf::Append(StrPtr const*)
                 U StrBuf::Append(char const*)
                 U StrBuf::Append(char const*, unsigned int)
                 U StrBuf::operator<<(int)
                 U StrOps::Lower(StrBuf&)
00000000000000d0 T SpecMgr::AddSpecDef(char const*, StrPtr&)
0000000000000110 T SpecMgr::AddSpecDef(char const*, char const*)
0000000000000490 T SpecMgr::InsertItem(hv*, StrPtr const*, StrPtr const*)
0000000000000c40 T SpecMgr::SpecFields(StrPtr*)
0000000000000ed0 T SpecMgr::SpecFields(char const*)
0000000000000200 T SpecMgr::HaveSpecDef(char const*)
0000000000000220 T SpecMgr::SpecToString(char const*, hv*, StrBuf&, Error*)
0000000000001180 T SpecMgr::StringToSpec(char const*, char const*, Error*)
0000000000000b40 T SpecMgr::StrDictToHash(StrDict*, sv*)
0000000000001320 T SpecMgr::StrDictToSpec(StrDict*, StrPtr*)
0000000000000150 T SpecMgr::Reset()
0000000000000f00 T SpecMgr::NewSpec(StrPtr*)
00000000000003a0 T SpecMgr::SplitKey(StrPtr const*, StrBuf&, StrBuf&)
0000000000000000 T SpecMgr::SpecMgr()
0000000000000000 T SpecMgr::SpecMgr()
00000000000000b0 T SpecMgr::~SpecMgr()
00000000000000b0 T SpecMgr::~SpecMgr()
                 U StrDict::GetVar(char const*)
                 U StrDict::SetVar(char const*, StrPtr const&)
                 U StrDict::SetVar(char const*, char const*)
                 U StrDict::RemoveVar(char const*)
                 U vtable for SpecDataPerl
                 U vtable for SpecData
                 U operator delete[](void*)
                 U operator delete(void*)
                 U operator new(unsigned long)
                 U __gxx_personality_seh0
                 U __imp_PL_thr_key
                 U __real__ZdaPv
                 U __real__ZdlPv
                 U __real__Znwm
                 U atoi
                 U pthread_getspecific
0000000000000000 D speclist
                 U strchr


[-- Attachment #3: Type: text/plain, Size: 218 bytes --]

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Building cpan module that links with proprietary libs
  2014-05-29 20:34   ` Andrew DeFaria
@ 2014-05-30  6:49     ` Larry Hall (Cygwin)
  2014-05-30  8:01       ` Andrew DeFaria
  0 siblings, 1 reply; 9+ messages in thread
From: Larry Hall (Cygwin) @ 2014-05-30  6:49 UTC (permalink / raw)
  To: cygwin

On 05/29/2014 01:48 PM, Andrew DeFaria wrote:
> On 5/29/2014 1:29 AM, Csaba Raduly wrote:
>> Hi Andrew,
>>
>> On Thu, May 29, 2014 at 4:12 AM, Andrew DeFaria  wrote:
>>> I'm attempting to build a cpan module (well actually it's not a cpan module
>>> but rather a module that uses MakeMaker and has the familiar perl
>>> Makefile.PL, make, make test, make install installation procedure.
>>> Additionally I need to link it to a set of proprietary libs that I am given
>>> only the .lib files for. If you must know this is for Perforce's P4Perl
>>> which I'd like to get working with Cygwin's Perl natively.
>>>
>>> I download the P4API bundle (the package that has include files and the .lib
>>> files pre-compiled).
>>
>> The C++ P4 API is platform-specific; which platform did you choose?
>> If it really contains .lib files (not .a), those are not recognized by
>> Cygwin's gcc.
>
> I had two archives two choose from. One was for Windows and contained the
> .lib files. The other was for Linux and contains .a files. I first tried the
> Linux one but that failed with:
>
> g++  -shared P4.o  -o blib/arch/auto/P4/P4.dll lib/libp4.a      \
>    /usr/lib/perl5/5.14/x86_64-cygwin-threads/CORE/cygperl5_14.dll
> -L/cygdrive/a/p4perlBuild/p4api/lib -lclient -lrpc -lsupp -lp4sslstub        \
>
> collect2: error: ld terminated with signal 11 [Segmentation fault], core dumped
> Makefile:531: recipe for target 'blib/arch/auto/P4/P4.dll' failed
> make: *** [blib/arch/auto/P4/P4.dll] Error 1
> Adefaria-lt:
>
> I can give you more output if you need it.

No need.  Forgive me for saying this but I find it hard to believe that
after all this time on the list Andrew that you don't know that trying to
use Linux-compiled libraries on Cygwin isn't going to work.  But I guess
my surprise is not that important here. ;-)

> Then I switched to the Windows archive that contained the .lib files.

Sensible but...

> I think the issue is that their Windows P4Perl build system uses Visual
> Studio to build and on Linux it uses g++. Their installation package is only
> for ActiveState. Supposedly at 5.18 ActiveState is changing to a g++ based
> backend using MingW I think so they'll eventually have to figure this out.
> Meantime I'm just trying to get it working under Cygwin's Perl...
>
>>> Next I need to do:
>>>
>>> $ perl Makefile.PL --api-dir /.../path/to/unzipped/p4api
>>>
>>> This works fine and I procedure with the make. This fails with things like:
>>>
>>> make[1]: Leaving directory '/cygdrive/a/perl/P4Perl.Cygwin/lib'
>>> g++ -c  -I/cygdrive/a/perl/p4api.windows/include/p4 -Ilib -x c++
>>> -DUSEIMPORTLIB -O3   -DVERSION=\"2014.1\" -DXS_VERSION=\"2014.1\"
>>> "-I/usr/lib/perl5/5.14/x86_64-cygwin-threads/CORE"
>>> -DID_OS="\"CYGWIN17THREAD\"" -DID_REL="\"2014.1\"" -DID_PATCH="\"842847\""
>>> -DID_Y="\"2014\"" -DID_M="\"05\"" -DID_D="\"06\"" -DOS_CYGWIN -DOS_CYGWIN17
>>> -DOS_CYGWIN17THREAD -DOS_CYGWINTHREAD -DP4API_VERSION="515585"
>>> -DID_API="\"2014.1/821990\"" P4.c
>>> Running Mkbootstrap for P4 ()
>>> chmod 644 P4.bs
>>> rm -f blib/arch/auto/P4/P4.dll
>>> g++  -shared P4.o  -o blib/arch/auto/P4/P4.dll lib/libp4.a      \
>>>    /usr/lib/perl5/5.14/x86_64-cygwin-threads/CORE/cygperl5_14.dll        \
>>>
>>> P4.o:P4.c:(.text+0x45ac): undefined reference to `ClientApi::SetClient(char
>>> const*)'
>>> P4.o:P4.c:(.text+0x45ac): relocation truncated to fit: R_X86_64_PC32 against
>>> undefined symbol `ClientApi::SetClient(char const*)'
>>> P4.o:P4.c:(.text+0x4a9c): undefined reference to `ClientApi::SetHost(char
>>> const*)'
>>>
>>> Notice that it removes P4.dll, so it seems to know it's working with dll's,
>>> but then it calls g++ with a -o for libp4.a!
>>
>> No it doesn't. The argument to -o is blib/arch/auto/P4/P4.dll
>> lib/libp4.a is the next input file.
>
> Good catch! I missed that.
>
>  > What does the following say?
>>
>> nm lib/libp4.a | c++filt
>
> Attached.
>
>>> Meantime it fails with many undefined references. I think I might need to do
>>> perl Makefile.PL with other opts to tell it that while it's using Cygwin and
>>> can be very Linux-like, it needs to produce .dll's and not .a's or .o's.
>>
>> It seems to be on the right track; "g++ -shared -o P4.dll" sounds good to me.

You say that the libs were built by Visual Studio and the remainder of your
comments make it clear that the libraries are C++ and not C code.  As a
result, you will never get code compiled with g++ to link with these
libraries.  There is no common ABI among C++ compilers.  Thus, the libraries
and headers of one can't be used as input to the compiler of another, even
on the same platform.  This only works for C code.  So you have to either
build the proprietary libs with Cygwin's C++ compiler or write your own
"shim" library that wraps the necessary calls and objects in a C API,
compile that with VS, and link your program against the APIs in your
library.


-- 
Larry

_____________________________________________________________________

A: Yes.
 > Q: Are you sure?
 >> A: Because it reverses the logical flow of conversation.
 >>> Q: Why is top posting annoying in email?

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Building cpan module that links with proprietary libs
  2014-05-30  6:49     ` Larry Hall (Cygwin)
@ 2014-05-30  8:01       ` Andrew DeFaria
  2014-05-30 11:27         ` Csaba Raduly
  2014-05-30 16:47         ` Larry Hall (Cygwin)
  0 siblings, 2 replies; 9+ messages in thread
From: Andrew DeFaria @ 2014-05-30  8:01 UTC (permalink / raw)
  To: cygwin

On 5/29/2014 6:42 PM, Larry Hall (Cygwin) wrote:

>> I had two archives two choose from. One was for Windows and contained the
>> .lib files. The other was for Linux and contains .a files. I first
>> tried the
>> Linux one but that failed with:
>>
>> g++  -shared P4.o  -o blib/arch/auto/P4/P4.dll lib/libp4.a      \
>>    /usr/lib/perl5/5.14/x86_64-cygwin-threads/CORE/cygperl5_14.dll
>> -L/cygdrive/a/p4perlBuild/p4api/lib -lclient -lrpc -lsupp
>> -lp4sslstub        \
>>
>> collect2: error: ld terminated with signal 11 [Segmentation fault],
>> core dumped
>> Makefile:531: recipe for target 'blib/arch/auto/P4/P4.dll' failed
>> make: *** [blib/arch/auto/P4/P4.dll] Error 1
>> Adefaria-lt:
>>
>> I can give you more output if you need it.
>
> No need.  Forgive me for saying this but I find it hard to believe that
> after all this time on the list Andrew that you don't know that trying to
> use Linux-compiled libraries on Cygwin isn't going to work.  But I guess
> my surprise is not that important here. ;-)

When I first when to get this to work I choose the Linux style of the 
package for p4api. I figured the Windows style was for ActiveState only 
and that'd probably not work. Hell ActiveState doesn't even use cpan, 
they use ppm. I didn't look inside for anything like .o, .a or .dll or 
.lib. I figured that it would have been source code and it would have 
been compiled as part of the make process. It wasn't until it failed 
that I saw the reference to .a's, etc. and looked into the p4api 
directory structure to see .lib's in the Windows copy and .a's in the 
Linux copy. Sure at *that* point I knew the Linux style will never work 
in this situation. So I tried to link with the Windows style .lib copy.

>>> It seems to be on the right track; "g++ -shared -o P4.dll" sounds
>>> good to me.
>
> You say that the libs were built by Visual Studio and the remainder of your
> comments make it clear that the libraries are C++ and not C code.

I don't believe I ever said it was just C code. If I did then I'm sorry.

> As a
> result, you will never get code compiled with g++ to link with these
> libraries.  There is no common ABI among C++ compilers.  Thus, the
> libraries
> and headers of one can't be used as input to the compiler of another, even
> on the same platform.  This only works for C code.  So you have to either
> build the proprietary libs with Cygwin's C++ compiler or write your own
> "shim" library that wraps the necessary calls and objects in a C API,
> compile that with VS, and link your program against the APIs in your
> library.

Being as this code is proprietary I doubt that Perforce will release it 
to me to compile but I will point them at this thread...'

Thanks.
-- 
Andrew DeFaria
http://defaria.com


--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Building cpan module that links with proprietary libs
  2014-05-30  8:01       ` Andrew DeFaria
@ 2014-05-30 11:27         ` Csaba Raduly
  2014-05-30 17:40           ` Larry Hall (Cygwin)
  2014-05-30 22:06           ` Andrew DeFaria
  2014-05-30 16:47         ` Larry Hall (Cygwin)
  1 sibling, 2 replies; 9+ messages in thread
From: Csaba Raduly @ 2014-05-30 11:27 UTC (permalink / raw)
  To: cygwin list

On Fri, May 30, 2014 at 4:36 AM, Andrew DeFaria  wrote:
> On 5/29/2014 6:42 PM, Larry Hall (Cygwin) wrote:
>> As a
>> result, you will never get code compiled with g++ to link with these
>> libraries.  There is no common ABI among C++ compilers.  Thus, the
>> libraries
>> and headers of one can't be used as input to the compiler of another, even
>> on the same platform.  This only works for C code.  So you have to either
>> build the proprietary libs with Cygwin's C++ compiler or write your own
>> "shim" library that wraps the necessary calls and objects in a C API,
>> compile that with VS, and link your program against the APIs in your
>> library.

@Larry: Would this work? I think MSVC produces obj and lib files in
COFF; can Cygwin's toolchain understand that?

>
> Being as this code is proprietary I doubt that Perforce will release it to
> me to compile but I will point them at this thread...'

Maybe you can convince them to build a Cygwin version (not very likely).

Csaba
-- 
GCS a+ e++ d- C++ ULS$ L+$ !E- W++ P+++$ w++$ tv+ b++ DI D++ 5++
The Tao of math: The numbers you can count are not the real numbers.
Life is complex, with real and imaginary parts.
"Ok, it boots. Which means it must be bug-free and perfect. " -- Linus Torvalds
"People disagree with me. I just ignore them." -- Linus Torvalds

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Building cpan module that links with proprietary libs
  2014-05-30  8:01       ` Andrew DeFaria
  2014-05-30 11:27         ` Csaba Raduly
@ 2014-05-30 16:47         ` Larry Hall (Cygwin)
  1 sibling, 0 replies; 9+ messages in thread
From: Larry Hall (Cygwin) @ 2014-05-30 16:47 UTC (permalink / raw)
  To: cygwin

On 05/29/2014 10:36 PM, Andrew DeFaria wrote:
> On 5/29/2014 6:42 PM, Larry Hall (Cygwin) wrote:
>
>>> I had two archives two choose from. One was for Windows and contained the
>>> .lib files. The other was for Linux and contains .a files. I first
>>> tried the
>>> Linux one but that failed with:
>>>
>>> g++  -shared P4.o  -o blib/arch/auto/P4/P4.dll lib/libp4.a      \
>>>    /usr/lib/perl5/5.14/x86_64-cygwin-threads/CORE/cygperl5_14.dll
>>> -L/cygdrive/a/p4perlBuild/p4api/lib -lclient -lrpc -lsupp
>>> -lp4sslstub        \
>>>
>>> collect2: error: ld terminated with signal 11 [Segmentation fault],
>>> core dumped
>>> Makefile:531: recipe for target 'blib/arch/auto/P4/P4.dll' failed
>>> make: *** [blib/arch/auto/P4/P4.dll] Error 1
>>> Adefaria-lt:
>>>
>>> I can give you more output if you need it.
>>
>> No need.  Forgive me for saying this but I find it hard to believe that
>> after all this time on the list Andrew that you don't know that trying to
>> use Linux-compiled libraries on Cygwin isn't going to work.  But I guess
>> my surprise is not that important here. ;-)
>
> When I first when to get this to work I choose the Linux style of the
> package for p4api. I figured the Windows style was for ActiveState only and
> that'd probably not work. Hell ActiveState doesn't even use cpan, they use
> ppm. I didn't look inside for anything like .o, .a or .dll or .lib. I
> figured that it would have been source code and it would have been compiled
> as part of the make process. It wasn't until it failed that I saw the
> reference to .a's, etc. and looked into the p4api directory structure to see
> .lib's in the Windows copy and .a's in the Linux copy. Sure at *that* point
> I knew the Linux style will never work in this situation. So I tried to link
> with the Windows style .lib copy.

Ah, I see.  A circuitous route leading to a dead-end which wasn't obvious at
the start.  Been there, done that.


<snip>

>> As aresult, you will never get code compiled with g++ to link with these
>> libraries.  There is no common ABI among C++ compilers.  Thus, the libraries
>> and headers of one can't be used as input to the compiler of another, even
>> on the same platform.  This only works for C code.  So you have to either
>> build the proprietary libs with Cygwin's C++ compiler or write your own
>> "shim" library that wraps the necessary calls and objects in a C API,
>> compile that with VS, and link your program against the APIs in your
>> library.
>
> Being as this code is proprietary I doubt that Perforce will release it to
> me to compile but I will point them at this thread...'

That's certainly easiest if you're willing to wait.  Otherwise, you don't
need their source code to build a C API that uses their library.  You just
need their DLLs and header files, which it sounds like you already have.
Of course if I'm wrong about that, then you don't have an option AFAICS.


-- 
Larry

_____________________________________________________________________

A: Yes.
 > Q: Are you sure?
 >> A: Because it reverses the logical flow of conversation.
 >>> Q: Why is top posting annoying in email?

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Building cpan module that links with proprietary libs
  2014-05-30 11:27         ` Csaba Raduly
@ 2014-05-30 17:40           ` Larry Hall (Cygwin)
  2014-05-30 22:06           ` Andrew DeFaria
  1 sibling, 0 replies; 9+ messages in thread
From: Larry Hall (Cygwin) @ 2014-05-30 17:40 UTC (permalink / raw)
  To: cygwin

On 05/30/2014 04:01 AM, Csaba Raduly wrote:
> On Fri, May 30, 2014 at 4:36 AM, Andrew DeFaria  wrote:
>> On 5/29/2014 6:42 PM, Larry Hall (Cygwin) wrote:
>>> As a
>>> result, you will never get code compiled with g++ to link with these
>>> libraries.  There is no common ABI among C++ compilers.  Thus, the
>>> libraries
>>> and headers of one can't be used as input to the compiler of another, even
>>> on the same platform.  This only works for C code.  So you have to either
>>> build the proprietary libs with Cygwin's C++ compiler or write your own
>>> "shim" library that wraps the necessary calls and objects in a C API,
>>> compile that with VS, and link your program against the APIs in your
>>> library.
>
> @Larry: Would this work? I think MSVC produces obj and lib files in
> COFF; can Cygwin's toolchain understand that?

What I'm suggesting is not all that different than using Windows native
platform or other libraries with Cygwin.  So yes, what I'm suggesting will
work and is the typical approach taken to use C++ libraries built by a
different compiler.  It's a pain but it works.  In this case, you just
have to wrap the class methods you want to use in C functions, declare then
'extern "C"', __cdecl, and __declspec(dllexport) (if you decide to make
your "library" a DLL).  Build that with VS and include the .lib at the
end of your invocation of 'gcc'.  Simple.  :-)


-- 
Larry

_____________________________________________________________________

A: Yes.
 > Q: Are you sure?
 >> A: Because it reverses the logical flow of conversation.
 >>> Q: Why is top posting annoying in email?

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Building cpan module that links with proprietary libs
  2014-05-30 11:27         ` Csaba Raduly
  2014-05-30 17:40           ` Larry Hall (Cygwin)
@ 2014-05-30 22:06           ` Andrew DeFaria
  1 sibling, 0 replies; 9+ messages in thread
From: Andrew DeFaria @ 2014-05-30 22:06 UTC (permalink / raw)
  To: cygwin

On 5/30/2014 1:01 AM, Csaba Raduly wrote:
> On Fri, May 30, 2014 at 4:36 AM, Andrew DeFaria  wrote:
>> On 5/29/2014 6:42 PM, Larry Hall (Cygwin) wrote:
>>> As a
>>> result, you will never get code compiled with g++ to link with these
>>> libraries.  There is no common ABI among C++ compilers.  Thus, the
>>> libraries
>>> and headers of one can't be used as input to the compiler of another, even
>>> on the same platform.  This only works for C code.  So you have to either
>>> build the proprietary libs with Cygwin's C++ compiler or write your own
>>> "shim" library that wraps the necessary calls and objects in a C API,
>>> compile that with VS, and link your program against the APIs in your
>>> library.
>
> @Larry: Would this work? I think MSVC produces obj and lib files in
> COFF; can Cygwin's toolchain understand that?
>
>>
>> Being as this code is proprietary I doubt that Perforce will release it to
>> me to compile but I will point them at this thread...'
>
> Maybe you can convince them to build a Cygwin version (not very likely).

I am in contact with Perforce about this. They think it's a wonderful 
idea and they fully want me to let them know when I've managed to 
accomplish this! ;-)

Needless to say, Cygwin, it's Perl and having a P4Perl available for it 
is not necessarily in Perforce's business model. Most people just use 
ActiveState. That said, with 5.18 I hear the backend moves to gcc and 
they need to address that issue. Once addressed having a Cygwin version 
may be easier for them to produce.

I, unfortunately, do not have a lot of time to dedicate to this as my 
client wants me to work on others things. Using Cygwin's Perl is a 
convenience for me but not a necessity, though I would love to have this 
working.
-- 
Andrew DeFaria
http://defaria.com


--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2014-05-30 20:42 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-05-29  4:25 Building cpan module that links with proprietary libs Andrew DeFaria
2014-05-29  8:58 ` Csaba Raduly
2014-05-29 20:34   ` Andrew DeFaria
2014-05-30  6:49     ` Larry Hall (Cygwin)
2014-05-30  8:01       ` Andrew DeFaria
2014-05-30 11:27         ` Csaba Raduly
2014-05-30 17:40           ` Larry Hall (Cygwin)
2014-05-30 22:06           ` Andrew DeFaria
2014-05-30 16:47         ` Larry Hall (Cygwin)

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).