Почему g cc не разрешает неопределенные символы в общем объекте на MSYS2? - PullRequest
1 голос
/ 03 августа 2020

Я пытаюсь собрать Math::GSL на MSYS2 и получил некоторые проблемы с созданием общих объектов. Вот упрощенная версия моей проблемы, рассмотрим эту C программу sample.c:

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
static void SWIG_croak_null()
{
  SV *err = get_sv("@", GV_ADD);
  croak("%s", SvPV_nolen(err));
}

В Ubuntu я могу создать общий объект sample.so, подобный этому, используя сценарий оболочки run.sh:

#! /bin/bash
perl_dir=$(perl -MConfig -e'print $Config{archlib}')"/CORE"
set -x
gcc -I"$perl_dir" -c -fPIC -g -o sample.o sample.c
gcc -o sample.so sample.o -shared -fPIC

Результат:

+ gcc -I/home/hakon/perlbrew/perls/perl-5.30.0/lib/5.30.0/x86_64-linux/CORE -c -fPIC -g -o sample.o sample.c
+ gcc -o sample.so sample.o -shared -fPIC

Но если я запустил ту же программу на Windows 10 с MSYS2, perl версия 5.32.0, я получу следующий результат:

+ gcc -I/usr/lib/perl5/core_perl/CORE -c -fPIC -g -o sample.o sample.c
+ gcc -o sample.so sample.o -shared -fPIC
/usr/lib/gcc/x86_64-pc-msys/9.3.0/../../../../x86_64-pc-msys/bin/ld: sample.o: in function `SWIG_croak_null':
/home/hakon/perl/test/perl_get_sv/sample.c:7: undefined reference to `Perl_get_sv'
/home/hakon/perl/test/perl_get_sv/sample.c:7:(.text+0x2b): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `Perl_get_sv'
/usr/lib/gcc/x86_64-pc-msys/9.3.0/../../../../x86_64-pc-msys/bin/ld: /home/hakon/perl/test/perl_get_sv/sample.c:8: undefined reference to `Perl_sv_2pv_flags'
/home/hakon/perl/test/perl_get_sv/sample.c:8:(.text+0x79): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `Perl_sv_2pv_flags'
/usr/lib/gcc/x86_64-pc-msys/9.3.0/../../../../x86_64-pc-msys/bin/ld: /home/hakon/perl/test/perl_get_sv/sample.c:8: undefined reference to `Perl_croak_nocontext'
/home/hakon/perl/test/perl_get_sv/sample.c:8:(.text+0x88): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `Perl_croak_nocontext'
/usr/lib/gcc/x86_64-pc-msys/9.3.0/../../../../x86_64-pc-msys/bin/ld: sample.o:sample.c:(.rdata$.refptr.PL_thr_key[.refptr.PL_thr_key]+0x0): undefined reference to `PL_thr_key'
collect2: error: ld returned 1 exit status

Однако, если я явно связываюсь с libperl.dll.a, он отлично работает:

gcc -o sample.so sample.o -shared -L"$perl_dir" -lperl

Почему невозможно создать общий объект с неопределенными символами в MSYS2?

1 Ответ

0 голосов
/ 03 августа 2020

Согласно эта страница :

Из-за явного характера таблицы импортированных символов невозможно оставить символ в PE DLL неопределенным по ссылке время, чтобы быть удовлетворенным во время выполнения, поскольку это возможно с большинством UNIX общих объектов.

...