【问题标题】:Why does gcc not allow undefined symbols in shared object on MSYS2?为什么 gcc 不允许 MSYS2 上的共享对象中有未定义的符号?
【发布时间】:2020-08-03 17:28:28
【问题描述】:

我正在尝试在 MSYS2 上构建 Math::GSL,并通过创建共享对象获得了一些 problems。这是我的问题的简化版本,考虑这个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 上,我可以使用 run.sh shell 脚本像这样创建共享对象 sample.so

#! /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 中创建带有未定义符号的共享对象?

【问题讨论】:

    标签: perl gcc ld msys2


    【解决方案1】:

    根据this page

    由于导入符号表的显式性质,它是 无法在链接时将符号留在未定义的 PE DLL 中,以 在运行时满足,因为大多数 UNIX 都可以 共享对象。

    【讨论】:

      猜你喜欢
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 2016-10-16
      相关资源
      最近更新 更多