Make shared library ".so" of Perl?

Tags: #<Tag:0x00007f50a014f058>

Je cherche à créer une librairie partagée de Perl → un/le fichier "libperl.so version 5.38.0" :

Qui peut me donner la solution - j’ai les sources de Perl perl-5.38.0/ :wink:

J’ai essayé la commande suivante '"gcc -shared" mais il doit manquer des fonctions (fichiers à inclure), truc à inclure.

Code :
root@mail:/home/orj# gcc -shared /home/orj/perl-5.38.0/libperl.a -o /usr/lib/x86_64-linux-gnu/libperl.so.5.38.0
root@mail:/home/orj# cd /usr/lib/x86_64-linux-gnu/
root@mail:/usr/lib/x86_64-linux-gnu# ln -s libperl.so.5.38.0 libperl.so.5.38
root@mail:/usr/lib/x86_64-linux-gnu# ls -l /usr/lib/x86_64-linux-gnu/libperl.so.*
lrwxrwxrwx 1 root root      17 mai   23 17:17 /usr/lib/x86_64-linux-gnu/libperl.so.5.30 -> libperl.so.5.30.0
-rw-r--r-- 1 root root 3468144 mai   23 17:17 /usr/lib/x86_64-linux-gnu/libperl.so.5.30.0
lrwxrwxrwx 1 root root      17 juil. 31 14:38 /usr/lib/x86_64-linux-gnu/libperl.so.5.38 -> libperl.so.5.38.0
-rwxr-xr-x 1 root root   15432 juil. 31 14:38 /usr/lib/x86_64-linux-gnu/libperl.so.5.38.0

Vu le poids des fichiers - çà ne doit pas être bon.

Faut-il que j’ajoute le binaire de perl lui-même, peut-être ?

Informations sur le sujet :

Merci.

Bonne journée.
Romain


Parce que j’ai une commande qui me retourne cette erreur :

Socket.c: loadable library and perl binaries are mismatched

Quand je cherche :

root@mail:/usr/lib/x86_64-linux-gnu#  find / -iname "libperl*" -print
/usr/share/lintian/overrides/libperl5i-perl
/usr/share/doc/libperlio-utf8-strict-perl
/usr/share/doc/libperl5.30
/usr/share/doc/libperl4-corelibs-perl
/usr/share/doc/libperl5i-perl
/usr/share/doc/libperl6-caller-perl
/usr/lib/x86_64-linux-gnu/libperl.so.5.30
/usr/lib/x86_64-linux-gnu/libperl.so.5.30.0
/usr/lib/perl5/5.38.0/x86_64-linux/CORE/libperl.a
/var/lib/dpkg/info/libperlio-utf8-strict-perl.list
/var/lib/dpkg/info/libperl4-corelibs-perl.md5sums
/var/lib/dpkg/info/libperl5.30:amd64.list
/var/lib/dpkg/info/libperl6-caller-perl.list
/var/lib/dpkg/info/libperl4-corelibs-perl.list
/var/lib/dpkg/info/libperl5.30:amd64.md5sums
/var/lib/dpkg/info/libperlio-utf8-strict-perl.md5sums
/var/lib/dpkg/info/libperl6-caller-perl.md5sums
/var/lib/dpkg/info/libperl5.30:amd64.shlibs
/var/lib/dpkg/info/libperl5i-perl.md5sums
/var/lib/dpkg/info/libperl5.30:amd64.triggers
/var/lib/dpkg/info/libperl5i-perl.list
/var/lib/dpkg/info/libperl5.30:amd64.symbols
/home/orj/perl-5.38.0/libperl.a
/home/orj/perl-5.38.0/t/porting/libperl.t
/opt/zimbra/.cpan/build/mod_perl-1.31-0/apaci/libperl.module

Sur un Perl v5.38.0 :

root@mail:/usr/lib/x86_64-linux-gnu# perl -v
This is perl 5, version 38, subversion 0 (v5.38.0) built for x86_64-linux
file "libperl.a" : librairie statique (les ".a") si j'ai bien compris - Dans les sources et après la compilation. dans le système.
root@mail:/usr/lib/x86_64-linux-gnu# ls -l /usr/lib/perl5/5.38.0/x86_64-linux/CORE/libperl.a /home/orj/perl-5.38.0/libperl.a
-rw-r--r-- 1 root root 5518838 juil. 20 15:15 /home/orj/perl-5.38.0/libperl.a
-r--r--r-- 1 root root 5518838 juil. 20 15:15 /usr/lib/perl5/5.38.0/x86_64-linux/CORE/libperl.a

