1) No sé por qué necesitaría esto para una función. Tal vez alguien más pueda intervenir.
2) El enlazador determina esto pasando por todos los archivos de objeto y comprobando los símbolos dentro de cada archivo de objeto. Supongo que, dependiendo de su vinculador, el orden de búsqueda exacto puede variar.
Para GNU binutils 'ld todos los archivos de objetos y bibliotecas que aparecen en la línea de comando del enlazador después de que el objeto que contiene el símbolo faltante se buscan de izquierda a derecha y se selecciona el primer símbolo encontrado.
Ejemplo 1:
- ao - utiliza foo(), bar()
- Liba - ofrece bar()
- libB - proporciona foo()
$> ld ao -la -lb
dará lugar a que se busquen símbolos indefinidos. A continuación, ld pasará por las bibliotecas de izquierda a derecha para buscar estos símbolos y encontrará barras en liba y foo en libb.
Esto puede conducir a problemas extraños sobre dependencias circulares:
Ejemplo 2:
- a.O - utiliza bar()
- Liba - proporciona bar(), utiliza foo()
- libB - proporciona foo(), utiliza la barra()
Ahora, hay una dependencia circular entre Liba y libB y la vinculación fallará:
$> ld ao -la -lb
porque cuando se busca a través de los símbolos no definidos en libB, ld determinará que no hay otro lib a la derecha - lb que proporciona este símbolo. Esto puede ser fijado en por lo menos dos maneras:
1) Enlace Liba dos veces: $> ld ao -la -lb -la
2) Utiliza la función de agrupación de LD $> ld ao --start- group -la -lb --end-group
En el caso 2), la agrupación le dice a ld que busque a través de todos los símbolos en todas las libs que pertenecen a este grupo.
¿Esto significa que puede llamar a las funciones internas de un módulo (supongamos que la fuente no está disponible) si conoce la firma de la función? – user199421
Si las funciones tienen un enlace externo, entonces sí.Sin embargo, no podrá llamar a las funciones declaradas en un espacio de nombres sin nombre o declaradas estáticas (a menos que sepa cómo su compilador/enlazador descifra los nombres). –