Después de más investigación, Me di cuenta de qué manera funciona el material. Hay dos opciones de vinculador para manipular los símbolos no definidos de bibliotecas compartidas:
La primera es --no-undefined
. Informa los símbolos no resueltos que no se resuelven inmediatamente, en la etapa de enlace. A menos que el símbolo se encuentre en una biblioteca compartida vinculada, ya sea manualmente (con -l
switch) o automáticamente (libgcc_s
, C++ runtime; libc
, C runtime; ld-linux-**.so
, dynamic linker utils) escogido, --no-undefined
lo informa como un error. Esa es la clave que el interrogador necesitaba.
Hay otra clave, --no-allow-shlib-undefined
(cuya descripción también sugiere --no-undefined
). Comprueba si las definiciones en las bibliotecas compartidas que vincula su biblioteca compartida contra están satisfechas. Esta clave es de poca utilidad en el caso que se muestra en este tema, pero puede ser útil.Sin embargo, tiene sus propios obstáculos.
La página de manual proporciona alguna razón de por qué no está predeterminado:
--allow-shlib-undefined
--no-allow-shlib-undefined
Allows (the default) or disallows undefined symbols in shared
libraries (It is meant, in shared libraries _linked_against_, not the
one we're creating!--Pavel Shved). This switch is similar to --no-un-
defined except that it determines the behaviour when the undefined
symbols are in a shared library rather than a regular object file. It
does not affect how undefined symbols in regular object files are
handled.
The reason that --allow-shlib-undefined is the default is that the
shared library being specified at link time may not be the same as
the one that is available at load time, so the symbols might actually
be resolvable at load time. Plus there are some systems, (eg BeOS)
where undefined symbols in shared libraries is normal. (The kernel
patches them at load time to select which function is most appropri-
ate for the current architecture. This is used for example to dynam-
ically select an appropriate memset function). Apparently it is also
normal for HPPA shared libraries to have undefined symbols.
El caso es que lo que se dice más arriba también es cierto, por ejemplo, para los sistemas Linux, donde algunas de las rutinas internas de la compartían la biblioteca está implementada en ld-linux.so
, el cargador dinámico (es biblioteca ejecutable y compartida). A menos que de alguna manera lo enlace, se consigue algo como esto:
/lib64/libc.so.6: undefined reference to `[email protected]_PRIVATE'
/lib64/libc.so.6: undefined reference to `[email protected]_PRIVATE'
/usr/lib64/gcc/x86_64-suse-linux/4.3/libstdc++.so: undefined reference to `[email protected]_2.3'
/lib64/libc.so.6: undefined reference to `[email protected]_PRIVATE'
/lib64/libc.so.6: undefined reference to `[email protected]_PRIVATE'
Estos son referencias indefinidas desde el cargador, ld-linux.so
. Es específico de la plataforma (por ejemplo, en mi sistema, el cargador correcto es /lib64/ld-linux-x86-64.so
). Es posible vincular el cargador con su biblioteca y aun las referencias difíciles mostrados anteriormente:
g++ -fPIC -shared -o liba.so a.o -Wl,--no-allow-shlib-undefined /lib64/ld-linux-x86-64.so.2
No, no hay error en absoluto. –
¿Podría proporcionar la salida del enlazador? –
Hm, podría haber jurado que lo hice antes y no obtuve nada como salida. Hacer esto una vez más pareció hacer que esto funcionara bien (es decir, ¡recibo un error!) –