La solution doit être celle de mon commentaire 6 mais je n’y arrive pas :wink:

Et en regardant par ici :

root@mail:/usr/lib/x86_64-linux-gnu# apt show libperl5.30 libperl5i-perl
Package: libperl5.30
Version: 5.30.0-9ubuntu0.4
Priority: optional
Build-Essential: yes
Section: libs
Source: perl
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Niko Tyni <ntyni@debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 27,7 MB

Depends: libbz2-1.0, libc6 (>= 2.29), libcrypt1 (>= 1:4.1.0), libdb5.3, libgdbm-compat4 (>= 1.18-3), libgdbm6 (>= 1.18-3), zlib1g (>= 1:1.2.2.3), perl-modules-5.30 (>= 5.30.0-9ubuntu0.4)

Suggests: sensible-utils
Breaks: libcompress-raw-bzip2-perl (<< 2.084), libcompress-raw-zlib-perl (<< 2.084), libcompress-zlib-perl (<< 2.084), libdigest-md5-perl (<< 2.55), libdigest-sha-perl (<< 6.02), libencode-perl (<< 3.01), libfilter-perl (<< 1.59), libio-compress-base-perl (<< 2.084), libio-compress-bzip2-perl (<< 2.084), libio-compress-perl (<< 2.084), libio-compress-zlib-perl (<< 2.084), libmime-base64-perl (<< 3.15), libstorable-perl (<< 3.15), libsys-syslog-perl (<< 0.35), libthreads-perl (<< 2.22), libthreads-shared-perl (<< 1.60), libtime-hires-perl (<< 1.9760), libtime-piece-perl (<< 1.3300)
Replaces: libarchive-tar-perl (<= 1.38-2), libcompress-raw-bzip2-perl (<< 2.084), libcompress-raw-zlib-perl (<< 2.084), libcompress-zlib-perl (<< 2.084), libdigest-md5-perl (<< 2.55), libdigest-sha-perl (<< 6.02), libencode-perl (<< 3.01), libio-compress-base-perl (<< 2.084), libio-compress-bzip2-perl (<< 2.084), libio-compress-perl (<< 2.084), libio-compress-zlib-perl (<< 2.084), libmime-base64-perl (<< 3.15), libmodule-corelist-perl (<< 2.14-2), libstorable-perl (<< 3.15), libsys-syslog-perl (<< 0.35), libthreads-perl (<< 2.22), libthreads-shared-perl (<< 1.60), libtime-hires-perl (<< 1.9760), libtime-piece-perl (<< 1.3300), perl (<< 5.22.0~), perl-base (<< 5.22.0~)
Homepage: http://dev.perl.org/perl5/
Task: server, print-server, ubuntu-desktop-minimal, lamp-server, ubuntu-desktop, cloud-image, postgresql-server, kubuntu-desktop, xubuntu-core, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop
Download-Size: 3 959 kB
APT-Manual-Installed: no
APT-Sources: http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages
Description: bibliothèque partagée Perl
 Ce paquet contient la bibliothèque partagée Perl, utilisée par les
 applications qui embarquent un interpréteur Perl.
 .
 It also contains the architecture-dependent parts of the standard library
 (and depends on perl-modules-5.30 which contains the architecture-
 independent parts).

#------------------

Package: libperl5i-perl
Version: 2.13.2-1
Priority: optional
Section: universe/perl
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian Perl Group <pkg-perl-maintainers@lists.alioth.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 262 kB
Provides: libperl5i-0-perl, libperl5i-1-perl, libperl5i-2-perl

