3 votes

GnuCOBOL appelant Rust: libcob : erreur : module non trouvé

Je veux appeler Rust à partir de GnuCOBOL. J'ai copié le code du premier exemple dans GnuCOBOL peut-il interagir avec Rust? de la FAQ de GNUCobol de Brian Tiffin comme test, mais j'ai une erreur lors de son exécution.

Attendu:

$ make -B
rustc --crate-type=dylib called.rs
LD_RUN_PATH=. cobc -xj caller.cob -L. -lcalled
:Hello, world:

Réel :

$ make -B
rustc --crate-type=dylib called.rs
LD_RUN_PATH=. cobc -xj caller.cob -L. -lcalled
libcob: error: module 'hello_rust' non trouvé
make: *** [makefile:5: caller] Erreur 1

J'obtiens la même erreur après avoir compilé les deux fichiers à partir de la ligne de commande, puis en utilisant $ ./caller.

La syntaxe semble correcte d'après la page man de cobc et les sections de liaison du manuel de GnuCOBOL et du référence Rust. J'ai essayé $ ./caller COB_LIBRARY_PATH=. comme décrit dans le manuel de GnuCOBOL, mais cela ne fait aucune différence. La source Rust se compile en bibliothèque comme prévu, mais le COBOL ne la trouve pas.

En utilisant $ cobcrun caller à la place affiche libcob: error: module 'caller' non trouvé.

Cette question sur une erreur similaire concerne la liaison statique de plusieurs fichiers source COBOL, ce qui fonctionne bien, et cette question sur une erreur similaire semble être un problème avec X"AF", qui n'est pas utilisé ici. La liaison statique de sources C avec l'exemple de l'Enveloppe C de Jay Moseley pour Appeler une Fonction de Bibliothèque fonctionne comme prévu. La liaison statique de sources Rust n'est pas prise en charge.

Versions du logiciel:

  • Ubuntu 22.04.1 LTS
  • cobc (GnuCOBOL) 3.1.2.0
  • rustc 1.64.0

4voto

Jaxrtech Points 1471

Le problème semble être que l'exécutable COBOL caller tente de charger dynamiquement une bibliothèque nommée hello_rust.so au lieu de libcalled.so à l'exécution.

  • La solution facile sans rien modifier est simplement de créer un lien symbolique :

    $ ln -s libcalled.so hello_rust.so
  • Alternativement, en ajoutant -fstatic à la commande cobc, la bibliothèque Rust sera liée statiquement à la compilation, éliminant les appels aux bibliothèques dynamiques à l'exécution.

    L'exemple de Makefile peut être mis à jour comme ceci :

    # GnuCOBOL et Rust
    .RECIPEPREFIX = >
    
    caller: caller.cob libcalled.so
    > LD_RUN_PATH=. cobc -fstatic -xj caller.cob -L. -lcalled
    
    libcalled.so: called.rs
    > rustc --crate-type=dylib called.rs

Pour référence, nous pouvons étudier ce que l'exécutable fait via strace pour voir quels appels système le runtime COBOL effectue -- et dans notre cas -- quels fichiers il ne parvient pas à trouver.

$ strace ./caller 2>&1 | grep hello_rust                                                                                                                                         
access("./hello_rust.so", R_OK)         = -1 ENOENT (Aucun fichier ou dossier de ce type)
access("/usr/lib64/gnucobol/hello_rust.so", R_OK) = -1 ENOENT (Aucun fichier ou dossier de ce type)
write(2, "module 'hello_rust' not found", 29module 'hello_rust' not found) = 29

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X