Linquedição

Linquedição

por José Coelho de Pina -
Número de respostas: 0

Salve,

O assunto deste tópico é o liqueditor (linker) e está relecionado com o tópico EP2 - SegFault com executável fornecido e imagem 1" criado pelo Vinícius e o tópico e o tópico Problemas ao executar ep2-linux criado pelo Renato.

Vou escrever um pouco, mas sugiro vocês darem uma lida na página

http://en.wikipedia.org/wiki/Linker_(computing)

e a "man page" do ld (ver abaixo).

Algumas mensagens de erro que aparecem quando invocamos o gcc não são do gcc.
Por exemplo,

meu_prompt> gcc  -Wl,--stack,16000000 main.o graphic.o imagem.o io.o -o ep2 -lGL -lGLU -lglut
/usr/bin/ld: unrecognized option '--stack'
/usr/bin/ld: use the --help option for usage information
collect2: error: ld returned 1 exit status
make: *** [ep2] Error 1

No Unix, em geral, o nome do programa que gera a mensagem aparece no início sa mensagem de erro.
Notem o /usr/bin/ld no começo da mensagem de erro "unrecognized...".
(A propósito, talvez seja bom você fazerem algo semelhante.
Quando houver uma mensagem de erro quem imprime avisa "Fui eu!: ...".)

Voltando, a mensagem anterior não foi gerada pelo gcc, mas sim pelo pelo ld, linker do Unix

http://en.wikipedia.org/wiki/GNU_linker

O processo de compilação verifica se o programa está sintaticamente correto e, se for o caso gera os chamados "object files".
Esse object files, que muitas vezes tem a extensão .o, não são arquivos executáveis.
Eles possuem referências às funções que não estão no arquivo fonte do seu programa (como scanf, fscanf. . .).
Um outro programa, o "linker" que no caso é o ld, é o responsável por criar o arquivo executável. Vejam

meu_prompt> man ld

LD(1)                                                      GNU Development Tools                                                     LD(1)

NAME
       ld - The GNU linker

SYNOPSIS
       ld [options] objfile ...

DESCRIPTION
       ld combines a number of object and archive files, relocates their data
       and ties up symbol references. Usually the last step in compiling a 
       program is to run ld.
[...]

Agora, sobre o -Wl,... a man page, l[a na frente diz:

    Note---if the linker is being invoked indirectly, via a compiler
    driver (e.g. gcc) then all the linker command line options should
    be prefixed by -Wl, (or whatever is appropriate for the particular
    compiler driver) like this:

                 gcc -Wl,--start-group foo.o bar.o -Wl,--end-group

    This is important, because otherwise ...

Resumindo, ainda não sei qual o problema em alterar o stack limit durante o processo de compilação/linquedição.