Depends: libc6 (>= 2.4), perl, libautobox-core-perl, libautobox-dump-perl, libautobox-list-util-perl, libautobox-perl, libautovivification-perl, libcapture-tiny-perl, libcarp-fix-1-25-perl, libchild-perl, libclass-perl, libdatetime-format-epoch-perl, libdatetime-perl, libdatetime-timezone-tzfile-perl, libdevel-declare-perl, libfile-chdir-perl, libhash-fieldhash-perl, libhash-merge-simple-perl, libhash-storediterator-perl, libindirect-perl, libipc-system-simple-perl, libjson-maybexs-perl (>= 1.003005), liblist-moreutils-perl, libmodern-perl-perl, libobject-id-perl, libpath-tiny-perl, libperl6-caller-perl, libsub-name-perl, libtaint-util-perl, libtime-y2038-perl, libtrue-perl, libtry-tiny-perl, libutf8-all-perl (>= 0.015), libwant-perl, libyaml-perl, perl (>= 5.17.2) | libautodie-perl (>= 2.12)

Homepage: https://metacpan.org/release/perl5i
Download-Size: 75,3 kB
APT-Manual-Installed: yes
APT-Sources: http://archive.ubuntu.com/ubuntu focal/universe amd64 Packages
Description: pragma to fix as much of Perl 5 as possible
 perl5i is a Perl pragma that swiftly enables the features of a collection of
 modules and techniques used to fix Perl 5's warts. It includes changing core
 functions, adding features and changing defaults, so it will likely not be
 100% backwards compatible with standard Perl 5 syntax. However, this pragma
 tries to limit the damage by having a lexical effect.

N: Il y a 1 enregistrement supplémentaire. Veuillez utiliser l'opérande « -a » pour le voir
root@mail:/usr/lib/x86_64-linux-gnu#

Est-ce que, cela me donne, déjà, des informations importantes, en rapport à ce que je souhaite faire ?? ou pas du tout ?

Faudrait-il que j’ajoute toutes ces librairies à la commande « GCC » ?

Merci.

Romain

Comme mémo :slight_smile:

Pour afficher les dépendances d’un object/commande → « ldd » - print shared object dependencies

root@mail_PROD:~ # ldd `which perl`
        linux-vdso.so.1 (0x00007ffe7c887000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2fb5fff000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2fb5c61000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2fb5a42000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2fb5651000)
        libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f2fb5419000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f2fb6603000)


root@mail_TEST:/usr/lib/x86_64-linux-gnu# ldd `which perl`
        linux-vdso.so.1 (0x00007ffcfd98d000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff8e4b85000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff8e4b7f000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff8e4a30000)
        libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007ff8e49f5000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff8e4803000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ff8e4f52000)

:face_with_raised_eyebrow:

Pour informations sur les librairies linux :

root@mail:/usr/lib/x86_64-linux-gnu# cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf

root@mail:/usr/lib/x86_64-linux-gnu# cat /etc/ld.so.conf.d/libc.conf
# libc default configuration
/usr/local/lib

root@mail:/usr/lib/x86_64-linux-gnu# cat /etc/ld.so.conf.d/x86_64-linux-gnu.conf
# Multiarch support
/usr/local/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

root@mail:/usr/lib/x86_64-linux-gnu# cat /etc/ld.so.conf.d/fakeroot-x86_64-linux-gnu.conf
/usr/lib/x86_64-linux-gnu/libfakeroot

