Llamadas intermódulos utilizando la toc
La sección de datos se accede a través de TOC utilizando una característica que permite utilizar llamadas intermódulos.
Debido a que el único acceso desde el texto a la sección de datos es a través del TOC, el TOC proporciona una característica que permite utilizar las llamadas intermódulos. Como resultado, las rutinas se pueden enlazar sin resolver todas las direcciones o símbolos en el momento del enlace. En otras palabras, se puede hacer una llamada a una rutina de utilidad común sin tener realmente esa rutina enlazada en el mismo módulo que la rutina de llamada. De esta manera, se pueden hacer grupos de rutinas en módulos, y las rutinas en los diferentes grupos pueden llamarse entre sí, con el tiempo de vinculación retardado hasta el tiempo de carga. Para poder utilizar esta característica, se deben seguir determinados convenios al llamar a una rutina que se encuentra en otro módulo.
Para llamar a una rutina en otro módulo, se llama a una rutina de interfaz (o rutina enlace global ) que conmuta el contexto del módulo actual al nuevo módulo. Este conmutador de contexto se realiza fácilmente guardando el puntero TOC en el módulo actual, cargando el puntero TOC del nuevo módulo y, a continuación, ramificando a la nueva rutina en el otro módulo. La otra rutina vuelve a la rutina original en el módulo original y la dirección TOC original se carga en el registro de TOC.
Para que el enlace global sea lo más transparente posible, se puede realizar una llamada a rutinas externas sin especificar el módulo de destino. Durante el tiempo de vinculación, el enlazador (editor de enlaces) determina si se debe llamar al código de enlace global e inserta la rutina de enlace global adecuada para realizar la llamada intermódulo. El enlace global está controlado por una lista de importación. Una lista de importación contiene símbolos externos que se resuelven durante el tiempo de ejecución, desde el sistema o desde la carga dinámica de otro archivo de objeto. Consulte el mandato LD para obtener información sobre las listas de importación.
.csect prog1[PR]
...
.extern prog2[PR] #prog2 is an external symbol.
bl .prog2[PR] #call prog2[PR], binder may insert
#global linkage code.
cror 31,31,31 #place holder for instruction to
#restore TOC address.
#AIX® linkage register conventions:
# R2 TOC
# R1 stack pointer
# R0, R12 work registers, not preserved
# LR Link Register, return address.
.csect .prog1[PR]
bl .prog2[GL] #Branch to global
#linkage code.
l 2,stktoc(1) #Restore TOC address
.toc
prog2: .tc prog2[TC],prog2[DS] #TOC entry:
# address of descriptor
# for out-of-module
# routine
.extern prog2[DS]
##
## The following is an example of global linkage code.
.set stktoc,20
.csect .prog2[GL]
.globl .prog2
.prog2: l 12,prog2(2) #Get address of
#out-of-module
#descriptor.
st 2,stktoc(1) #save callers' toc.
l 0,0(12) #Get its entry address
#from descriptor.
l 2,4(12) #Get its toc from
#descriptor.
mtctr 0 #Put into Count Register.
bctr #Return to entry address
#in Count Register.
#Return is directly to
#original caller.