When an invokestatic call is linked, the actual target method is determined, and its address is patched directly into the caller.
An invokespecial call is treated exactly the same, except that the receiver argument is null-checked before control is transferred to the target method.
In the interpreter, this means the method (as a methodOop) is patched into the constant pool cache entry used by the instruction. If several instructions share a single CP cache entry, the first one executed performs linking for them all.
In compiled code, the call instruction is patched to the compiled entry point of the target method. If the target method is not (yet) compiled, adapter code takes execution back into the interpreter.
(Note that argument transmission is mostly stack-based in the interpreter. In compiled code, arguments are passed in registers when possible, similarly to other compiled languages. There should be a wiki page on this.)