ldconfig - configure dynamic linker run-time bindings` si on ajoute des répertoires.

DESCRIPTION :

ldconfig crée les liens et le cache nécessaires vers les bibliothèques partagées les plus récentes trouvées dans les répertoires spécifiés sur la ligne de commande, dans le fichier /etc/ld.so.conf, et dans les répertoires de confiance, /lib et /usr/lib (sur certaines architectures 64 bits telles que x86-64, /lib et /usr/lib sont les répertoires de confiance pour les bibliothèques 32 bits, tandis que /lib64 et /usr/lib64 sont utilisés pour les bibliothèques 64 bits).

Le cache est utilisé par l’éditeur de liens d’exécution, ld.so ou ld-linux.so. ldconfig vérifie l’en-tête et les noms de fichiers des bibliothèques qu’il rencontre lors de la détermination des versions dont les liens doivent être mis à jour.

ldconfig tentera de déduire le type de bibliothèques ELF (c’est-à-dire libc5 ou libc6/glibc) en fonction des bibliothèques C, le cas échéant, auxquelles la bibliothèque était liée.

Certaines bibliothèques existantes ne contiennent pas suffisamment d’informations pour permettre la déduction de leur type. Par conséquent, le format de fichier /etc/ld.so.conf permet de spécifier un type attendu. Ceci n’est utilisé que pour les bibliothèques ELF que nous ne pouvons pas résoudre. Le format est « dirname=TYPE », où TYPE peut être libc4, libc5 ou libc6. (Cette syntaxe fonctionne également sur la ligne de commande.) Les espaces ne sont pas autorisés. Voir aussi l’option -p. ldconfig doit normalement être exécuté par le superutilisateur car il peut nécessiter une autorisation d’écriture sur certains répertoires et fichiers appartenant à la racine.

Notez que ldconfig ne regardera que les fichiers nommés lib*.so* (pour les objets partagés normaux) ou ld-.so (pour le chargeur dynamique lui-même). Les autres fichiers seront ignorés. De plus, ldconfig attend un certain modèle de configuration des liens symboliques, comme cet exemple, où le fichier du milieu (libfoo.so.1 ici) est le SONAME de la bibliothèque :

 libfoo.so -> libfoo.so.1 -> libfoo.so.1.12

Le non-respect de ce modèle peut entraîner des problèmes de compatibilité après une mise à niveau.

Surprenant d’avoir besoin de ce paquet 5.30 ubuntu, alors que la version Debian en cours est 5.36.

libperl5.36 shared Perl library

Déjà disponible en experimental / moins à risque que de mélanger du ubuntu.

Debian – libperl5.38

Merci @Verner, bonjour.

Et de mélanger :roll_eyes: la version expérimentale de Debian sur une Ubuntu ?

root@mail:/usr/lib/x86_64-linux-gnu# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.6 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.6 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
root@mail:/usr/lib/x86_64-linux-gnu#

Je ne vais pas ajouter les dépôts de la version 23.04 d’Ubuntu – Package Search Results – libperl5 sur la 20.04, bien que non puisque’il me faut la version 5.38.0 :wink:

Sinon je souhaitais connaître la démarche à suivre pour créer cette librairie « libperl » sur Debian / Ubuntu, maintenant que j’ai compilé Perl5.38.0 par dessus la version standard 5.30.0 de mon système.

J’essaie de recompiler Perl comme expliquer ici :

Building a shared « libperl.so » Perl libraryInstall - Build and Installation guide for perl5.

Vous pouvez choisir de construire un libperl partagé en

sh Configure -Duseshrplib ........

Et avant d’executer le « make » ajouter la variable d’environnement dans le répertoire courant de l’installation (des sources de Perl) :

LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH 

Je vous tiens au jus :slight_smile:

Si le sujet est « Comment compiler/installer libperl5.38 dans ubuntu 20.04 (Focal Fossa) » /pas tout jeune, et non pas dans Debian, il y a quelque-chose qui a du m’échapper.

Dépendances de libperl5.38:

libbz2-1.0 libc6 libcrypt1 libdb5.3 libgdbm-compat4 
libgdbm6 zlib1g perl-modules-5.38

Pour mettre ça à jour dans ubuntu 20.04, sans que ce soit trop bancale, je te souhaite bon courage.

Merci.

J’ai du courage :cowboy_hat_face: :blush: Merci.

Je n’arrive pas à passer le « make test » :face_with_raised_eyebrow:

En passant avant (pour avoir le système fonctionnel)
root@mail:/home/orj# mv /usr/share/perl5/ /usr/share/perl5-DEFAULT-5.30.0
root@mail:/home/orj# mkdir /usr/share/perl5/
root@mail:/home/orj# cp -Rp /usr/share/perl5-DEFAULT-5.30.0/Debconf/ /usr/share/perl5/
root@mail:/home/orj# cp -Rp /usr/share/perl5-DEFAULT-5.30.0/Debian/ /usr/share/perl5/
root@mail:/home/orj# cp -Rp /usr/share/perl5-DEFAULT-5.30.0/DebianLinux.pm /usr/share/perl5/
root@mail:/home/orj# cp -Rp /usr/share/perl5-DEFAULT-5.30.0/Dpkg/ /usr/share/perl5/
root@mail:/home/orj# cp -Rp /usr/share/perl5-DEFAULT-5.30.0/Dpkg.pm /usr/share/perl5/

Les commandes (ATTENTION CÀ ÉCRASE « /usr/bin/perl ») :

root@mail:/home/orj# wget https://www.cpan.org/src/5.0/perl-5.38.0.tar.gz
root@mail:/home/orj# tar -xzf perl-5.38.0.tar.gz
root@mail:/home/orj# cd perl-5.38.0
root@mail:/home/orj/perl-5.38.0# ./Configure -des -Dprefix=/usr -Dprivlib=/usr/share/perl5 -Duseshrplib
root@mail:/home/orj/perl-5.38.0# LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH 
root@mail:/home/orj/perl-5.38.0# make

Puis :

root@mail:/home/orj/perl-5.38.0# make test
[...]
t/porting/FindExt ................................................ ok
t/porting/args_assert ............................................ ok
t/porting/authors ................................................ skipped
t/porting/bench .................................................. skipped
t/porting/bench_selftest ......................................... ok
t/porting/bincompat .............................................. ok
t/porting/checkcase .............................................. ok
t/porting/checkcfgvar ............................................ ok
t/porting/cmp_version ............................................ skipped
t/porting/copyright .............................................. ok
t/porting/corelist ............................................... ok
t/porting/customized ............................................. ok
t/porting/deprecation ............................................ ok
t/porting/diag ................................................... ok
t/porting/dual-life .............................................. ok
t/porting/exec-bit ............................................... ok
t/porting/extrefs ................................................ ok
t/porting/filenames .............................................. ok
t/porting/globvar ................................................ ok
t/porting/header_parser .......................................... ok
t/porting/libperl ................................................ porting/libperl.t: undefined current object:                  U abort@@GLIBC_2.2.5 at porting/libperl.t line 208, <$nm_fh> line 1.
FAILED--no leader found
t/porting/maintainers ............................................ ok
t/porting/manifest ............................................... ok
t/porting/perlfunc ............................................... ok
t/porting/pod_rules .............................................. ok
t/porting/podcheck ............................................... ok
t/porting/re_context ............................................. ok
t/porting/readme ................................................. ok
t/porting/regen .................................................. ok
t/porting/ss_dup ................................................. ok
t/porting/test_bootstrap ......................................... ok
t/porting/test_testlist .......................................... ok
t/porting/update_authors ......................................... skipped
t/porting/utils .................................................. skipped
Failed 1 test out of 2514, 99.96% okay.
        porting/libperl.t
### Since not all tests were successful, you may want to run some of
### them individually and examine any diagnostic messages they produce.
### See the INSTALL document's section on "make test".
### You have a good chance to get more information by running
###   ./perl harness
### in the 't' directory since most (>=80%) of the tests succeeded.
### You may have to set your dynamic library search path,
### LD_LIBRARY_PATH, to point to the build directory:
###   setenv LD_LIBRARY_PATH `pwd`:$LD_LIBRARY_PATH; cd t; ./perl harness
###   LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH; cd t; ./perl harness
###   export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH; cd t; ./perl harness
### for csh-style shells, like tcsh; or for traditional/modern
### Bourne-style shells, like bash, ksh, and zsh, respectively.
Elapsed: 966 sec
u=14.69  s=5.80  cu=626.68  cs=71.13  scripts=2514  tests=1118067
make: *** [makefile:825: test] Error 1
root@mail:/home/orj/perl-5.38.0#

L’erreur :

t/porting/libperl ................................................ porting/libperl.t: undefined current object:                  U abort@@GLIBC_2.2.5 at porting/libperl.t line 208, <$nm_fh> line 1.
FAILED--no leader found

root@mail:/home/orj/perl-5.38.0#
root@mail:/home/orj/perl-5.38.0# ls -l t/porting/libperl.t
-r--r--r-- 1 501 staff 16641 juin  25 02:02 t/porting/libperl.t
root@mail:/home/orj/perl-5.38.0#

Je suppose que tu as vérifié que LD_LIBRARY_PATH pointait bien sur le répertoire du build.
echo $LD_LIBRARY_PATH

oui :wink:

Il pointe bien sur mon répertoire " /home/orj/perl-5.38.0" où il y a les sources de Perl 5.38.0.


Je suis en « test harness » - Et si j’ouvre une 2ème console - Je n’aurais plus l’export « configuré/ajouté ».

root@mail:/home/orj/perl-5.38.0# cd t
root@mail:/home/orj/perl-5.38.0/t# ./perl harness
../lib/warnings.t .................................................... ok

Test Summary Report
-------------------
porting/libperl.t                                                  (Wstat: 7424 (exited 29) Tests: 0 Failed: 0)
  Non-zero exit status: 29
  Parse errors: No plan found in TAP output
Files=2756, Tests=1117927, 1013 wallclock secs (105.87 usr 10.04 sys + 615.18 cusr 70.21 csys = 801.30 CPU)
Result: FAIL
Finished test run at Tue Aug  1 12:32:30 2023.
root@mail:/home/orj/perl-5.38.0/t#
root@mail:/home/orj/perl-5.38.0/t# echo $LD_LIBRARY_PATH
/home/orj/perl-5.38.0:
root@mail:/home/orj/perl-5.38.0/t#

Je viens d’ajouter les lignes de commandes dans le commentaire ci-dessus.

Les sources ? Ou le build ?
### LD_LIBRARY_PATH, to point to the build directory:

Et bien, c’est bien le répertoire des sources de perl que je viens de dézipper pour « construire » perl.

Sinon un autre test :

root@mail:/home/orj/perl-5.38.0/t# ./perl porting/libperl.t
# $^O = linux
# $Config{archname} = x86_64-linux
# $Config{cc} = cc
# libperl = ../libperl.a
# nm = /usr/bin/nm
# nm_style = gnu
# nm_opt =
# command: "/usr/bin/nm  ../libperl.a 2>libperl678563 |"
porting/libperl.t: undefined current object:                  U abort@@GLIBC_2.2.5 at porting/libperl.t line 208, <$nm_fh> line 1.
root@mail:/home/orj/perl-5.38.0/t#

Le fichier vim porting/libperl.t

# XXX Implement "internal test" for this script (option -t?)
# to verify that the parsing does what it's intended to.

198 sub nm_parse_gnu {
199     my $symbols = shift;
200     my $line = $_;
201     if (m{^(\w+\.o):$}) {
202         # object file name
203         $symbols->{obj}{$1}++;
204         $symbols->{o} = $1;
205         return;
206     } else {
207         die "$0: undefined current object: $line"
208             unless defined $symbols->{o};
209         # 64-bit systems have 16 hexdigits, 32-bit systems have 8.
210         if (s/^[0-9a-f]{8}(?:[0-9a-f]{8})? //) {
211             if (/^[Rr] (\w+)$/) {
212                 # R: read only (const)
213                 $symbols->{data}{const}{$1}{$symbols->{o}}++;
214             } elsif (/^r .+$/) {
215                 # Skip local const (read only).
216             } elsif (/^([Tti]) (\w+)(\..+)?$/) {
217                 $symbols->{text}{$2}{$symbols->{o}}{$1}++;
218             } elsif (/^C (\w+)$/) {
219                 $symbols->{data}{common}{$1}{$symbols->{o}}++;
220             } elsif (/^[BbSs] (\w+)(\.\d+)?$/) {
221                 # Bb: uninitialized data (bss)
222                 # Ss: uninitialized data "for small objects"
223                 $symbols->{data}{bss}{$1}{$symbols->{o}}++;
224             } elsif (/^D _LIB_VERSION$/) {
225                 # Skip the _LIB_VERSION (not ours, probably libm)
226             } elsif (/^[DdGg] (\w+)$/) {
227                 # Dd: initialized data
228                 # Gg: initialized "for small objects"
229                 $symbols->{data}{data}{$1}{$symbols->{o}}++;
230             } elsif (/^. \.?(\w+)$/) {
231                 # Skip the unknown types.
232                 print "# Unknown type: $line ($symbols->{o})\n";
233             }
234             return;
235         } elsif (/^ {8}(?: {8})? U _?(\w+)$/) {
236             my ($symbol) = $1;
237             return if is_perlish_symbol($symbol);
238             $symbols->{undef}{$symbol}{$symbols->{o}}++;
239             return;
240         }
241     }
242     print "# Unexpected nm output '$line' ($symbols->{o})\n";
243 }

Serait-ce parce que je n’ai pas installé GLIBC pour la compilation croisée :confused:

Faut-il que j’installe :

root@mail:/home/orj/perl-5.38.0/t# apt show glibc
[...]
linux-libc-dev/focal-updates,focal-security,now 5.4.0-155.172 amd64  [installé, automatique]
  En-têtes du noyau Linux pour le développement
[...]
linux-libc-dev-amd64-cross/focal-updates 5.4.0-110.124cross1 all
  En-têtes du noyau Linux pour le développement (pour la compilation croisée)
[...]
linux-libc-dev-i386-cross/focal-updates 5.4.0-110.124cross1 all
  En-têtes du noyau Linux pour le développement (pour la compilation croisée)
[...]

Je viens de lire cela " lddlibc4 assists ldd with object files. " ici → Glibc.

Aussi :

root@mail:/home/orj/perl-5.38.0/t# apt search ldd
En train de trier... Fait
Recherche en texte intégral... Fait
[...]
libc-bin/focal-updates,now 2.31-0ubuntu9.9 amd64  [installé, automatique]
  bibiliothèque C GNU : binaires
[...]
libsbuild-perl/focal 0.79.0-1ubuntu1 all
  Library for building Debian binary packages from Debian sources
[...]
root@mail:/home/orj/perl-5.38.0/t# apt install libsbuild-perl
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
  geoip-database libgeoip1
Veuillez utiliser « apt autoremove » pour les supprimer.
Les paquets supplémentaires suivants seront installés :
  autodep8 autopkgtest dctrl-tools libboost-filesystem1.71.0 libboost-iostreams1.71.0 libboost-program-options1.71.0 libemail-date-format-perl libfilesys-df-perl libmime-lite-perl libmime-types-perl schroot schroot-common
Paquets suggérés :
  lxc lxd ovmf qemu-efi-aarch64 qemu-efi-arm qemu-system qemu-utils vmdb2 debtags libmojolicious-perl debootstrap zfsutils-linux aufs-tools | unionfs-fuse qemu-user-static
Les NOUVEAUX paquets suivants seront installés :
  autodep8 autopkgtest dctrl-tools libboost-filesystem1.71.0 libboost-iostreams1.71.0 libboost-program-options1.71.0 libemail-date-format-perl libfilesys-df-perl libmime-lite-perl libmime-types-perl libsbuild-perl schroot schroot-common
0 mis à jour, 13 nouvellement installés, 0 à enlever et 16 non mis à jour.
Il est nécessaire de prendre 1?887 ko dans les archives.
Après cette opération, 11,9 Mo d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n].....

En gros j’ai installé en plus "libsbuild-perl " et « linux-libc-dev-amd64-cross » mais toujours la même erreur.

J’ajoute ce lien :

Installer Glibc-2.3.2 : Glibc est une bibliothèque C qui apporte les appels système et les fonctions de base telles que open, malloc, printf, etc. La bibliothèque C est utilisée par tous les programmes liés dynamiquement.

Linux From Scratch

Ce livre est dédié à ma femme aimante, Beverly Beekmans , au soutien indéfectible.

Ce livre décrit le processus de création d’un système Linux depuis rien, en utilisant uniquement les sources des logiciels utilisés.

III. Troisième Partie - Construire le système LFS
6. Installation des logiciels du système de base
- Installer Glibc-2.3.2
- Installer Perl-5.8.0

Comme vous me disiez @Verner, il va falloir du courage :sweat_smile: :rofl:

He bien ce n’est justement pas ce que demande le log du make, le répertoire de build n’étant pas celui des sources. C’est pour ça que je posais la question.
### LD_LIBRARY_PATH, to point to the build directory:

Mon avis: tu es mal barré avec ta vieille ubuntu cross_arch, mais comme tu es courageux, tu ne vas pas t’arrêter pour si peu.

Mais non tu te trompes, je t’assure !

Les sources sont le répertoire de construction, il te/me le dise en plus dans les « logs » du make.

Vous devrez peut-être définir le chemin de recherche de votre bibliothèque dynamique, LD_LIBRARY_PATH, pour qu’il pointe vers le répertoire de construction :

exemple# setenv LD_LIBRARY_PATH pwd:$LD_LIBRARY_PATH ; cd t; ./perl harness
exemple# LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH ; export LD_LIBRARY_PATH ; cd t; ./perl harness
exemple# export LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH ; cd t; ./perl harness

pour les shells de style csh, comme tcsh ; ou pour les shells de style Bourne traditionnels/modernes, comme bash, ksh et zsh, respectivement

C’est écrit ici aussi :

Pour réellement compiler perl, vous devez ajouter le répertoire de travail courant à votre variable d’environnement LD_LIBRARY_PATH avant d’exécuter make. Vous pouvez le faire avec :

Donc, entre la commande ./Configure et make, make test, make install.
Et de plus, il nous envoie la commande « pwd » qui retourne le répertoire courant. de la compilation, donc.

Salutations,
Romain

Ça dépend … du constructeur. Je sépare le build des sources pour ne pas risquer de les polluer.
Mais si le mode d’emploi dit ça, et comme c’est toi qui conduis, c’est toi qui sais !
Pas si facile ubuntu.

Il faut arrêter de dire n’importe koi :blush: :innocent: - C’est Perl, rien à voir avec Ubuntu :rofl:

Et généralement, le répertoire « build » c’est le résultat de/d’une construction, après la construction, après le « make install » :wink:

J’essaie de ne pas conduire vers un Scratch j’crois … hahaha :joy:

La Bonne conduite, l’art de rouler/de la bonne conduite depuis des années… rizla :wink:

Non. C’est perl 5.38 dans une vieille ubuntu multi arch certainement déjà bien tripatouillée depuis le temps.
C’est bien un problème spécifique ubuntu focal puisque Perl 5.38 est dispo pour Debian, certes avec quelques contorsions (dépôt experimental), mais beaucoup plus simple.

Exact, et c’est le make test qui te demande la librairie, qui ne se trouve justement pas dans les sources, mais c’est toi qui conduis et qui sais.

Une question en off: mais que fais-tu avec du Perl 5.38 non dispo en t’obstinant dans une vieille ubuntu qui va commencer à craquer de partout, mais c’est juste une question en off, dont le réponse ne me regarde pas.
Deuxième question en off: Perl 5.36 est dispo chez ubuntu: 5.38 est-il réellement justifié ???

J’essaie justement de créer cette librairie – et cela grâce à la getOps -Duseshrplib au moment de la Configure de l’installation, j’ai la librairie « static (.a) » que j’ai déjà compilé qui est ici :
/usr/lib/perl5/5.38.0/x86_64-linux/CORE/libperl.a
ou pour la construction/installation qui est ici (dans les sources du programme Perl) :
/home/orj/perl-5.38.0/libperl.a

Je cherche à créer une librairie « partagée (.so) » -
/usr/lib/x86_64-linux-gnu/libperl.so.5.38

Pour qu’elle puisse être appelée par des programmes tierces.

C’est un version de 2020 ok mais c’est une LTS (Long Term Support)

Vous pouvez lire cette page de documention que j’ai écrite :

Ou, encore ce sujet de discussion que j’ai créais sur le forum de ZIMBRA - Zimbra est un serveur MTA (Mails) OpenSource.

Et « Zimbra Collaboration Open Source » est disponible seulement pour cette version d’Ubuntu :

Tout çà donc pour « sécuriser plus fort mon serveur de Mails contre les "faussaires/usurpateurs » d’identité (les mails SPAMs) - Pour ajouter à l’anti-virus Mail::SpamAssassin, l’anti-phishing, une couche suplémentaire contre le spam Mail::DMARC (Domain-based Message Authentication, Reporting and Conformance) avec une couche encore supplémentaire BIMI (Brand Indicators for Message Identification retrieval, validation, and processing)

Et que mon serveur de Mail Zimbra sur un serveur de test ne démarre plus à cause que :

La bibliothèque chargeable et les binaires perl ne correspondent pas.

Depuis que j’ai upgradé Perl du système pour pouvoir installer Mail:DMARC qui me demandait la version 5.36 de perl, la version courante à l’époque, il y a 1 an et j’ai remarqué il y a quelques jours que je n’avais pas la librairie partagée de mon Perl fonctionnel et que cela devait être lié.

:slight_smile:

Et donc, l’erreur de compilation de Perl actuelle est celle -ci :

Que le GCC ne trouve GLIBC qui est une bibliothèque C qui apporte les appels système et les fonctions de base pour être utilisée par tous les programmes liés dynamiquement.

Je pense que GLIBC doit être installé, mais vu que j’ai changeais ma version de Perl, il faudrait peut-être recréer/réajuster quelque chose.