Re: lt_dlopen an uninstalled library

ilya Basin <[email protected]>
Newsgroups gmane.comp.gnu.libtool.general
Message-ID <[email protected]>
Hi Bob. I configured the GM build with '--with-modules', ran `make check` successfully. Then truncated the built .so files inside the 'coders/' dir to break it. Then reproduced the failure in gdb

    [il@reallin GM]$ export MAGICK_CONFIGURE_PATH='/home/il/builds/GM/config:/home/il/builds/GM/config'
    [il@reallin GM]$ export MAGICK_CODER_MODULE_PATH='/home/il/builds/GM/coders'
    [il@reallin GM]$ gdb --args ./tests/.libs/lt-constitute -storagetype char /home/il/builds/GM/tests/input_truecolor.miff bgr

So it turned out that the test program relies on the full path to the modules dir passed to the program and it calls lt_dlopen() with the full path. I guess I'll have to set the test environment in Makefile.am. Thanks.

┌─magick/module.c──────────────────────────────────────────────────────────────┐
│     1419      (void) LogMagickEvent(ConfigureEvent,GetMagickModule(),        │
│     1420        "Opening module at path \"%s\" ...", path);                  │
│     1421                                                                     │
│  >  1422      handle=lt_dlopen(path);                                        │
│     1423      if (handle == (ModuleHandle) NULL)                             │
│     1424        {                                                            │
│     1425          FormatString(message,"\"%.1024s: %.1024s\"",path,lt_dlerror│
│     1426          ThrowException(exception,ModuleError,UnableToLoadModule,mes│
│     1427          return(MagickFail);                                        │
│     1428        }                                                            │
│     1429      /*                                                             │
└──────────────────────────────────────────────────────────────────────────────┘
multi-thre Thread 0x7ffff73cc8 In: OpenModule          L1422 PC: 0x7ffff7e7bc6c 
(gdb) print path
$1 = "/.snapshots/persist/builds/GM/coders/miff.la\000\000\000\000\313|VUUU\000\
(gdb) 


On 23.11.2021 20:31, Bob Friesenhahn wrote:
> On Mon, 22 Nov 2021, ilya Basin wrote:
> 
>> Hi List.
>> I'm making a program with plugins as shared libraries and when I run `make check` I want my program to load the uninstalled plugins using lt_dlopen().
>>
>> I expected that passing `-dlopen libname.la` to libtool would force the generation of a wrapper script setting the proper LD_LIBRARY_PATH (just like regular linking with a shared .la does). However, an ELF binary is generated and and attempt to call lt_dlopen("libname.la") fails with "File not found". It only succeeds if the filename contains "./.libs/". What am I doing wrong?
> 
> I am not sure what the correct answer is.  Normally loadable modules do not have "lib" prefixes and so normally one does not use a "lib" prefix in conjunction with -module.  Use of "lib" prefixes is for shared libraries indended to be linked with using a linker (for software compilation).
> 
> When libtool builds shared libraries and modules, it puts them in a ".libs" subdirectory.  The ".la" file in the build directory should be enough for libltdl to load the module from the hidden ".libs" subdirectory.  When the module is installed, the a new ".la" file is created which is correct for the installed form, and the module may be re-linked while being installed.
> 
> Feel free to look at GraphicsMagick (http://www.GraphicsMagick.org/) source code for ideas.  GraphicsMagick uses lots of modules and its test suite works without installing the software.  It does not use libltdl's static-module "preloaded" feature.
> 
> Bob
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.