Como carregar símbolos definidos da biblioteca em um local especificado?

O teste é no Ubuntu 12.04, 32 bits, comgcc 4.6.3

Basicamente, estou fazendo algum trabalho de manipulação binária em binários ELF, e o que tenho que fazer agora é montar um programa de montagem e garantir que os símbolos libc sejam carregados em um endereço predefinido por mim.

Deixe-me elaborá-lo em um exemplo simples.

Suponha no código original, símbolos libcstdout@GLIBC_2.0 é usado.

#include <stdio.h>
int main() {
    FILE* fout = stdout;
    fprintf( fout, "hello\n" );
}

Quando eu compilar e verificar o endereço do símbolo usando estes comandos:

gcc main.c
readelf -s a.out | grep stdout

Eu tenho esse:

0804a020     4 OBJECT  GLOBAL DEFAULT   25 stdout@GLIBC_2.0 (2)
0804a020     4 OBJECT  GLOBAL DEFAULT   25 stdout@@GLIBC_2.0

e a.bss&nbsp;seção é assim:

  readelf -S a.out | grep bss
  [25] .bss              NOBITS          0804a020 001014 00000c 00  WA  0   0 32

Agora, o que estou tentando fazer é carregar ostdout&nbsp;símbolo em um endereço predefinido, então eu fiz isso:

echo "stdout = 0x804a024;" > symbolfile
gcc -Wl,--just-symbols=symbolfile  main.c

Então, quando eu checo o.bss&nbsp;seção e símbolostdout, Eu tenho esse:

 [25] .bss              NOBITS          0804a014 001014 000008 00  WA  0   0  4


4: 0804a024     0 NOTYPE  GLOBAL DEFAULT  ABS stdout
49: 0804a024     0 NOTYPE  GLOBAL DEFAULT  ABS stdout

Parece que não carreguei com sucesso o símbolostdout@@GLIBC_2.0, mas apenas um fiostdout. (Tentei escreverstdout@@GLIBC_2.0&nbsp;nosymbolfile, mas não pode compilar ...)

Parece que como não o fiz, o endereço inicial de.bss&nbsp;A seção também mudou, o que torna o endereço destdout&nbsp;símbolo em uma área sem seção. Durante o tempo de execução, gera uma falha de segmentação ao carregar de0x804a024.

Alguém poderia me ajudar sobre como carregar com êxito o símbolo da biblioteca em um endereço predefinido? Obrigado!