Me di cuenta de que usar -r para hacer un enlace parcial en realidad no resuelve ninguna reubicación, al parecer, incluso si pudieran resolverse mediante el direccionamiento relativo. Por ejemplo, considere fo y go , con fo que contiene f() que llama a g() dentro de go . Antes de vincular, el desmontaje y las reubicaciones son las esperadas. Sin embargo, después de un enlace parcial a un nuevo archivo ho (a través de ld -r -o ho fo go ), todavía hay una reubicación para la llamada a g() , aunque en teoría podría haberse resuelto con una dirección relativa.
Aquí está el desmontaje de ho ( objdump -d ho ), que contiene f() y g() . Puede ver que la llamada a g() aún no está resuelta:
ho: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <f>: 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: e8 00 00 00 00 callq 9 <f+0x9> 9: 90 nop a: 5d pop %rbp b: c3 retq 000000000000000c <g>: c: 55 push %rbp d: 48 89 e5 mov %rsp,%rbp 10: 90 nop 11: 5d pop %rbp 12: c3 retq Aquí está la tabla de reubicación de ho ( objdump -r ho ):
ho: file format elf64-x86-64 RELOCATION RECORDS FOR [.text]: OFFSET TYPE VALUE 0000000000000005 R_X86_64_PC32 g-0x0000000000000004 RELOCATION RECORDS FOR [.eh_frame]: OFFSET TYPE VALUE 0000000000000020 R_X86_64_PC32 .text 0000000000000058 R_X86_64_PC32 .text+0x000000000000000c Entonces, solo me preguntaba si había o no alguna forma de forzar que la reubicación se realizara a través de una dirección relativa durante un enlace parcial. Intenté compilar el código con -fpic , pero eso aún no provocó que se realizara la reubicación durante el enlace parcial.
Tenga en cuenta que no tengo ningún objetivo, aplicación o razón para esto. Simplemente explorando la funcionalidad y las capacidades de ld .
Según esta referencia , parece que la razón por la que los símbolos relativos no se resuelven es para dar más flexibilidad al enlace. Si en su lugar quisiéramos resolver el símbolo g en una dirección diferente, necesitaríamos cambiar esos saltos en el código.
Sin embargo, si cambia su símbolo g para que sea estático, el enlazador resolverá los saltos. En ese caso, el símbolo ya no se exporta y, por lo tanto, no puede ser manipulado por futuras llamadas del enlazador.