ld - O vinculador GNU
SINTAXE
ld [opções] arquivo_objeto ...
DESCRIÇÃO
ld combina vários arquivos de objeto e de arquivo, realoca seus dados e vincula referências de símbolos. Normalmente, a última etapa na compilação de um programa é executar ld.
ld aceita arquivos da Linguagem de Comando do Vinculador escritos em um superconjunto da sintaxe da Linguagem de Comando do Editor de Link da AT&T, para fornecer controle explícito e total sobre o processo de vinculação.
Esta página de manual não descreve a linguagem de comando; consulte a entrada ld em "info" para obter detalhes completos sobre a linguagem de comando e outros aspectos do vinculador GNU.
Esta versão de ld usa as bibliotecas BFD de propósito geral para operar em arquivos de objeto. Isso permite que ld leia, combine e grave arquivos de objeto em muitos formatos diferentes - por exemplo, COFF ou "a.out". Diferentes formatos podem ser vinculados para produzir qualquer tipo de arquivo de objeto disponível.
Além de sua flexibilidade, o vinculador GNU é mais útil do que outros vinculadores no fornecimento de informações de diagnóstico. Muitos vinculadores abandonam a execução imediatamente ao encontrar um erro; sempre que possível, ld continua executando, permitindo que você identifique outros erros (ou, em alguns casos, para obter um arquivo de saída, apesar do erro).
O vinculador GNU ld tem como objetivo cobrir uma ampla gama de situações e ser o mais compatível possível com outros vinculadores. Como resultado, você tem muitas opções para controlar seu comportamento.
OPÇÕES
O vinculador oferece uma infinidade de opções de linha de comando, mas, na prática, poucas delas são usadas em qualquer contexto específico. Por exemplo, um uso frequente de ld é vincular arquivos de objeto Unix padrão em um sistema Unix padrão com suporte. Em tal sistema, para vincular um arquivo "hello.o":
ld -o <arquivo_de_saída> /lib/crt0.o hello.o -lc
Isso diz a ld para produzir um arquivo chamado arquivo_de_saída como resultado da vinculação do arquivo "/lib/crt0.o" com "hello.o" e a biblioteca "libc.a", que virá dos diretórios de pesquisa padrão. (Consulte a discussão da opção -l abaixo.)
Algumas das opções de linha de comando para ld podem ser especificadas em qualquer ponto da linha de comando. No entanto, as opções que se referem a arquivos, como -l ou -T, fazem com que o arquivo seja lido no ponto em que a opção aparece na linha de comando, em relação aos arquivos de objeto e outras opções de arquivo. Repetir opções não relacionadas a arquivos com um argumento diferente terá nenhum efeito ou substituirá ocorrências anteriores (à esquerda na linha de comando) dessa opção. As opções que podem ser especificadas de forma significativa mais de uma vez são observadas nas descrições abaixo.
Os argumentos que não são opções são arquivos de objeto ou arquivos que devem ser vinculados. Eles podem seguir, preceder ou ser misturados com opções de linha de comando, exceto que um argumento de arquivo de objeto não pode ser colocado entre uma opção e seu argumento.
Normalmente, o vinculador é invocado com pelo menos um arquivo de objeto, mas você pode especificar outros tipos de arquivos binários de entrada usando -l, -R e o comando de script. Se nenhum arquivo binário de entrada for especificado, o vinculador não produzirá nenhuma saída e exibirá a mensagem "No input files".
Se o vinculador não conseguir reconhecer o formato de um arquivo de objeto, ele assumirá que é um script do vinculador. Um script especificado desta forma complementa o script principal do vinculador usado para a vinculação (seja o script do vinculador padrão ou o especificado usando -T). Esse recurso permite que o vinculador se vincule a um arquivo que parece ser um objeto ou um arquivo, mas que na verdade define apenas alguns valores de símbolos ou usa "INPUT" ou "GROUP" para carregar outros objetos. A especificação de um script desta forma apenas complementa o script principal do vinculador, com os comandos extras colocados após o script principal; use a opção -T para substituir completamente o script do vinculador padrão, mas observe o efeito do comando "INSERT".
Para opções cujos nomes são uma única letra, os argumentos da opção devem seguir a letra da opção sem espaço em branco ou serem fornecidos como argumentos separados imediatamente após a opção que os requer.
Para opções cujos nomes têm várias letras, um ou dois hífens podem preceder o nome da opção; por exemplo, -trace-symbol e --trace-symbol são equivalentes. Observe que há uma exceção a esta regra. Opções de várias letras que começam com uma letra 'o' minúscula só podem ser precedidas por dois hífens. Isso é para reduzir a confusão com a opção -o. Por exemplo, -omagic define o nome do arquivo de saída como magic, enquanto --omagic define o sinalizador NMAGIC na saída.
Os argumentos para opções de várias letras devem ser separados do nome da opção por um sinal de igual ou fornecidos como argumentos separados imediatamente após a opção que os requer. Por exemplo, --trace-symbol foo e --trace-symbol=foo são equivalentes. Abreviações únicas dos nomes das opções de várias letras são aceitas.
Observe que, se o vinculador estiver sendo invocado indiretamente, por meio de um driver do compilador (por exemplo, gcc), todas as opções da linha de comando do vinculador devem ser prefixadas com -Wl (ou qualquer outra coisa apropriada para o driver do compilador específico), como neste exemplo:
gcc -Wl,--start-group foo.o bar.o -Wl,--end-group
Isso é importante, porque, caso contrário, o programa do driver do compilador pode descartar silenciosamente as opções do vinculador, resultando em uma vinculação ruim. A confusão também pode surgir ao passar opções que exigem valores por meio de um driver, pois o uso de um espaço entre a opção e o argumento atua como um separador e faz com que o driver passe apenas a opção para o vinculador e o argumento para o compilador. Neste caso, é mais simples usar as formas unidas de opções de letra única e de várias letras, como:
gcc foo.o bar.o -Wl,-eENTRY -Wl,-Map=a.map
Aqui está uma tabela das opções genéricas de linha de comando aceitas pelo GNU linker:
@file
Lê opções de linha de comando do arquivo. As opções lidas são inseridas no lugar da opção original @file. Se o arquivo não existir ou não puder ser lido, a opção será tratada literalmente e não será removida.
As opções no arquivo são separadas por espaços em branco. Um caractere de espaço em branco pode ser incluído em uma opção, colocando toda a opção entre aspas simples ou duplas. Qualquer caractere (incluindo uma barra invertida) pode ser incluído, prefixando o caractere a ser incluído com uma barra invertida. O arquivo pode conter opções @file adicionais; quaisquer opções adicionais serão processadas recursivamente.
-a keyword
Esta opção é suportada para compatibilidade com HP/UX. O argumento keyword deve ser um dos strings archive, shared ou default. -aarchive é funcionalmente equivalente a -Bstatic, e as outras duas palavras-chave são funcionalmente equivalentes a -Bdynamic. Esta opção pode ser usada qualquer número de vezes.
--audit AUDITLIB
Adiciona AUDITLIB à entrada "DT_AUDIT" da seção dinâmica. AUDITLIB não é verificado para verificar se existe, nem usará o DT_SONAME especificado na biblioteca. Se especificado várias vezes, "DT_AUDIT" conterá uma lista separada por dois pontos de interfaces de auditoria a serem usadas. Se o linker encontrar um objeto com uma entrada de auditoria ao procurar bibliotecas compartilhadas, ele adicionará uma entrada "DT_DEPAUDIT" correspondente no arquivo de saída. Esta opção só é significativa em plataformas ELF que suportam a interface rtld-audit.
-b input-format
--format=input-format
ld pode ser configurado para suportar mais de um tipo de arquivo de objeto. Se o seu ld for configurado desta forma, você pode usar a opção -b para especificar o formato binário para os arquivos de objeto de entrada que seguem esta opção na linha de comando. Mesmo quando ld é configurado para suportar formatos de objeto alternativos, você normalmente não precisa especificar isso, pois ld deve ser configurado para esperar como um formato de entrada padrão, o formato mais comum em cada máquina. input-format é uma string de texto, o nome de um formato específico suportado pelas bibliotecas BFD. (Você pode listar os formatos binários disponíveis com objdump -i.)
Você pode querer usar esta opção se estiver vinculando arquivos com um formato binário incomum. Você também pode usar -b para alternar formatos explicitamente (ao vincular arquivos de objeto de formatos diferentes), incluindo -b input-format antes de cada grupo de arquivos de objeto em um formato específico.
O formato padrão é retirado da variável de ambiente "GNUTARGET".
Você também pode definir o formato de entrada a partir de um script, usando o comando "TARGET";
-c MRI-commandfile
--mri-script=MRI-commandfile
Para compatibilidade com linkers produzidos por MRI, ld aceita arquivos de script escritos em uma linguagem de comando alternativa e restrita, descrita na seção Arquivos de Script Compatíveis com MRI da documentação do GNU ld. Introduza arquivos de script MRI com a opção -c; use a opção -T para executar scripts de linker escritos na linguagem de script de uso geral do ld. Se MRI-cmdfile não existir, ld procura por ele nos diretórios especificados por quaisquer opções -L.
-d
-dc
-dp Essas três opções são equivalentes; várias formas são suportadas para compatibilidade com outros
ligadores. Elas atribuem espaço a símbolos comuns, mesmo que um arquivo de saída relocável seja especificado
(com -r). O comando de script "FORCE_COMMON_ALLOCATION" tem o mesmo efeito.
--depaudit AUDITLIB
-P AUDITLIB
Adiciona AUDITLIB à entrada "DT_DEPAUDIT" da seção dinâmica. AUDITLIB não é verificada quanto à
existência, nem usará o DT_SONAME especificado na biblioteca. Se especificada várias vezes,
"DT_DEPAUDIT" conterá uma lista separada por dois pontos de interfaces de auditoria a serem usadas.
Esta opção é significativa apenas em plataformas ELF que suportam a interface rtld-audit. A opção -P
é fornecida para compatibilidade com Solaris.
--enable-linker-version
Habilita a diretiva de script do ligador "LINKER_VERSION", descrita em Dados da Seção de Saída. Se
esta diretiva for usada em um script do ligador e esta opção tiver sido habilitada, uma string
contendo a versão do ligador será inserida no ponto atual.
Note - a localização desta opção na linha de comando do ligador é significativa. Ela afetará apenas
scripts do ligador que vêm depois dela na linha de comando, ou que são integrados ao ligador.
--disable-linker-version
Desabilita a diretiva de script do ligador "LINKER_VERSION", para que ela não insira uma string de
versão. Esta é a configuração padrão.
--enable-non-contiguous-regions
Esta opção evita gerar um erro se uma seção de entrada não se ajustar a uma seção de saída
correspondente. O ligador tenta alocar a seção de entrada para subsequentes seções de saída
correspondentes e gera um erro somente se nenhuma seção de saída for grande o suficiente. Isso é
útil quando várias regiões de memória não contíguas estão disponíveis e a seção de entrada não
requer uma em particular. A ordem na qual as seções de entrada são avaliadas não muda, por exemplo:
MEMORY {
MEM1 (rwx) : ORIGIN = 0x1000, LENGTH = 0x14
MEM2 (rwx) : ORIGIN = 0x1000, LENGTH = 0x40
MEM3 (rwx) : ORIGIN = 0x2000, LENGTH = 0x40
}
SECTIONS {
mem1 : { *(.data.*); } > MEM1
mem2 : { *(.data.*); } > MEM2
mem3 : { *(.data.*); } > MEM3
}
com seções de entrada:
.data.1: tamanho 8
.data.2: tamanho 0x10
.data.3: tamanho 4
resulta em .data.1 afetada a mem1, e .data.2 e .data.3
afetadas a mem2, mesmo que .data.3 coubesse em mem3.
Esta opção é incompatível com as instruções INSERT porque altera a maneira como as seções de entrada
são mapeadas para as seções de saída.
--enable-non-contiguous-regions-warnings
Esta opção habilita avisos quando "--enable-non-contiguous-regions" permite correspondências
possivelmente inesperadas no mapeamento de seções, o que pode levar a descartar silenciosamente uma
seção em vez de falhar porque ela não se ajusta a nenhuma região de saída.
-e entry
--entry=entry
Usa `entry` como o símbolo explícito para iniciar a execução do seu programa, em vez do ponto de entrada padrão. Se não houver um símbolo chamado `entry`, o vinculador tentará analisar `entry` como um número e usá-lo como o endereço de entrada (o número será interpretado em base 10; você pode usar um `0x` inicial para base 16 ou um `0` inicial para base 8). Para i386 PE, `entry` também pode ser o nome original da função (sem o sublinhado inicial e/ou o sufixo `stdcall @number`, quando aplicável).
--exclude-libs lib,lib,...
Especifica uma lista de bibliotecas de arquivo das quais os símbolos não devem ser exportados automaticamente. Os nomes das bibliotecas podem ser delimitados por vírgulas ou dois pontos. Especificar `--exclude-libs ALL` exclui os símbolos de todas as bibliotecas de arquivo da exportação automática. Esta opção está disponível apenas para a porta i386 PE do vinculador e para as portas direcionadas ao ELF. Para i386 PE, os símbolos listados explicitamente em um arquivo `.def` ainda são exportados, independentemente desta opção. Para as portas direcionadas ao ELF, os símbolos afetados por esta opção serão tratados como ocultos.
--exclude-modules-for-implib module,module,...
Especifica uma lista de arquivos de objeto ou membros de arquivo, dos quais os símbolos não devem ser exportados automaticamente, mas que devem ser copiados integralmente para a biblioteca de importação que está sendo gerada durante a vinculação. Os nomes dos módulos podem ser delimitados por vírgulas ou dois pontos e devem corresponder exatamente aos nomes de arquivo usados pelo `ld` para abrir os arquivos; para membros de arquivo, este é simplesmente o nome do membro, mas para arquivos de objeto, o nome listado deve incluir e corresponder precisamente a qualquer caminho usado para especificar o arquivo de entrada na linha de comando do vinculador. Esta opção está disponível apenas para a porta i386 PE do vinculador. Os símbolos listados explicitamente em um arquivo `.def` ainda são exportados, independentemente desta opção.
-E
--export-dynamic
--no-export-dynamic
Ao criar um executável dinamicamente vinculado, usar a opção `-E` ou a opção `--export-dynamic` faz com que o vinculador adicione todos os símbolos à tabela de símbolos dinâmicos. A tabela de símbolos dinâmicos é o conjunto de símbolos que são visíveis a partir de objetos dinâmicos em tempo de execução.
Se você não usar nenhuma dessas opções (ou usar a opção `--no-export-dynamic` para restaurar o comportamento padrão), a tabela de símbolos dinâmicos normalmente conterá apenas os símbolos que são referenciados por algum objeto dinâmico mencionado na vinculação.
Se você usar `dlopen` para carregar um objeto dinâmico que precisa se referir aos símbolos definidos pelo programa, em vez de algum outro objeto dinâmico, então você provavelmente precisará usar esta opção ao vincular o próprio programa.
Você também pode usar a lista dinâmica para controlar quais símbolos devem ser adicionados à tabela de símbolos dinâmicos, se o formato de saída suportar. Consulte a descrição de `--dynamic-list`.
Observe que esta opção é específica para as portas que usam ELF. As plataformas PE suportam uma função semelhante para exportar todos os símbolos de uma DLL ou EXE; consulte a descrição de --export-all-symbols abaixo.
^ -export-dynamic-symbol=glob
Ao criar um executável dinamicamente vinculado, os símbolos que corresponderem a glob serão adicionados à tabela de símbolos dinâmicos. Ao criar uma biblioteca compartilhada, as referências aos símbolos que corresponderem a glob não serão vinculadas às definições dentro da biblioteca compartilhada. Esta opção é inoperante ao criar uma biblioteca compartilhada e se -Bsymbolic ou --dynamic-list não forem especificados. Esta opção só é significativa em plataformas ELF que suportam bibliotecas compartilhadas.
^ -export-dynamic-symbol-list=file
Especifique um --export-dynamic-symbol para cada padrão no arquivo. O formato do arquivo é o mesmo do nó de versão sem escopo e nome do nó. Consulte VERSÃO para obter mais informações.
^ EB Vincule objetos big-endian. Isso afeta o formato de saída padrão.
^ EL Vincule objetos little-endian. Isso afeta o formato de saída padrão.
^ f name
^ -auxiliary=name
Ao criar um objeto compartilhado ELF, defina o campo interno DT_AUXILIARY para o nome especificado. Isso informa ao vinculador dinâmico que a tabela de símbolos do objeto compartilhado deve ser usada como um filtro auxiliar na tabela de símbolos do nome do objeto compartilhado.
Se você vincular posteriormente um programa a este objeto de filtro, então, quando você executar o programa, o vinculador dinâmico verá o campo DT_AUXILIARY. Se o vinculador dinâmico resolver quaisquer símbolos do objeto de filtro, ele primeiro verificará se existe uma definição no objeto compartilhado nomeado. Se houver, ele será usado em vez da definição no objeto de filtro. O objeto compartilhado nomeado não precisa existir. Assim, o objeto compartilhado nomeado pode ser usado para fornecer uma implementação alternativa de certas funções, talvez para depuração ou para desempenho específico da máquina.
Esta opção pode ser especificada mais de uma vez. As entradas DT_AUXILIARY serão criadas na ordem em que aparecem na linha de comando.
^ F name
^ -filter=name
Ao criar um objeto compartilhado ELF, defina o campo interno DT_FILTER para o nome especificado. Isso informa ao vinculador dinâmico que a tabela de símbolos do objeto compartilhado que está sendo criado deve ser usada como um filtro na tabela de símbolos do objeto compartilhado nomeado.
Se você vincular posteriormente um programa a este objeto de filtro, então, quando você executar o programa, o vinculador dinâmico verá o campo DT_FILTER. O vinculador dinâmico resolverá os símbolos de acordo com a tabela de símbolos do objeto de filtro, mas, na verdade, vinculará às definições encontradas no objeto compartilhado nomeado. Assim, o objeto de filtro pode ser usado para selecionar um subconjunto dos símbolos fornecidos pelo objeto nomeado.
Alguns vinculadores mais antigos usavam a opção -F em toda a cadeia de ferramentas de compilação para especificar o formato de arquivo de objeto para arquivos de objeto de entrada e saída. O vinculador GNU usa outros mecanismos para este propósito: as opções -b, --format, --oformat, o comando TARGET nos scripts do vinculador e a variável de ambiente GNUTARGET. O vinculador GNU ignorará a opção -F quando não estiver criando um objeto compartilhado ELF.
-fini=name
Quando estiver criando um executável ELF ou objeto compartilhado, chame NAME quando o executável ou objeto compartilhado for descarregado, definindo DT_FINI para o endereço da função. Por padrão, o vinculador usa "_fini" como a função a ser chamada.
-g Ignorado. Fornecido para compatibilidade com outras ferramentas.
-G value
--gpsize=value
Define o tamanho máximo dos objetos a serem otimizados usando o registro GP para o tamanho especificado. Isso é significativo apenas para formatos de arquivo de objeto, como MIPS ELF, que suportam a colocação de objetos grandes e pequenos em seções diferentes. Isso é ignorado para outros formatos de arquivo de objeto.
-h name
-soname=name
Ao criar um objeto compartilhado ELF, define o campo interno DT_SONAME para o nome especificado. Quando um executável é vinculado a um objeto compartilhado que possui um campo DT_SONAME, então, quando o executável é executado, o vinculador dinâmico tentará carregar o objeto compartilhado especificado pelo campo DT_SONAME, em vez de usar o nome do arquivo fornecido ao vinculador.
-i Realiza uma vinculação incremental (o mesmo que a opção -r).
-init=name
Quando estiver criando um executável ELF ou objeto compartilhado, chame NAME quando o executável ou objeto compartilhado for carregado, definindo DT_INIT para o endereço da função. Por padrão, o vinculador usa "_init" como a função a ser chamada.
-l namespec
--library=namespec
Adiciona o arquivo de arquivo ou objeto especificado por namespec à lista de arquivos a serem vinculados. Esta opção pode ser usada várias vezes. Se namespec estiver no formato :filename, ld pesquisará o caminho da biblioteca por um arquivo chamado filename; caso contrário, pesquisará o caminho da biblioteca por um arquivo chamado libnamespec.a.
Em sistemas que suportam bibliotecas compartilhadas, ld também pode pesquisar arquivos diferentes de libnamespec.a. Especificamente, em sistemas ELF e SunOS, ld pesquisará um diretório por uma biblioteca chamada libnamespec.so antes de pesquisar por uma chamada libnamespec.a. (Por convenção, uma extensão ".so" indica uma biblioteca compartilhada.) Observe que este comportamento não se aplica a :filename, que sempre especifica um arquivo chamado filename.
O vinculador pesquisará um arquivo apenas uma vez, no local em que é especificado na linha de comando. Se o arquivo definir um símbolo que estava indefinido em algum objeto que apareceu antes do arquivo na linha de comando, o vinculador incluirá os arquivos apropriados do arquivo. No entanto, um símbolo indefinido em um objeto que aparece posteriormente na linha de comando não fará com que o vinculador pesquise o arquivo novamente.
Veja a opção -( para uma maneira de forçar o vinculador a pesquisar arquivos várias vezes.
Você pode listar o mesmo arquivo várias vezes na linha de comando.
Este tipo de pesquisa de arquivo é padrão para vinculadores Unix. No entanto, se você estiver usando ld no AIX, observe que é diferente do comportamento do vinculador AIX.
-L searchdir
--library-path=searchdir
Adiciona o caminho searchdir à lista de caminhos que o ld usará para procurar bibliotecas de arquivo e scripts de controle do ld. Você pode usar esta opção várias vezes. Os diretórios são pesquisados na ordem em que são especificados na linha de comando. Os diretórios especificados na linha de comando são pesquisados antes dos diretórios padrão. Todas as opções -L se aplicam a todas as opções -l, independentemente da ordem em que as opções aparecem. As opções -L não afetam como o ld procura um script de vinculação, a menos que a opção -T seja especificada.
Se searchdir começar com "=" ou $SYSROOT, esse prefixo será substituído pelo prefixo sysroot, controlado pela opção --sysroot ou especificado quando o vinculador é configurado.
O conjunto padrão de caminhos pesquisados (sem serem especificados com -L) depende de qual modo de emulação o ld está usando e, em alguns casos, também de como ele foi configurado.
Os caminhos também podem ser especificados em um script de vinculação com o comando "SEARCH_DIR". Os diretórios especificados desta forma são pesquisados no ponto em que o script de vinculação aparece na linha de comando.
-m emulation
Emula o vinculador de emulação. Você pode listar as emulações disponíveis com as opções --verbose ou -V.
Se a opção -m não for usada, a emulação é obtida da variável de ambiente "LDEMULATION", se ela estiver definida.
Caso contrário, a emulação padrão depende de como o vinculador foi configurado.
--remap-inputs=pattern=filename
--remap-inputs-file=file
Essas opções permitem que os nomes dos arquivos de entrada sejam alterados antes que o vinculador tente abri-los. A opção --remap-inputs=foo.o=bar.o fará com que qualquer tentativa de carregar um arquivo chamado foo.o tente carregar, em vez disso, um arquivo chamado bar.o. Padrões curinga são permitidos no primeiro nome de arquivo, então --remap-inputs=foo*.o=bar.o renomeará qualquer arquivo de entrada que corresponda a foo*.o para bar.o.
Uma forma alternativa da opção --remap-inputs-file=filename permite que os remapeamentos sejam lidos de um arquivo. Cada linha do arquivo pode conter um único remapeamento. Linhas em branco são ignoradas. Qualquer coisa de um caractere de hash (#) até o final de uma linha é considerada um comentário e também é ignorada. O padrão de mapeamento pode ser separado do nome do arquivo por espaço em branco ou por um caractere de igual (=).
As opções podem ser especificadas várias vezes. O conteúdo delas é acumulado. Os remapeamentos serão processados na ordem em que aparecem na linha de comando e, se vierem de um arquivo, na ordem em que aparecem no arquivo. Se uma correspondência for encontrada, nenhuma verificação adicional para esse nome de arquivo será executada.
Se o nome do arquivo de substituição for /dev/null ou apenas NUL, o remapeamento fará com que o arquivo de entrada seja efetivamente ignorado. Esta pode ser uma maneira conveniente de experimentar remover arquivos de entrada de um ambiente de construção complicado.
Observe que esta opção depende da posição e afeta apenas os nomes de arquivos que aparecem após ela na linha de comando. Assim:
ld foo.o --remap-inputs=foo.o=bar.o
Não terá efeito, enquanto:
ld --remap-inputs=foo.o=bar.o foo.o
Renomeará o arquivo de entrada foo.o para bar.o.
Observe que essas opções também afetam os arquivos referenciados pelas instruções INPUT nos scripts do vinculador. No entanto, como os scripts do vinculador são processados após a leitura de toda a linha de comando, a posição das opções de remapeamento na linha de comando não é significativa.
Se a opção verbose estiver habilitada, quaisquer mapeamentos correspondentes serão relatados, embora, novamente, a opção verbose precise ser habilitada na linha de comando antes que os nomes de arquivo remapeados apareçam.
Se as opções -Map ou --print-map estiverem habilitadas, a lista de remapeamento será incluída na saída do mapa.
-M
--print-map
Imprime um mapa de vinculação para a saída padrão. Um mapa de vinculação fornece informações sobre a vinculação, incluindo o seguinte:
Onde os arquivos de objeto são mapeados na memória.
Como os símbolos comuns são alocados.
Todos os membros de arquivo incluídos na vinculação, com uma menção do símbolo que causou a inclusão do membro do arquivo.
Os valores atribuídos aos símbolos.
Observe que os símbolos cujos valores são calculados por uma expressão que envolve uma referência a um valor anterior do mesmo símbolo podem não ter o resultado correto exibido no mapa de vinculação. Isso ocorre porque o vinculador descarta resultados intermediários e retém apenas o valor final de uma expressão. Em tais circunstâncias, o vinculador exibirá o valor final entre colchetes. Assim, por exemplo, um script de vinculador contendo:
foo = 1
foo = foo * 4
foo = foo + 8
produzirá a seguinte saída no mapa de vinculação se a opção -M for usada:
000000001 foo = 0x1
[0x0000000c] foo = (foo * 0x4)
[0x0000000c] foo = (foo + 0x8)
Veja Expressões para mais informações sobre expressões em scripts do vinculador.
Como as propriedades GNU são mescladas.
Quando o vinculador mescla seções de entrada .note.gnu.property em uma única seção de saída .note.gnu.property, algumas propriedades são removidas ou atualizadas. Essas ações são relatadas no mapa de vinculação. Por exemplo:
Propriedade removida 0xc0000002 para mesclar foo.o (0x1) e bar.o (não encontrado)
Isso indica que a propriedade 0xc0000002 é removida da saída ao mesclar propriedades em foo.o, cuja propriedade 0xc0000002 tem o valor 0x1, e bar.o, que não tem a propriedade 0xc0000002.
Propriedade atualizada 0xc0010001 (0x1) para mesclar foo.o (0x1) e bar.o (0x1)
Isso indica que o valor da propriedade 0xc0010001 é atualizado para 0x1 na saída ao mesclar propriedades em foo.o, cuja propriedade 0xc0010001 tem o valor 0x1, e bar.o, cuja propriedade 0xc0010001 tem o valor 0x1.
Em alguns alvos ELF, uma lista de correções inseridas por --relax
foo.o: Ajustando o desvio em 0x00000008 para "far" na seção .text
Isso indica que o desvio em 0x00000008 em foo.o, que tem como alvo o símbolo "far" na seção .text, foi substituído por um trampolim.
--print-map-discarded
--no-print-map-discarded
Imprime (ou não) a lista de seções descartadas e coletadas pelo coletor de lixo no mapa de ligação. Ativado por padrão.
--print-map-locals
--no-print-map-locals
Imprime (ou não) os símbolos locais no mapa de ligação. Os símbolos locais terão o texto
(local) impresso antes de seu nome e serão listados após todos os símbolos globais em uma
seção específica. Os símbolos locais temporários (normalmente aqueles que começam com .L) não serão
incluídos na saída. Desativado por padrão.
-n
--nmagic
Desativa o alinhamento de página das seções e desabilita a ligação a bibliotecas compartilhadas. Se o formato de saída suportar números mágicos no estilo Unix, marca a saída como "NMAGIC".
-N
--omagic
Define as seções de texto e dados como legíveis e graváveis. Além disso, não alinha a seção de dados na página e desabilita a ligação a bibliotecas compartilhadas. Se o formato de saída suportar números mágicos no estilo Unix, marca a saída como "OMAGIC". Observação: embora uma seção de texto gravável seja permitida para destinos PE-COFF, ela não está em conformidade com a especificação de formato publicada pela Microsoft.
--no-omagic
Esta opção anula a maioria dos efeitos da opção -N. Ela define a seção de texto como somente leitura e força o alinhamento da seção de dados na página. Observação: esta opção não habilita a ligação a bibliotecas compartilhadas. Use -Bdynamic para isso.
-o output
--output=output
Usa output como o nome do programa produzido por ld; se esta opção não for especificada, o
nome a.out será usado por padrão. O comando de script "OUTPUT" também pode especificar o nome do arquivo de saída.
Observação: o vinculador excluirá o arquivo de saída antes de começar a gravar nele. Ele fará isso mesmo se, por algum motivo, a ligação não puder ser concluída devido a erros.
Observação: o vinculador verificará para garantir que o nome do arquivo de saída não corresponda ao nome de nenhum dos arquivos de entrada, mas é só isso. Em particular, ele não reclamará se o arquivo de saída puder sobrescrever um arquivo de origem ou algum outro arquivo importante. Portanto, em sistemas de construção, é recomendado usar a opção -o como a última opção na linha de comando do vinculador. Por exemplo, considere:
ld -o $(EXE) $(OBJS)
ld $(OBJS) -o $(EXE)
Se a variável EXE não estiver definida por algum motivo, a primeira versão do comando do vinculador poderá acabar excluindo um dos arquivos de objeto (o primeiro na lista OBJS), enquanto a segunda versão do comando do vinculador gerará uma mensagem de erro e não excluirá nada.
--dependency-file=depfile
Escreve um arquivo de dependência para depfile. Este arquivo contém uma regra adequada para o "make" que descreve
o arquivo de saída e todos os arquivos de entrada que foram lidos para produzi-lo. A saída é
semelhante à saída do compilador com -M -MP. Observe que não há uma opção como a do compilador -MM,
para excluir os "arquivos de sistema" (que não é um conceito bem definido no vinculador, ao contrário
de "arquivos de cabeçalho do sistema" no compilador). Portanto, a saída de --dependency-file é sempre específica
do estado exato da instalação em que foi produzida e não deve ser copiada para arquivos Makefile distribuídos sem edição cuidadosa.
-O level
Se level for um valor numérico maior que zero, o ld otimiza a saída. Isso pode levar um tempo significativamente maior e, portanto, provavelmente só deve ser habilitado para o binário final. No momento, esta opção afeta apenas a geração de bibliotecas compartilhadas ELF. As versões futuras do vinculador podem fazer mais uso desta opção. Além disso, atualmente não há diferença no comportamento do vinculador para diferentes valores não nulos desta opção. Isso também pode mudar em versões futuras.
-plugin name
Envolve um plugin no processo de vinculação. O parâmetro name é o nome absoluto do arquivo do plugin. Normalmente, este parâmetro é adicionado automaticamente pelo compilador, ao usar a otimização em tempo de vinculação, mas os usuários também podem adicionar seus próprios plugins, se desejarem.
Observe que o local dos plugins originados do compilador é diferente do local onde os programas
ar, nm e ranlib procuram seus plugins. Para que esses comandos usem um plugin baseado em compilador,
ele deve primeiro ser copiado para o diretório ${libdir}/bfd-plugins. Todos os plugins do vinculador
baseados em gcc são retrocompatíveis, portanto, é suficiente apenas copiar o mais recente.
--push-state
O comando --push-state permite preservar o estado atual das flags que governam o tratamento de arquivos de entrada para que possam ser todos restaurados com um comando --pop-state correspondente.
As opções cobertas são: -Bdynamic, -Bstatic, -dn, -dy, -call\_shared, -non\_shared, -static,
-N, -n, --whole-archive, --no-whole-archive, -r, -Ur, --copy-dt-needed-entries,
--no-copy-dt-needed-entries, --as-needed, --no-as-needed e -a.
Um dos objetivos desta opção são as especificações para pkg-config. Quando usado com a opção
--libs, todas as bibliotecas possivelmente necessárias são listadas e, em seguida, possivelmente
vinculadas o tempo todo. É melhor retornar algo como o seguinte:
-Wl,--push-state,--as-needed -libone -libtwo -Wl,--pop-state
--pop-state
Desfaz o efeito de --push-state, restaura os valores anteriores das flags que governam o tratamento de arquivos de entrada.
-q
--emit-relocs
Deixa as seções e conteúdos de relocação em executáveis totalmente vinculados. Ferramentas de análise e otimização pós-vinculação podem precisar dessas informações para realizar modificações corretas nos executáveis. Isso resulta em executáveis maiores.
Esta opção é atualmente suportada apenas em plataformas ELF.
--force-dynamic
Força o arquivo de saída a ter seções dinâmicas. Esta opção é específica para destinos VxWorks.
-r
--relocatable
Gera uma saída relocável, ou seja, gera um arquivo de saída que, por sua vez, pode ser usado como entrada para ld. Isso é frequentemente chamado de vinculação parcial. Como efeito colateral, em ambientes que suportam números mágicos Unix padrão, esta opção também define o número mágico do arquivo de saída para "OMAGIC". Se esta opção não for especificada, um arquivo absoluto será produzido. Ao vincular programas C++, esta opção não resolverá referências a construtores; para fazer isso, use -Ur.
Quando um arquivo de entrada não tem o mesmo formato do arquivo de saída, o link parcial é suportado apenas se esse arquivo de entrada não contiver nenhuma realocação. Diferentes formatos de saída podem ter restrições adicionais; por exemplo, alguns formatos baseados em "a.out" não suportam o link parcial com arquivos de entrada em outros formatos.
Quando a saída relocável contém conteúdo que requer otimização de tempo de link (LTO) e conteúdo que não requer LTO, uma seção .gnu_object_only será criada para conter um arquivo de objeto relocável, como se -r fosse aplicado a todos os arquivos de entrada relocáveis que não requerem LTO. Ao processar um arquivo de entrada relocável com uma seção .gnu_object_only, o vinculador extrairá a seção .gnu_object_only como uma entrada separada.
Observe que, como -r agrupa algumas seções de diferentes arquivos de entrada, pode haver impactos negativos no tamanho do código e na localidade no executável ou biblioteca compartilhada final.
Esta opção faz a mesma coisa que -i.
-R filename
--just-symbols=filename
Leia os nomes dos símbolos e seus endereços do arquivo especificado, mas não o realoque nem o inclua na saída. Isso permite que seu arquivo de saída se refira simbolicamente a locais absolutos de memória definidos em outros programas. Você pode usar esta opção mais de uma vez.
Para compatibilidade com outros vinculadores ELF, se a opção -R for seguida por um nome de diretório, em vez de um nome de arquivo, ela será tratada como a opção -rpath.
--rosegment
--no-rosegment
Tente garantir que apenas um único segmento somente leitura, não de código, seja criado. Útil apenas quando usado em conjunto com a opção -z separate-code. Os binários resultantes devem ser menores do que se -z separate-code for usado sozinho. Sem esta opção, ou se --no-rosegment for especificado, a opção -z separate-code criará dois segmentos somente leitura, um antes do segmento de código e outro depois.
Os nomes das opções são enganosos, mas foram escolhidos para que o vinculador seja compatível com os vinculadores LLD e GOLD.
Estas opções são suportadas apenas por destinos ELF.
-s
--strip-all
Omita todas as informações de símbolos do arquivo de saída.
-S
--strip-debug
Omita as informações de símbolos do depurador (mas não todos os símbolos) do arquivo de saída.
--strip-discarded
--no-strip-discarded
Omita (ou não omita) os símbolos globais definidos em seções descartadas. Ativado por padrão.
-plugin-save-temps
Armazene permanentemente os arquivos "temporários" intermediários do plugin.
-t
--trace
Imprima os nomes dos arquivos de entrada enquanto o ld os processa. Se -t for fornecido duas vezes, os membros dentro dos arquivos também serão impressos. A saída de -t é útil para gerar uma lista de todos os arquivos de objeto e scripts envolvidos na vinculação, por exemplo, ao preparar arquivos para um relatório de bug do vinculador.
-T scriptfile
--script=scriptfile
Utiliza scriptfile como o script do vinculador. Este script substitui o script padrão do vinculador (em vez de adicioná-lo), a menos que o script contenha "INSERT", então o arquivo de comando deve especificar tudo o que for necessário para descrever o arquivo de saída.
Se scriptfile não existir no diretório atual, "ld" procura por ele nos diretórios especificados por quaisquer opções -L precedentes.
As opções da linha de comando que aparecem antes da opção -T podem afetar o script, mas as opções da linha de comando que aparecem depois dele não.
Várias opções -T serão acumuladas se estiverem aumentando o script atual; caso contrário, a última opção -T não aumentativa será usada.
Existem outras maneiras de especificar scripts de vinculador. Veja:
-dT scriptfile
--default-script=scriptfile
Utiliza scriptfile como o script padrão do vinculador.
Esta opção é semelhante à opção --script, exceto que o processamento do script é adiado até que o restante da linha de comando seja processado. Isso permite que as opções colocadas após a opção --default-script na linha de comando afetem o comportamento do script do vinculador, o que pode ser importante quando a linha de comando do vinculador não pode ser controlada diretamente pelo usuário (por exemplo, porque a linha de comando está sendo construída por outra ferramenta, como gcc).
-u symbol
--undefined=symbol
Força o símbolo a ser inserido no arquivo de saída como um símbolo indefinido. Fazer isso pode, por exemplo, acionar a vinculação de módulos adicionais das bibliotecas padrão. -u pode ser repetido com argumentos de opção diferentes para inserir símbolos indefinidos adicionais. Esta opção é equivalente ao comando "EXTERN" do script do vinculador.
Se esta opção estiver sendo usada para forçar a inclusão de módulos adicionais na vinculação e se for um erro para o símbolo permanecer indefinido, então a opção --require-defined deve ser usada em vez disso.
--require-defined=symbol
Exige que o símbolo seja definido no arquivo de saída. Esta opção é a mesma que a opção --undefined, exceto que, se o símbolo não estiver definido no arquivo de saída, o vinculador emitirá um erro e será encerrado. O mesmo efeito pode ser alcançado em um script do vinculador usando "EXTERN", "ASSERT" e "DEFINED" juntos. Esta opção pode ser usada várias vezes para exigir símbolos adicionais.
-Ur Para programas que não usam construtores ou destrutores, ou para sistemas baseados em ELF, esta opção é equivalente a -r: ela gera uma saída relocalizável, ou seja, um arquivo de saída que pode, por sua vez, servir como entrada para ld. Para outros binários, no entanto, a opção -Ur é semelhante a -r, mas também resolve referências a construtores e destrutores.
Para aqueles sistemas onde -r e -Ur se comportam de maneira diferente, não funciona usar -Ur em arquivos que foram vinculados com -Ur; uma vez que a tabela do construtor foi criada, ela não pode ser adicionada. Use -Ur apenas para a vinculação parcial final e -r para as outras.
--orphan-handling=MODE
Controla como as seções órfãs são tratadas. Uma seção órfã é aquela que não é especificamente mencionada em um script de linker.
MODE pode ter qualquer um dos seguintes valores:
"place"
As seções órfãs são colocadas em uma seção de saída adequada, seguindo a estratégia descrita em Seções Órfãs. A opção --unique também afeta como as seções são colocadas.
"discard"
Todas as seções órfãs são descartadas, colocando-as na seção /DISCARD/.
"warn"
O linker colocará a seção órfã como em "place" e também emitirá um aviso.
"error"
O linker sairá com um erro se alguma seção órfã for encontrada.
O padrão, se --orphan-handling não for fornecido, é "place".
--unique[=SECTION]
Cria uma seção de saída separada para cada seção de entrada que corresponda a SECTION, ou se o argumento de curinga SECTION for opcionalmente omitido, para cada seção de entrada órfã. Uma seção órfã é aquela que não é especificamente mencionada em um script de linker. Você pode usar esta opção várias vezes na linha de comando; ela impede a mesclagem normal de seções de entrada com o mesmo nome, substituindo as atribuições de seção de saída em um script de linker.
-v
--version
-V Exibe o número da versão do ld. A opção -V também lista as emulações suportadas. Veja também a
descrição de --enable-linker-version em Opções, Opções da Linha de Comando, que pode ser usada para
inserir a string da versão do linker em um binário.
-x
--discard-all
Exclui todos os símbolos locais.
-X
--discard-locals
Exclui todos os símbolos locais temporários. (Esses símbolos começam com prefixos de rótulos locais específicos do sistema, normalmente .L para sistemas ELF ou L para sistemas tradicionais a.out).
-y symbol
--trace-symbol=symbol
Imprime o nome de cada arquivo vinculado no qual o símbolo aparece. Esta opção pode ser fornecida várias vezes. Em muitos sistemas, é necessário preceder com um sublinhado.
Esta opção é útil quando você tem um símbolo indefinido em seu link, mas não sabe de onde
vem a referência.
-Y path
Adiciona um caminho ao caminho de pesquisa de biblioteca padrão. Esta opção existe para compatibilidade com Solaris.
-z keyword
As palavras-chave reconhecidas são:
call-nop=prefix-addr
call-nop=suffix-nop
call-nop=prefix-byte
call-nop=suffix-byte
Especifica o preenchimento de 1 byte "NOP" ao transformar uma chamada indireta para uma função definida localmente, foo, através de seu slot GOT. call-nop=prefix-addr gera "0x67 call foo". call-nop=suffix-nop gera "call foo 0x90". call-nop=prefix-byte gera "byte call foo". call-nop=suffix-byte gera "call foo byte". Suportado para i386 e x86_64.
cet-report=none
cet-report=warning
cet-report=error
Especifica como relatar as propriedades ausentes GNU_PROPERTY_X86_FEATURE_1_IBT e GNU_PROPERTY_X86_FEATURE_1_SHSTK na seção .note.gnu.property de entrada. cet-report=none, que é o padrão, fará com que o linker não relate propriedades ausentes em arquivos de entrada. cet-report=warning fará com que o linker emita um aviso para propriedades ausentes em arquivos de entrada. cet-report=error fará com que o linker emita um erro para propriedades ausentes em arquivos de entrada. Observe que ibt desativará o relatório da propriedade ausente GNU_PROPERTY_X86_FEATURE_1_IBT e shstk desativará o relatório da propriedade ausente GNU_PROPERTY_X86_FEATURE_1_SHSTK. Suportado para Linux/i386 e Linux/x86_64.
combreloc
nocombreloc
Combina várias seções de realocação dinâmica e as ordena para melhorar o cache de pesquisa de símbolos dinâmicos. Não faça isso se nocombreloc.
common
nocommon
Gera símbolos comuns com tipo STT_COMMON durante uma ligação relocalizável. Use o tipo STT_OBJECT se nocommon.
common-page-size=valor
Define o tamanho da página mais comumente usada para o valor especificado. O layout da imagem de memória será otimizado para minimizar as páginas de memória se o sistema estiver usando páginas deste tamanho.
defs
Relata referências de símbolos não resolvidos de arquivos de objeto regulares. Isso é feito mesmo que o vinculador esteja criando uma biblioteca compartilhada não simbólica. Esta opção é o inverso de -z undefs.
dynamic-undefined-weak
nodynamic-undefined-weak
Torna os símbolos fracos não definidos dinâmicos ao construir um objeto dinâmico, se forem referenciados de um arquivo de objeto regular e não forem forçados a serem locais por visibilidade ou versionamento de símbolos. Não os torne dinâmicos se nodynamic-undefined-weak. Se nenhuma das opções for fornecida, um destino pode, por padrão, forçar uma ou outra opção, ou fazer alguma outra seleção de símbolos fracos não definidos para torná-los dinâmicos. Nem todos os destinos suportam essas opções.
execstack
Marca o objeto como exigindo pilha executável.
global
Esta opção só tem significado ao construir um objeto compartilhado. Torna os símbolos definidos por este objeto compartilhado disponíveis para a resolução de símbolos de bibliotecas carregadas posteriormente.
globalaudit
Esta opção só tem significado ao construir um executável dinâmico. Esta opção marca o executável como exigindo auditoria global, definindo o bit "DF_1_GLOBAUDIT" na tag dinâmica "DT_FLAGS_1". A auditoria global requer que qualquer biblioteca de auditoria definida por meio das opções de linha de comando --depaudit ou -P seja executada para todos os objetos dinâmicos carregados pelo aplicativo.
ibtplt
Gera entradas PLT habilitadas para Intel Indirect Branch Tracking (IBT). Suportado para Linux/i386 e Linux/x86_64.
ibt
Gera GNU_PROPERTY_X86_FEATURE_1_IBT na seção .note.gnu.property para indicar a compatibilidade com IBT. Isso também implica ibtplt. Suportado para Linux/i386 e Linux/x86_64.
indirect-extern-access
noindirect-extern-access
Gera GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS na seção .note.gnu.property para indicar que o arquivo de objeto requer ponteiros de função canônicos e não pode ser usado com realocação de cópia. Esta opção também implica noextern-protected-data e nocopyreloc. Suportado para i386 e x86-64.
noindirect-extern-access remove GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS de
da seção .note.gnu.property.
initfirst
Esta opção só tem significado quando se está construindo um objeto compartilhado. Ela marca o objeto de forma que sua inicialização em tempo de execução ocorra antes da inicialização em tempo de execução de quaisquer outros objetos carregados no processo ao mesmo tempo. Da mesma forma, a finalização em tempo de execução do objeto ocorrerá após a finalização em tempo de execução de quaisquer outros objetos.
interpose
Especifique que o carregador dinâmico deve modificar sua ordem de pesquisa de símbolos para que os símbolos desta biblioteca compartilhada substituam todas as outras bibliotecas compartilhadas que não foram marcadas da mesma forma.
unique
nounique
Ao gerar uma biblioteca compartilhada ou outro objeto ELF carregável dinamicamente, marque-o como um que deve (por padrão) ser carregado apenas uma vez e apenas no namespace principal (ao usar "dlmopen"). Isso é usado principalmente para marcar bibliotecas fundamentais como libc, libpthread, etc., que geralmente não funcionam corretamente, a menos que sejam as únicas instâncias de si mesmas. Esse comportamento pode ser substituído pelo chamador "dlmopen" e não se aplica a certos mecanismos de carregamento (como bibliotecas de auditoria).
lam-u48
Gere GNU_PROPERTY_X86_FEATURE_1_LAM_U48 na seção .note.gnu.property para indicar compatibilidade com Intel LAM_U48. Suportado para Linux/x86_64.
lam-u57
Gere GNU_PROPERTY_X86_FEATURE_1_LAM_U57 na seção .note.gnu.property para indicar compatibilidade com Intel LAM_U57. Suportado para Linux/x86_64.
lam-u48-report=none
lam-u48-report=warning
lam-u48-report=error
Especifique como relatar a propriedade GNU_PROPERTY_X86_FEATURE_1_LAM_U48 ausente na seção .note.gnu.property de entrada. lam-u48-report=none, que é o padrão, fará com que o linker não relate propriedades ausentes em arquivos de entrada. lam-u48-report=warning fará com que o linker emita um aviso para propriedades ausentes em arquivos de entrada. lam-u48-report=error fará com que o linker emita um erro para propriedades ausentes em arquivos de entrada. Suportado para Linux/x86_64.
lam-u57-report=none
lam-u57-report=warning
lam-u57-report=error
Especifique como relatar a propriedade GNU_PROPERTY_X86_FEATURE_1_LAM_U57 ausente na seção .note.gnu.property de entrada. lam-u57-report=none, que é o padrão, fará com que o linker não relate propriedades ausentes em arquivos de entrada. lam-u57-report=warning fará com que o linker emita um aviso para propriedades ausentes em arquivos de entrada. lam-u57-report=error fará com que o linker emita um erro para propriedades ausentes em arquivos de entrada. Suportado para Linux/x86_64.
lam-report=none
lam-report=warning
lam-report=error
Especifique como relatar as propriedades GNU_PROPERTY_X86_FEATURE_1_LAM_U48 e GNU_PROPERTY_X86_FEATURE_1_LAM_U57 ausentes na seção .note.gnu.property de entrada. lam-report=none, que é o padrão, fará com que o linker não relate propriedades ausentes em arquivos de entrada. lam-report=warning fará com que o linker emita um aviso para propriedades ausentes em arquivos de entrada. lam-report=error fará com que o linker emita um erro para propriedades ausentes em arquivos de entrada. Suportado para Linux/x86_64.
lazy
Ao gerar um executável ou biblioteca compartilhada, marque-o para indicar ao vinculador dinâmico que a resolução da chamada de função deve ser adiada até o momento em que a função for chamada (vinculação tardia), em vez de no momento do carregamento. A vinculação tardia é o padrão.
loadfltr
Especifique que os filtros do objeto devem ser processados imediatamente em tempo de execução.
max-page-size=valor
Defina o tamanho máximo da página de memória suportada para o valor especificado.
mark-plt
nomark-plt
Marque as entradas PLT com tags dinâmicas, DT_X86_64_PLT, DT_X86_64_PLTSZ e DT_X86_64_PLTENT. Como esta opção armazena um valor diferente de zero no campo r_addend das realocações R_X86_64_JUMP_SLOT, os executáveis e bibliotecas compartilhadas resultantes são incompatíveis com vinculadores dinâmicos, como aqueles em versões mais antigas do glibc, que não têm a alteração para ignorar o r_addend nas realocações R_X86_64_GLOB_DAT e R_X86_64_JUMP_SLOT, que não ignoram o campo r_addend da realocação R_X86_64_JUMP_SLOT. Suportado para x86_64.
muldefs
Permitir múltiplas definições.
nocopyreloc
Desative as variáveis .dynbss geradas pelo vinculador, usadas em vez de variáveis definidas em bibliotecas compartilhadas. Pode resultar em realocações de texto dinâmicas.
nodefaultlib
Especifique que a pesquisa de dependências deste objeto pelo carregador dinâmico deve ignorar quaisquer caminhos de pesquisa de biblioteca padrão.
nodelete
Especifique que o objeto não deve ser descarregado em tempo de execução.
nodlopen
Especifique que o objeto não está disponível para "dlopen".
nodump
Especifique que o objeto não pode ser despejado por "dldump".
noexecstack
Marca o objeto como não necessitando de pilha executável.
noextern-protected-data
Não trate os símbolos de dados protegidos como externos ao construir uma biblioteca compartilhada. Esta opção substitui o padrão do vinculador. Pode ser usado para corrigir realocações incorretas contra símbolos de dados protegidos gerados pelo compilador. As atualizações em símbolos de dados protegidos por outro módulo não são visíveis para a biblioteca compartilhada resultante. Suportado para i386 e x86-64.
noreloc-overflow
Desative a verificação de estouro de realocação. Isso pode ser usado para desativar a verificação de estouro de realocação se não houver estouro de realocação dinâmica em tempo de execução. Suportado para x86_64.
memory-seal
nomemory-seal
Instrua o executável ou a biblioteca compartilhada a selar todos os segmentos PT_LOAD para evitar manipulação posterior (como alterar os sinalizadores de proteção, o tamanho do segmento ou remover o mapeamento). Este é um mecanismo de segurança que requer suporte do sistema. Isso gera GNU_PROPERTY_MEMORY_SEAL na seção .note.gnu.property.
now
Ao gerar um executável ou biblioteca compartilhada, marque-o para indicar ao vinculador dinâmico que todos os símbolos devem ser resolvidos quando o programa for iniciado ou quando a biblioteca compartilhada for carregada por dlopen, em vez de adiar a resolução da chamada de função até o momento em que a função for chamada pela primeira vez.
origin
Especifica que o objeto requer o tratamento `$ORIGIN` nos caminhos.
pack-relative-relocs
nopack-relative-relocs
Gera realocações relativas compactas em executáveis e bibliotecas compartilhadas independentes de posição. Adiciona as entradas "DT_RELR", "DT_RELRSZ" e "DT_RELRENT" à seção dinâmica. É ignorado ao construir executáveis dependentes de posição e saída relocável. `nopack-relative-relocs` é o padrão, que desativa a realocação relativa compacta. Quando vinculado à GNU C Library, um símbolo de dependência de versão `GLIBC_ABI_DT_RELR` para a biblioteca C compartilhada é adicionado à saída. Suportado para i386 e x86-64.
relro
norelro
Cria um cabeçalho de segmento ELF "PT_GNU_RELRO" no objeto. Isso especifica um segmento de memória que deve ser tornado somente leitura após a realocação, se suportado. Especificar um tamanho de página menor que o tamanho de página do sistema tornará essa proteção ineficaz. Não cria um cabeçalho de segmento ELF "PT_GNU_RELRO" se `norelro` for usado.
report-relative-reloc
Relata as realocações dinâmicas relativas geradas pelo vinculador. Suportado para Linux/i386 e Linux/x86_64.
sectionheader
nosectionheader
Gera cabeçalho de seção. Não gera cabeçalho de seção se `nosectionheader` for usado. `sectionheader` é o padrão.
separate-code
noseparate-code
Cria um cabeçalho de segmento "PT_LOAD" de código separado no objeto. Isso especifica um segmento de memória que deve conter apenas instruções e deve estar em páginas totalmente distintas de quaisquer outros dados. Não cria um segmento "PT_LOAD" de código separado se `noseparate-code` for usado.
shstk
Gera `GNU_PROPERTY_X86_FEATURE_1_SHSTK` na seção `.note.gnu.property` para indicar compatibilidade com o Intel Shadow Stack. Suportado para Linux/i386 e Linux/x86_64.
stack-size=value
Especifica um tamanho de pilha para um segmento ELF "PT_GNU_STACK". Especificar zero substituirá qualquer segmento "PT_GNU_STACK" não nulo padrão.
start-stop-gc
nostart-stop-gc
Quando `--gc-sections` estiver em vigor, uma referência de uma seção retida para `__start_SECNAME` ou `__stop_SECNAME` faz com que todas as seções de entrada nomeadas `SECNAME` também sejam retidas, se `SECNAME` for representável como um identificador C e `__start_SECNAME` ou `__stop_SECNAME` for sintetizado pelo vinculador. `-z start-stop-gc` desativa esse efeito, permitindo que as seções sejam coletadas como lixo como se os símbolos sintetizados especiais não fossem definidos. `-z start-stop-gc` não tem efeito em uma definição de `__start_SECNAME` ou `__stop_SECNAME` em um arquivo de objeto ou script do vinculador. Essa definição evitará que o vinculador forneça um `__start_SECNAME` ou `__stop_SECNAME` sintetizado, respectivamente, e, portanto, o tratamento especial pela coleta de lixo para essas referências.
start-stop-visibility=value
Especifica a visibilidade do símbolo ELF para os símbolos sintetizados `__start_SECNAME` e `__stop_SECNAME`. `value` deve ser exatamente `default`, `internal`, `hidden` ou `protected`. Se nenhuma opção `-z start-stop-visibility` for fornecida, `protected` é usado para compatibilidade com a prática histórica. No entanto, é altamente recomendável usar `-z start-stop-visibility=hidden` em novos programas e bibliotecas compartilhadas para que esses símbolos não sejam exportados entre objetos compartilhados, o que geralmente não é o pretendido.
text
notext
textoff
Reporta um erro se DT_TEXTREL estiver definido, ou seja, se o objeto de posição independente ou compartilhado tiver relocations dinâmicas em seções somente leitura. Não reporte um erro se notext ou textoff.
undefs
Não reporte referências de símbolos não resolvidos de arquivos de objeto regulares, seja ao criar um executável ou ao criar uma biblioteca compartilhada. Esta opção é o inverso de -z defs.
unique-symbol
nounique-symbol
Evite nomes de símbolos locais duplicados na tabela de strings de símbolos. Anexe ".number" aos nomes de símbolos locais duplicados se unique-symbol for usado. nounique-symbol é o padrão.
x86-64-baseline
x86-64-v2
x86-64-v3
x86-64-v4
Especifique o nível de ISA x86-64 necessário na seção .note.gnu.property. x86-64-baseline gera "GNU_PROPERTY_X86_ISA_1_BASELINE". x86-64-v2 gera "GNU_PROPERTY_X86_ISA_1_V2". x86-64-v3 gera "GNU_PROPERTY_X86_ISA_1_V3". x86-64-v4 gera "GNU_PROPERTY_X86_ISA_1_V4". Suportado para Linux/i386 e Linux/x86_64.
isa-level-report=none
isa-level-report=all
isa-level-report=needed
isa-level-report=used
Especifique como reportar os níveis de ISA x86-64 nos arquivos relocáveis de entrada. isa-level-report=none, que é o padrão, fará com que o linker não reporte os níveis de ISA x86-64 nos arquivos de entrada. isa-level-report=all fará com que o linker reporte os níveis de ISA x86-64 necessários e usados nos arquivos de entrada. isa-level-report=needed fará com que o linker reporte os níveis de ISA x86-64 necessários nos arquivos de entrada. isa-level-report=used fará com que o linker reporte os níveis de ISA x86-64 usados nos arquivos de entrada. Suportado para Linux/i386 e Linux/x86_64.
Outras palavras-chave são ignoradas para compatibilidade com Solaris.
--gnu-tls-tag
--no-gnu-tls-tag
Adicione a dependência da tag de versão "GLIBC_ABI_GNU_TLS" em programas de saída e bibliotecas compartilhadas ao vincular ao glibc se os arquivos de objeto relocáveis de entrada chamarem "___tls_get_addr". A saída falhará ao carregar e executar em tempo de execução em relação ao glibc que não define a tag de versão "GLIBC_ABI_GNU_TLS". A menos que desativado pela opção --disable-gnu-tls-tag na hora da construção do linker, quando nenhuma opção for especificada, o linker adicionará a dependência da tag de versão "GLIBC_ABI_GNU_TLS" se as entradas tiverem a chamada "___tls_get_addr" e libc.so definir a tag de versão "GLIBC_ABI_GNU_TLS". Suportado para Linux/i386.
--gnu2-tls-tag
--no-gnu2-tls-tag
Adicione a dependência da tag de versão "GLIBC_ABI_GNU2_TLS" em programas de saída e bibliotecas compartilhadas ao vincular ao glibc se os arquivos de objeto relocáveis de entrada tiverem a relocation "R_386_TLS_DESC_CALL" ou "R_X86_64_TLSDESC_CALL". A saída falhará ao carregar e executar em tempo de execução em relação ao glibc que não define a tag de versão "GLIBC_ABI_GNU2_TLS". A menos que desativado pela opção --disable-gnu2-tls-tag na hora da construção do linker, quando nenhuma opção for especificada, o linker adicionará a dependência da tag de versão "GLIBC_ABI_GNU2_TLS" se as entradas tiverem a relocation "R_386_TLS_DESC_CALL" ou "R_X86_64_TLSDESC_CALL" e libc.so definir a tag de versão "GLIBC_ABI_GNU2_TLS". Suportado para Linux/i386 e Linux/x86_64.
-( arquivos -)
--start-group arquivos --end-group
Os arquivos devem ser uma lista de arquivos de arquivo. Eles podem ser nomes de arquivos explícitos ou opções -l.
Os arquivos especificados são pesquisados repetidamente até que não sejam criadas novas referências indefinidas. Normalmente, um arquivo é pesquisado apenas uma vez na ordem em que é especificado na linha de comando. Se um símbolo em um arquivo for necessário para resolver um símbolo indefinido referenciado por um objeto em um arquivo que aparece posteriormente na linha de comando, o vinculador não poderá resolver essa referência. Ao agrupar os arquivos, todos eles serão pesquisados repetidamente até que todas as referências possíveis sejam resolvidas.
Usar esta opção tem um custo significativo de desempenho. É melhor usá-la apenas quando existem referências circulares inevitáveis entre dois ou mais arquivos.
--accept-unknown-input-arch
--no-accept-unknown-input-arch
Informa ao vinculador para aceitar arquivos de entrada cuja arquitetura não pode ser reconhecida. A suposição é que o usuário sabe o que está fazendo e deliberadamente deseja vincular esses arquivos de entrada desconhecidos. Este era o comportamento padrão do vinculador antes da versão 2.14. O comportamento padrão a partir da versão 2.14 é rejeitar esses arquivos de entrada e, portanto, a opção --accept-unknown-input-arch foi adicionada para restaurar o comportamento antigo.
--as-needed
--no-as-needed
Esta opção afeta as tags ELF DT_NEEDED para bibliotecas dinâmicas mencionadas na linha de comando após a opção --as-needed. Normalmente, o vinculador adicionará uma tag DT_NEEDED para cada biblioteca dinâmica mencionada na linha de comando, independentemente de a biblioteca ser realmente necessária ou não. --as-needed faz com que uma tag DT_NEEDED seja emitida apenas para uma biblioteca que, naquele momento do vínculo, satisfaça uma referência de símbolo indefinido não fraco de um arquivo de objeto regular ou, se a biblioteca não for encontrada nas listas DT_NEEDED de outras bibliotecas necessárias, uma referência de símbolo indefinido não fraco de outra biblioteca dinâmica necessária. Arquivos de objeto ou bibliotecas que aparecem na linha de comando após a biblioteca em questão não afetam se a biblioteca é considerada necessária. Isso é semelhante às regras para extração de arquivos de objeto de arquivos. --no-as-needed restaura o comportamento padrão.
Observação: em sistemas baseados em Linux, a opção `--as-needed` também afeta o comportamento das opções `--rpath` e `--rpath-link`. Consulte a descrição de `--rpath-link` para obter mais detalhes.
--add-needed
--no-add-needed
Essas duas opções foram descontinuadas devido à semelhança de seus nomes com as opções `--as-needed` e `--no-as-needed`. Elas foram substituídas por `--copy-dt-needed-entries` e `--no-copy-dt-needed-entries`.
-assert keyword
Esta opção é ignorada para compatibilidade com SunOS.
-Bdynamic
-dy
-call_shared
Faz a ligação com bibliotecas dinâmicas. Isso só tem significado em plataformas que suportam bibliotecas compartilhadas. Normalmente, esta opção é o padrão em tais plataformas. As diferentes variantes desta opção são para compatibilidade com vários sistemas. Você pode usar esta opção várias vezes na linha de comando: ela afeta a pesquisa de bibliotecas para as opções `-l` que a seguem.
-Bgroup
Define a flag "DF\_1\_GROUP" na entrada "DT\_FLAGS\_1" na seção dinâmica. Isso faz com que o vinculador de tempo de execução execute as pesquisas neste objeto e em suas dependências apenas dentro do grupo. `--unresolved-symbols=report-all` é implícito. Esta opção só tem significado em plataformas ELF que suportam bibliotecas compartilhadas.
-Bstatic
-dn
-non_shared
-static
Não faz a ligação com bibliotecas compartilhadas. Isso só tem significado em plataformas que suportam bibliotecas compartilhadas. As diferentes variantes desta opção são para compatibilidade com vários sistemas. Você pode usar esta opção várias vezes na linha de comando: ela afeta a pesquisa de bibliotecas para as opções `-l` que a seguem. Esta opção também implica `--unresolved-symbols=report-all`. Esta opção pode ser usada com `-shared`. Fazer isso significa que uma biblioteca compartilhada está sendo criada, mas que todas as referências externas da biblioteca devem ser resolvidas extraindo entradas de bibliotecas estáticas.
-Bsymbolic
Ao criar uma biblioteca compartilhada, vincula as referências a símbolos globais à definição dentro da biblioteca compartilhada, se houver. Normalmente, é possível que um programa vinculado a uma biblioteca compartilhada substitua a definição dentro da biblioteca compartilhada. Esta opção só tem significado em plataformas ELF que suportam bibliotecas compartilhadas.
-Bsymbolic-functions
Ao criar uma biblioteca compartilhada, vincula as referências a símbolos de função globais à definição dentro da biblioteca compartilhada, se houver. Esta opção só tem significado em plataformas ELF que suportam bibliotecas compartilhadas.
-Bno-symbolic
Esta opção pode cancelar as opções `-Bsymbolic` e `-Bsymbolic-functions` especificadas anteriormente.
--dynamic-list=dynamic-list-file
Especifica o nome de um arquivo de lista dinâmica para o vinculador. Isso é normalmente usado ao criar bibliotecas compartilhadas para especificar uma lista de símbolos globais cujas referências não devem ser vinculadas à definição dentro da biblioteca compartilhada, ou para criar executáveis vinculados dinamicamente para especificar uma lista de símbolos que devem ser adicionados à tabela de símbolos no executável. Esta opção só tem significado em plataformas ELF que suportam bibliotecas compartilhadas.
O formato da lista dinâmica é o mesmo da versão do nó sem escopo e nome do nó. Consulte VERSION para obter mais informações.
--dynamic-list-data
Inclui todos os símbolos de dados globais na lista dinâmica.
--dynamic-list-cpp-new
Fornece a lista dinâmica interna para os operadores C++ new e delete. É principalmente útil para
construir a libstdc++ compartilhada.
--dynamic-list-cpp-typeinfo
Fornece a lista dinâmica interna para a identificação de tipo em tempo de execução do C++.
--check-sections
--no-check-sections
Solicita ao vinculador que não verifique os endereços das seções após eles terem sido atribuídos para ver se há alguma sobreposição. Normalmente, o vinculador realizará essa verificação e, se encontrar alguma sobreposição, produzirá as mensagens de erro apropriadas. O vinculador conhece e faz concessões para seções em sobreposições. O comportamento padrão pode ser restaurado usando a opção de linha de comando --check-sections. A sobreposição de seções normalmente não é verificada para vinculações relocáveis. Você pode forçar a verificação nesse caso usando a opção --check-sections.
--copy-dt-needed-entries
--no-copy-dt-needed-entries
Esta opção afeta o tratamento de bibliotecas dinâmicas referenciadas por tags DT_NEEDED dentro de arquivos ELF de bibliotecas dinâmicas mencionados na linha de comando. Normalmente, o vinculador não adicionará uma tag DT_NEEDED ao arquivo de saída para cada biblioteca mencionada em uma tag DT_NEEDED em um arquivo de biblioteca dinâmica de entrada. Com --copy-dt-needed-entries especificado na linha de comando, no entanto, todas as bibliotecas dinâmicas que o seguem terão suas entradas DT_NEEDED adicionadas. O comportamento padrão pode ser restaurado com --no-copy-dt-needed-entries.
Esta opção também tem um efeito na resolução de símbolos em bibliotecas dinâmicas. Com --copy-dt-needed-entries, as bibliotecas dinâmicas mencionadas na linha de comando serão pesquisadas recursivamente, seguindo suas tags DT_NEEDED para outras bibliotecas, a fim de resolver os símbolos necessários pelo arquivo de saída. Com a configuração padrão, no entanto, a pesquisa das bibliotecas dinâmicas que o seguem parará na própria biblioteca dinâmica. Nenhuma ligação DT_NEEDED será percorrida para resolver símbolos.
--cref
Gera uma tabela de referência cruzada. Se um arquivo de mapa do vinculador estiver sendo gerado, a tabela de referência cruzada será impressa no arquivo de mapa. Caso contrário, será impressa na saída padrão.
O formato da tabela é intencionalmente simples, para que possa ser facilmente processado por um script, se necessário. Os símbolos são impressos, classificados por nome. Para cada símbolo, uma lista de nomes de arquivos é fornecida. Se o símbolo for definido, o primeiro arquivo listado é o local da definição. Se o símbolo for definido como um valor comum, todos os arquivos onde isso acontece aparecem a seguir. Finalmente, todos os arquivos que referenciam o símbolo são listados.
--ctf-variables
--no-ctf-variables
O formato de depuração CTF suporta uma seção que codifica os nomes e tipos das variáveis encontradas no programa que não aparecem em nenhuma tabela de símbolos. Essas variáveis claramente não podem ser pesquisadas por endereço por depuradores convencionais, portanto, o espaço usado para seus tipos e nomes geralmente é desperdiçado: os tipos geralmente são pequenos, mas os nomes geralmente não. --ctf-variables causa a geração de uma seção como essa. O comportamento padrão pode ser restaurado com --no-ctf-variables.
--ctf-share-types=método
Ajusta o método usado para compartilhar tipos entre unidades de tradução em CTF.
share-unconflicted
Coloca todos os tipos que não têm definições ambíguas no dicionário compartilhado, onde os depuradores podem acessá-los facilmente, mesmo que ocorram apenas em uma unidade de tradução. Esta é a configuração padrão.
share-duplicated
Coloca apenas os tipos que ocorrem em várias unidades de tradução no dicionário compartilhado: os tipos com apenas uma definição vão para os dicionários por unidade de tradução. Os tipos com definições ambíguas em várias unidades de tradução sempre vão para os dicionários por unidade de tradução. Isso tende a tornar o CTF maior, mas pode reduzir a quantidade de CTF no dicionário compartilhado. Para projetos muito grandes, isso pode acelerar a abertura do CTF e economizar memória no consumidor CTF em tempo de execução.
--no-define-common
Esta opção inibe a atribuição de endereços a símbolos comuns. O comando de script "INHIBIT_COMMON_ALLOCATION" tem o mesmo efeito.
A opção --no-define-common permite desacoplar a decisão de atribuir endereços a símbolos comuns da escolha do tipo de arquivo de saída; caso contrário, um tipo de saída não relocável força a atribuição de endereços a símbolos comuns. O uso de --no-define-common permite que os símbolos comuns que são referenciados de uma biblioteca compartilhada recebam endereços apenas no programa principal. Isso elimina o espaço duplicado não utilizado na biblioteca compartilhada e também evita qualquer possível confusão ao resolver para o duplicado errado quando há muitos módulos dinâmicos com caminhos de pesquisa especializados para resolução de símbolos em tempo de execução.
--force-group-allocation
Esta opção faz com que o vinculador coloque os membros do grupo de seções como seções de entrada normais e exclua os grupos de seções. Este é o comportamento padrão para uma vinculação final, mas esta opção pode ser usada para alterar o comportamento de uma vinculação relocável (-r). O comando de script "FORCE_GROUP_ALLOCATION" tem o mesmo efeito.
--defsym=símbolo=expressão
Cria um símbolo global no arquivo de saída, contendo o endereço absoluto fornecido pela expressão. Você pode usar esta opção quantas vezes forem necessárias para definir vários símbolos na linha de comando. Uma forma limitada de aritmética é suportada para a expressão neste contexto: você pode fornecer uma constante hexadecimal ou o nome de um símbolo existente, ou usar "+" e "-" para adicionar ou subtrair constantes hexadecimais ou símbolos. Se você precisar de expressões mais elaboradas, considere usar a linguagem de script do vinculador a partir de um script. Observação: não deve haver espaço em branco entre o símbolo, o sinal de igual ("=") e a expressão.
O vinculador processa os argumentos --defsym e os argumentos -T em ordem, colocando --defsym antes de -T, o que definirá o símbolo antes que o script do vinculador de -T seja processado, enquanto colocar --defsym depois de -T definirá o símbolo após o script do vinculador ter sido processado. Essa diferença tem consequências para as expressões dentro do script do vinculador que usam os símbolos --defsym, a ordem correta dependerá do que você está tentando alcançar.
`--demangle[=style]`
`--no-demangle`
Essas opções controlam se os nomes dos símbolos devem ser descompilados em mensagens de erro e outras saídas. Quando o vinculador é instruído a descompilar, ele tenta apresentar os nomes dos símbolos de uma forma legível: ele remove os sublinhados iniciais, se forem usados pelo formato de arquivo de objeto, e converte os nomes dos símbolos C++ compilados em nomes legíveis para o usuário. Diferentes compiladores têm diferentes estilos de compilação. O argumento opcional de estilo de descompilação pode ser usado para escolher um estilo de descompilação apropriado para o seu compilador. O vinculador descompilará por padrão, a menos que a variável de ambiente COLLECT_NO_DEMANGLE esteja definida. Essas opções podem ser usadas para substituir o padrão.
`-Ifile`
`--dynamic-linker=file`
Define o nome do vinculador dinâmico. Isso só é significativo ao gerar executáveis ELF vinculados dinamicamente. O vinculador dinâmico padrão normalmente é correto; não use isso, a menos que você saiba o que está fazendo.
`--no-dynamic-linker`
Ao produzir um arquivo executável, omita a solicitação de que um vinculador dinâmico seja usado no tempo de carregamento. Isso só é significativo para executáveis ELF que contêm realocações dinâmicas e geralmente requer código de ponto de entrada que seja capaz de processar essas realocações.
`--embedded-relocs`
Essa opção é semelhante à opção --emit-relocs, exceto que as realocações são armazenadas em uma seção específica do destino. Essa opção é suportada apenas pelos destinos BFIN, CR16 e M68K.
`--disable-multiple-abs-defs`
Não permita várias definições com símbolos incluídos no nome do arquivo invocado por -R ou --just-symbols
`--fatal-warnings`
`--no-fatal-warnings`
Trate todos os avisos como erros. O comportamento padrão pode ser restaurado com a opção --no-fatal-warnings.
`-w`
`--no-warnings`
Não exiba mensagens de aviso ou erro. Isso substitui --fatal-warnings se ele tiver sido habilitado. Essa opção pode ser usada quando se sabe que o arquivo binário de saída não funcionará, mas ainda há necessidade de criá-lo.
`--force-exe-suffix`
Certifique-se de que um arquivo de saída tenha um sufixo .exe.
Se um arquivo de saída totalmente vinculado, que foi construído com sucesso, não tiver um sufixo .exe ou .dll, esta opção força o vinculador a copiar o arquivo de saída para um arquivo com o mesmo nome com um sufixo .exe. Essa opção é útil ao usar arquivos Makefile Unix não modificados em um host Microsoft Windows, pois algumas versões do Windows não executarão uma imagem, a menos que ela termine com um sufixo .exe.
--gc-sections
--no-gc-sections
Habilita a coleta de lixo de seções de entrada não utilizadas. É ignorado em destinos que não suportam esta opção. O comportamento padrão (de não realizar esta coleta de lixo) pode ser restaurado especificando --no-gc-sections na linha de comando. Observe que a coleta de lixo para destinos de formato COFF e PE é suportada, mas a implementação é atualmente considerada experimental.
--gc-sections decide quais seções de entrada são usadas examinando símbolos e realocações.
A seção que contém o símbolo de entrada e todas as seções que contêm símbolos indefinidos na linha de comando serão mantidas, assim como as seções que contêm símbolos referenciados por objetos dinâmicos. Observe que, ao criar bibliotecas compartilhadas, o vinculador deve assumir que qualquer símbolo visível é referenciado. Depois que este conjunto inicial de seções for determinado, o vinculador marca recursivamente como usadas quaisquer seções referenciadas por suas realocações. Veja --entry, --undefined e --gc-keep-exported.
Esta opção pode ser definida ao fazer uma vinculação parcial (habilitada com a opção -r). Neste caso, a raiz dos símbolos a serem mantidos deve ser explicitamente especificada por uma das opções --entry, --undefined ou --gc-keep-exported ou por um comando "ENTRY" no script do vinculador.
Como uma extensão GNU, as seções de entrada ELF marcadas com a flag "SHF_GNU_RETAIN" não serão coletadas pelo garbage collector.
--print-gc-sections
--no-print-gc-sections
Lista todas as seções removidas pela coleta de lixo. A listagem é impressa em stderr. Esta opção só é eficaz se a coleta de lixo foi habilitada através da opção --gc-sections. O comportamento padrão (de não listar as seções que são removidas) pode ser restaurado especificando --no-print-gc-sections na linha de comando.
--gc-keep-exported
Quando --gc-sections está habilitado, esta opção impede a coleta de lixo de seções de entrada não utilizadas que contêm símbolos globais com visibilidade padrão ou protegida. Esta opção destina-se a ser usada para executáveis onde seções não referenciadas seriam coletadas pelo garbage collector, independentemente da visibilidade externa dos símbolos contidos. Observe que esta opção não tem efeito ao vincular objetos compartilhados, pois já é o comportamento padrão. Esta opção é suportada apenas para destinos de formato ELF.
--print-output-format
Imprime o nome do formato de saída padrão (possivelmente influenciado por outras opções da linha de comando). Esta é a string que apareceria em um comando "OUTPUT_FORMAT" no script do vinculador.
--print-memory-usage
Imprime o tamanho usado, o tamanho total e o tamanho usado das regiões de memória criadas com o comando MEMORY. Isso é útil em destinos embarcados para ter uma visão rápida da quantidade de memória livre. O formato da saída tem um cabeçalho e uma linha por região. Aqui está um exemplo de saída:
Região de memória Tamanho Utilizado Tamanho da Região % Utilizado ROM: 256 KB 1 MB 25.00% RAM: 32 B 2 GB 0.00%
Observação: se você quiser descobrir sobre o uso de memória do próprio linker, então a opção --stats
fará isso.
--help
Imprime um resumo das opções da linha de comando na saída padrão e sai.
--target-help
Imprime um resumo de todas as opções específicas do destino na saída padrão e sai.
-Map=mapfile
Imprime um mapa de link para o arquivo mapfile. Veja a descrição da opção -M, acima. Se mapfile for apenas o caractere "-" então o mapa será gravado em stdout.
Especificar um diretório como mapfile faz com que o mapa de link seja gravado como um arquivo dentro do diretório. Normalmente, o nome do arquivo dentro do diretório é calculado como o nome base do arquivo de saída com ".map" anexado. No entanto, se o caractere especial "%" for usado, este será substituído pelo caminho completo do arquivo de saída. Além disso, se houver algum caractere após o símbolo %, ".map" não será mais anexado.
-o foo.exe -Map=bar [Cria ./bar]
-o ../dir/foo.exe -Map=bar [Cria ./bar]
-o foo.exe -Map=../dir [Cria ../dir/foo.exe.map]
-o ../dir2/foo.exe -Map=../dir [Cria ../dir/foo.exe.map]
-o foo.exe -Map=% [Cria ./foo.exe.map]
-o ../dir/foo.exe -Map=% [Cria ../dir/foo.exe.map]
-o foo.exe -Map=%.bar [Cria ./foo.exe.bar]
-o ../dir/foo.exe -Map=%.bar [Cria ../dir/foo.exe.bar]
-o ../dir2/foo.exe -Map=../dir/% [Cria ../dir/../dir2/foo.exe.map]
-o ../dir2/foo.exe -Map=../dir/%.bar [Cria ../dir/../dir2/foo.exe.bar]
É um erro especificar mais de um caractere "%".
Se o arquivo de mapa já existir, ele será sobrescrito por esta operação.
--no-keep-memory
Normalmente, ld otimiza para velocidade em vez de uso de memória, armazenando em cache as tabelas de símbolos dos arquivos de entrada
na memória. Esta opção diz a ld para, em vez disso, otimizar para o uso de memória, relendo as
tabelas de símbolos conforme necessário. Isso pode ser necessário se ld ficar sem espaço de memória ao
linkar um executável grande.
--no-undefined
-z defs
Relata referências de símbolos não resolvidos de arquivos de objeto regulares. Isso é feito mesmo se o linker estiver criando uma biblioteca compartilhada não simbólica. A opção --[no-]allow-shlib-undefined controla o comportamento para relatar referências não resolvidas encontradas em bibliotecas compartilhadas que estão sendo linkadas.
Os efeitos desta opção podem ser revertidos usando "-z undefs".
--allow-multiple-definition
-z muldefs
Normalmente, quando um símbolo é definido várias vezes, o linker relatará um erro fatal. Essas opções permitem várias definições e a primeira definição será usada.
--allow-shlib-undefined
--no-allow-shlib-undefined
Permite ou desabilita símbolos não definidos em bibliotecas compartilhadas. Esta opção é semelhante a --no-undefined, exceto que ela determina o comportamento quando os símbolos não definidos estão em uma biblioteca compartilhada, em vez de um arquivo de objeto regular. Não afeta como os símbolos não definidos em arquivos de objeto regulares são tratados.
O comportamento padrão é relatar erros para quaisquer símbolos indefinidos referenciados em bibliotecas compartilhadas se o vinculador estiver sendo usado para criar um executável, mas permiti-los se o vinculador estiver sendo usado para criar uma biblioteca compartilhada.
As razões para permitir referências de símbolos indefinidos em bibliotecas compartilhadas especificadas no momento da vinculação são que:
Uma biblioteca compartilhada especificada no momento da vinculação pode não ser a mesma que está disponível no momento do carregamento, portanto, o símbolo pode realmente ser resolvido no momento do carregamento.
Existem alguns sistemas operacionais, como BeOS e HPPA, onde símbolos indefinidos em bibliotecas compartilhadas são normais.
O kernel do BeOS, por exemplo, faz o patching de bibliotecas compartilhadas no momento do carregamento para selecionar a função mais apropriada para a arquitetura atual. Isso é usado, por exemplo, para selecionar dinamicamente uma função memset apropriada.
^ -error-handling-script=scriptname
Se esta opção for fornecida, o vinculador invocará o scriptname sempre que um erro for encontrado. Atualmente, no entanto, apenas dois tipos de erro são suportados: símbolos ausentes e bibliotecas ausentes. Dois argumentos serão passados para o script: a palavra-chave "undefined-symbol" ou "missing-lib" e o nome do símbolo indefinido ou biblioteca ausente. A intenção é que o script forneça sugestões ao usuário sobre onde o símbolo ou biblioteca podem ser encontrados. Após o script terminar, a mensagem de erro normal do vinculador será exibida.
A disponibilidade desta opção é controlada por uma opção de tempo de configuração, portanto, ela pode não estar presente em implementações específicas.
^ -no-undefined-version
Normalmente, quando um símbolo tem uma versão indefinida, o vinculador o ignora. Esta opção desativa símbolos com versão indefinida e um erro fatal será emitido em vez disso.
^ -default-symver
Cria e usa uma versão de símbolo padrão (o soname) para símbolos exportados não versionados.
^ -default-imported-symver
Cria e usa uma versão de símbolo padrão (o soname) para símbolos importados não versionados.
^ -no-warn-mismatch
Normalmente, o ld dará um erro se você tentar vincular arquivos de entrada que não são compatíveis por algum motivo, talvez porque foram compilados para processadores diferentes ou para diferentes endiannesses. Esta opção diz ao ld para permitir silenciosamente tais possíveis erros. Esta opção deve ser usada com cuidado, em casos em que você tomou alguma ação especial que garante que os erros do vinculador sejam inadequados.
^ -no-warn-search-mismatch
Normalmente, o ld dará um aviso se encontrar uma biblioteca incompatível durante uma pesquisa de biblioteca. Esta opção silencia o aviso.
^ -no-whole-archive
Desativa o efeito da opção --whole-archive para arquivos de arquivo subsequentes.
--noinhibit-exec
Mantenha o arquivo executável de saída sempre que ele ainda for utilizável. Normalmente, o vinculador não produzirá um arquivo de saída se encontrar erros durante o processo de vinculação; ele será encerrado sem gravar um arquivo de saída quando emitir qualquer erro.
-nostdlib
Pesquise apenas os diretórios de biblioteca especificados explicitamente na linha de comando. Os diretórios de biblioteca especificados em scripts de vinculação (incluindo scripts de vinculação especificados na linha de comando) são ignorados.
--oformat=formato-de-saída
O ld pode ser configurado para suportar mais de um tipo de arquivo de objeto. Se o seu ld estiver configurado dessa forma, você pode usar a opção --oformat para especificar o formato binário para o arquivo de objeto de saída. Mesmo quando o ld estiver configurado para suportar formatos de objeto alternativos, você geralmente não precisa especificar isso, pois o ld deve ser configurado para produzir como formato de saída padrão o formato mais comum em cada máquina. formato-de-saída é uma string de texto, o nome de um formato específico suportado pelas bibliotecas BFD. (Você pode listar os formatos binários disponíveis com objdump -i.) O comando de script "OUTPUT_FORMAT" também pode especificar o formato de saída, mas esta opção o substitui.
--out-implib arquivo
Crie uma biblioteca de importação em arquivo correspondente ao executável que o vinculador está gerando (por exemplo, um DLL ou programa ELF). Esta biblioteca de importação (que deve ser chamada de "*.dll.a" ou "*.a" para DLLs) pode ser usada para vincular clientes ao executável gerado; este comportamento torna possível pular uma etapa separada de criação da biblioteca de importação (por exemplo, "dlltool" para DLLs). Esta opção está disponível apenas para as portas i386 PE e ELF do vinculador.
-pie
--pic-executable
Crie um executável independente de posição. Atualmente, isso é suportado apenas em plataformas ELF. Executáveis independentes de posição são realocados pelo vinculador dinâmico para o endereço virtual que o SO escolhe para eles, o que pode variar entre as invocações. Eles são marcados como ET_DYN no cabeçalho do arquivo ELF, mas diferem das bibliotecas compartilhadas em vários aspectos. Em particular, os símbolos definidos em um PIE por padrão não podem ser substituídos por outro objeto, como podem ser em uma biblioteca compartilhada.
-no-pie
Crie um executável dependente de posição. Este é o padrão.
-qmagic
Esta opção é ignorada para compatibilidade com Linux.
-Qy Esta opção é ignorada para compatibilidade com SVR4.
--relax
--no-relax
Uma opção com efeitos dependentes da máquina. Esta opção é suportada apenas em alguns destinos.
Em algumas plataformas, a opção --relax realiza otimizações globais específicas do destino que se tornam possíveis quando o vinculador resolve o endereçamento no programa, como relaxar modos de endereçamento, sintetizar novas instruções, selecionar versões mais curtas das instruções atuais e combinar valores constantes.
Em algumas plataformas, essas otimizações globais no momento da vinculação podem tornar a depuração simbólica do executável resultante impossível. Sabe-se que este é o caso para a família de processadores Matsushita MN10200 e MN10300.
Em plataformas onde o recurso é suportado, a opção --no-relax o desativará.
Em plataformas onde o recurso não é suportado, tanto --relax quanto --no-relax são aceitos, mas ignorados.
--retain-symbols-file=filename
Retém apenas os símbolos listados no arquivo filename, descartando todos os outros. filename é
simplesmente um arquivo de texto, com um nome de símbolo por linha. Esta opção é especialmente útil em
ambientes (como VxWorks) onde uma grande tabela de símbolos globais é acumulada gradualmente, para
economizar memória em tempo de execução.
--retain-symbols-file não descarta símbolos indefinidos ou símbolos necessários para realocações.
Você pode especificar --retain-symbols-file apenas uma vez na linha de comando. Ele substitui -s e -S.
-rpath=dir
Adiciona um diretório ao caminho de pesquisa da biblioteca de tempo de execução. Isso é usado ao vincular um executável ELF
com objetos compartilhados. Todos os argumentos -rpath são concatenados e passados para o
vinculador de tempo de execução, que os usa para localizar objetos compartilhados em tempo de execução.
A opção -rpath também é usada ao localizar objetos compartilhados que são necessários por objetos compartilhados explicitamente
incluídos na vinculação; veja a descrição da opção -rpath-link.
A pesquisa em -rpath desta forma é suportada apenas por vinculadores nativos e vinculadores cruzados que foram configurados com a opção --with-sysroot.
Se -rpath não for usado ao vincular um executável ELF, o conteúdo da variável de ambiente "LD_RUN_PATH" será usado, caso esteja definida.
A opção -rpath também pode ser usada no SunOS. Por padrão, no SunOS, o vinculador formará um
caminho de pesquisa de tempo de execução com todas as opções -L que ele recebe. Se uma opção -rpath for usada, o
caminho de pesquisa de tempo de execução será formado exclusivamente usando as opções -rpath, ignorando as opções -L.
Isso pode ser útil ao usar gcc, que adiciona muitas opções -L que podem estar em sistemas de arquivos montados em NFS.
Para compatibilidade com outros vinculadores ELF, se a opção -R for seguida por um nome de diretório, em vez de um nome de arquivo, ela será tratada como a opção -rpath.
-rpath-link=dir
Ao usar ELF ou SunOS, uma biblioteca compartilhada pode exigir outra. Isso acontece quando uma vinculação "ld
-shared" inclui uma biblioteca compartilhada como um dos arquivos de entrada.
Quando o vinculador encontra essa dependência ao fazer uma vinculação não compartilhada e não realocável,
ele tentará automaticamente localizar a biblioteca compartilhada necessária e incluí-la na vinculação,
se ela não for incluída explicitamente. Nesses casos, vários diretórios são pesquisados, conforme descrito abaixo. A opção -rpath-link especifica o primeiro conjunto de
diretórios a serem pesquisados.
Esta opção pode especificar uma sequência de nomes de diretório, fornecendo uma lista de nomes
separados por dois pontos ou aparecendo várias vezes.
Os tokens $ORIGIN e $LIB podem aparecer nesses diretórios de pesquisa. Eles serão substituídos pelo
caminho completo para o diretório que contém o programa ou objeto compartilhado, no caso de $ORIGIN,
e seja lib - para binários de 32 bits - ou lib64 - para binários de 64 bits - no caso de $LIB.
A forma alternativa desses tokens - ${ORIGIN} e ${LIB} também pode ser usada. O token $PLATFORM não é suportado.
A opção --rpath-link deve ser usada com cautela, pois ela substitui o caminho de pesquisa que pode ter sido compilado em uma biblioteca compartilhada. Nesse caso, é possível usar inadvertidamente um caminho de pesquisa diferente do que o vinculador de tempo de execução usaria.
Quando bibliotecas compartilhadas adicionais são necessárias, o vinculador pesquisará os diretórios na ordem listada abaixo para encontrá-las. Observe, no entanto, que isso se aplica apenas a bibliotecas adicionais necessárias para satisfazer as bibliotecas compartilhadas já incluídas. Não se aplica a bibliotecas que são incluídas por meio da opção de linha de comando -l. As pesquisas por bibliotecas -l são conduzidas apenas em diretórios especificados pela opção -L.
Quaisquer diretórios especificados pelas opções -rpath-link.
Quaisquer diretórios especificados pelas opções -rpath. A diferença entre -rpath e -rpath-link é que os diretórios especificados pelas opções -rpath são incluídos no executável e usados em tempo de execução, enquanto a opção -rpath-link é eficaz apenas no momento da vinculação. A pesquisa em -rpath desta forma é suportada apenas por vinculadores nativos e vinculadores de terceiros que foram configurados com a opção --with-sysroot.
Em um sistema ELF, para vinculadores nativos, se as opções -rpath e -rpath-link não foram usadas, pesquise o conteúdo da variável de ambiente "LD_RUN_PATH".
Em SunOS, se a opção -rpath não foi usada, pesquise quaisquer diretórios especificados usando as opções -L.
Para um vinculador nativo, pesquise o conteúdo da variável de ambiente "LD_LIBRARY_PATH".
Para um vinculador ELF nativo, os diretórios em "DT_RUNPATH" ou "DT_RPATH" de uma biblioteca compartilhada são pesquisados para bibliotecas compartilhadas necessárias. As entradas "DT_RPATH" são ignoradas se as entradas "DT_RUNPATH" existirem.
Para um vinculador para um sistema Linux, se o arquivo /etc/ld.so.conf existir, a lista de diretórios encontrada nesse arquivo. Observe: o caminho para este arquivo é prefixado com o valor "sysroot", se esse valor estiver definido, e, em seguida, qualquer string "prefix" se o vinculador foi configurado com a opção --prefix=<path>.
Para um vinculador nativo em um sistema FreeBSD, quaisquer diretórios especificados pela macro "_PATH_ELF_HINTS" definida no arquivo de cabeçalho elf-hints.h.
Quaisquer diretórios especificados por um comando "SEARCH_DIR" em um script de vinculador fornecido na linha de comando, incluindo scripts especificados por -T (mas não -dT).
Os diretórios padrão, normalmente /lib e /usr/lib.
Quaisquer diretórios especificados por um plugin LDPT_SET_EXTRA_LIBRARY_PATH.
Quaisquer diretórios especificados por um comando "SEARCH_DIR" em um script de vinculador padrão.
Observe, no entanto, que em sistemas baseados em Linux existe uma ressalva adicional: se a opção --as-needed estiver ativa e uma biblioteca compartilhada for localizada que normalmente satisfaria a pesquisa e essa biblioteca não tiver uma tag DT_NEEDED para libc.so e houver uma biblioteca compartilhada posteriormente no conjunto de diretórios de pesquisa que também satisfaça a pesquisa e essa segunda biblioteca tenha uma tag DT_NEEDED para libc.so, então a segunda biblioteca será selecionada em vez da primeira.
Se a biblioteca compartilhada exigida não for encontrada, o vinculador emitirá um aviso e continuará com a vinculação.
--section-ordering-file=script
Esta opção é usada para complementar o script de vinculação atual com o mapeamento adicional de seções de entrada para seções de saída. Este arquivo deve usar a mesma sintaxe para "SECTIONS" que é usada em scripts de vinculação normais, mas não deve fazer nada além de colocar as seções de entrada nas seções de saída. @pxref{SECTIONS}
Uma segunda restrição no script de ordenação de seções é que ele pode apenas referenciar seções de saída que já são definidas pelo script de vinculação que está atualmente em uso. (Ou seja, o script de vinculação padrão ou um script especificado na linha de comando). O benefício do script de ordenação de seções, no entanto, é que as seções de entrada são mapeadas para o início das seções de saída, para que possam garantir a ordem das seções na seção de saída. Por exemplo, imagine que o script de vinculação padrão seja assim:
SECTIONS {
.text : { *(.text.hot) ; *(.text .text.*) }
.data : { *(.data.big) ; *(.data .data.*) }
}
Então, se um arquivo de ordenação de seções como este for usado:
.text : { *(.text.first) ; *(.text.z*) }
.data : { foo.o(.data.first) ; *(.data.small) }
Isso seria equivalente a um script de vinculação como este:
SECTIONS {
.text : { *(.text.first) ; *(.text.z*) ; *(.text.hot) ; *(.text .text.*) }
.data : { foo.o(.data.first) ; *(.data.small) ; *(.data.big) ; *(.data .data.*) }
}
A vantagem do arquivo de ordenação de seções é que ele pode ser usado para ordenar as seções que são importantes para o usuário, sem ter que se preocupar com outras seções ou regiões de memória, ou qualquer outra coisa.
-shared
-Bshareable
Crie uma biblioteca compartilhada. Atualmente, isso é suportado apenas em ELF, XCOFF e plataformas SunOS. No SunOS, o vinculador criará automaticamente uma biblioteca compartilhada se a opção -e não for usada e houver símbolos indefinidos na vinculação.
--sort-common
--sort-common=ascending
--sort-common=descending
Esta opção diz ao ld para classificar os símbolos comuns por alinhamento em ordem crescente ou decrescente ao colocá-los nas seções de saída apropriadas. Os alinhamentos de símbolos considerados são dezesseis bytes ou mais, oito bytes, quatro bytes, dois bytes e um byte. Isso é para evitar lacunas entre os símbolos devido a restrições de alinhamento. Se nenhuma ordem de classificação for especificada, a ordem decrescente será assumida.
--sort-section=name
Esta opção aplicará "SORT_BY_NAME" a todos os padrões de seção curinga no script de vinculação.
--sort-section=alignment
Esta opção aplicará "SORT_BY_ALIGNMENT" a todos os padrões de seção curinga no script do vinculador.
--spare-dynamic-tags=count
Esta opção especifica o número de espaços vazios a serem deixados na seção .dynamic de objetos compartilhados ELF. Espaços vazios podem ser necessários por ferramentas de pós-processamento, como o prelink. O valor padrão é 5.
--split-by-file[=size]
Semelhante a --split-by-reloc, mas cria uma nova seção de saída para cada arquivo de entrada quando o tamanho é atingido. O valor padrão para size é 1, caso não seja especificado.
--split-by-reloc[=count]
Tenta criar seções extras no arquivo de saída para que nenhuma seção de saída no arquivo contenha mais de count realocações. Isso é útil ao gerar arquivos relocáveis grandes para download em determinados kernels de tempo real com o formato de arquivo de objeto COFF; já que COFF não pode representar mais de 65535 realocações em uma única seção. Observe que isso não funcionará com formatos de arquivo de objeto que não suportam seções arbitrárias. O vinculador não dividirá seções de entrada individuais para redistribuição, portanto, se uma única seção de entrada contiver mais de count realocações, uma seção de saída conterá esse número de realocações. O valor padrão para count é 32768.
--stats[=filename]
Calcula e exibe estatísticas sobre a operação do vinculador, como tempo de execução e uso de memória.
Se o argumento de filename opcional não for fornecido, apenas informações básicas serão relatadas e enviadas para o fluxo de saída de erro padrão. Se o argumento filename for fornecido, informações estendidas serão gravadas no arquivo nomeado. Se filename for definido apenas com o símbolo, as informações estendidas serão enviadas para o fluxo de saída padrão. Se o nome do arquivo começar com +, o arquivo será aberto no modo de anexação em vez do modo de sobrescrita.
Se a opção -Map tiver sido habilitada, as informações também serão registradas no arquivo de mapa. Observe: se ambas as opções --stats e -Map tiverem argumentos de nome de arquivo e eles corresponderem, as informações serão gravadas apenas uma vez, e não duas vezes.
Se a variável de ambiente "LD_STATS" estiver definida, ela se comportará como a opção --stats. Se o valor da variável for uma string, ele será usado como o nome de um arquivo no qual as informações devem ser registradas. Caso contrário, as informações serão enviadas para o fluxo de saída padrão. Usar a variável de ambiente permite registrar estatísticas sem ter que alterar a linha de comando do vinculador. Observe: se a variável de ambiente e a opção --stats forem usadas, a opção --stats terá precedência.
As informações estendidas relatadas incluem o tempo de CPU usado e, se a chamada de função de biblioteca de sistema getrusage() estiver disponível, o uso de memória também será registrado. Essas informações são relatadas para partes individuais do processo de vinculação, que são referidas como fases. Além disso, as informações também são relatadas para uma fase especial chamada ALL, que abrange todo o processo de vinculação. Observe que as fases individuais podem conter ou se sobrepor, portanto, não se deve presumir que os recursos gerais usados pelo vinculador sejam a soma dos recursos usados pelas fases individuais.
Além disso, quando informações estendidas estão sendo relatadas, a versão do vinculador, os argumentos da linha de comando e o horário de início do vinculador também são incluídos. Isso facilita o tratamento da situação em que vários vinculadores estão sendo invocados por um sistema de construção e para identificar exatamente quais argumentos foram responsáveis pela produção das estatísticas que são relatadas.
A saída estendida tem a seguinte aparência:
Estatísticas: versão do vinculador: (GNU Binutils) 2.44.50.20250401
Estatísticas: vinculador iniciado: Quarta-feira, 2 de abril de 2025, 09:36:41
Estatísticas: args: ld -z norelro -z nomemory-seal -z no-separate-code -o a.out [...]
Estatísticas: fase tempo de CPU memória tempo do usuário tempo do sistema
Estatísticas: nome (microssegundos) (KiB) (segundos) (segundos)
Estatísticas: TUDO 390082 217740 0 0
Estatísticas: processamento ctf 12 0 0 0
Estatísticas: mesclagem de strings 1324 0 0 0
Estatísticas: análise 349 288 0 0
Estatísticas: plugins 1 0 0 0
Estatísticas: processamento de arquivos 259616 214524 0 0
Estatísticas: gravação 116493 0 0 0
--no-stats
Desativa o relatório de estatísticas de uso, caso tenha sido habilitado por meio da opção de linha de comando --stats ou da variável de ambiente LD_STATS.
--sysroot=diretório
Usa o diretório como a localização do sysroot, substituindo o padrão configurado no momento da configuração. Esta opção é suportada apenas por vinculadores que foram configurados usando --with-sysroot.
--task-link
Isto é usado por destinos baseados em COFF/PE para criar um arquivo de objeto vinculado por tarefa, onde todos os símbolos globais foram convertidos em estáticos.
--traditional-format
Para alguns destinos, a saída de ld é diferente em alguns aspectos da saída de alguns vinculadores existentes. Esta opção solicita que ld use o formato tradicional em vez disso.
Por exemplo, no SunOS, ld combina entradas duplicadas na tabela de strings de símbolos. Isso pode reduzir o tamanho de um arquivo de saída com informações de depuração completas em mais de 30%. Infelizmente, o programa SunOS "dbx" não consegue ler o programa resultante ("gdb" não tem problemas). A opção --traditional-format diz a ld para não combinar entradas duplicadas.
--section-start=nome_da_seção=org
Localiza uma seção no arquivo de saída no endereço absoluto fornecido por org. Você pode usar esta opção quantas vezes forem necessárias para localizar várias seções na linha de comando. org deve ser um único inteiro hexadecimal; para compatibilidade com outros vinculadores, você pode omitir o "0x" inicial geralmente associado a valores hexadecimais. Observação: não deve haver espaço em branco entre nome_da_seção, o sinal de igual (=) e org.
--image-base=org
Quando usado com ELF, é o mesmo que -Ttext-segment, com ambas as opções definindo efetivamente o endereço base do executável ELF.
Quando usado com PE, use o valor como o endereço base do seu programa ou DLL. Esta é a menor localização de memória que será usada quando seu programa ou DLL for carregado. Para reduzir a necessidade de realocação e melhorar o desempenho de suas DLLs, cada uma deve ter um endereço base exclusivo e não se sobrepor a nenhuma outra DLL. O padrão é 0x400000 para executáveis e 0x10000000 para DLLs.
-Tbss=org
-Tdata=org
-Ttext=org
É o mesmo que --section-start, com ".bss", ".data" ou ".text" como o nome da seção.
-Ttext-segment=org
Ao criar um executável ELF, ele definirá o endereço do primeiro byte do primeiro segmento. Observe que, quando -pie é usado com -Ttext-segment=org, o executável de saída é marcado como ET_EXEC para que o endereço do primeiro byte do segmento de texto seja garantido como org em tempo de execução.
-Trodata-segment=org
Ao criar um executável ELF ou objeto compartilhado para um destino onde os dados somente leitura estão em seu próprio segmento separado do texto executável, ele definirá o endereço do primeiro byte do segmento de dados somente leitura.
-Tldata-segment=org
Ao criar um executável ELF ou objeto compartilhado para o modelo de memória média x86-64, ele definirá o endereço do primeiro byte do segmento ldata.
--unresolved-symbols=method
Determine como lidar com símbolos não resolvidos. Existem quatro valores possíveis para o método:
ignore-all
Não relatar nenhum símbolo não resolvido.
report-all
Relatar todos os símbolos não resolvidos. Este é o padrão.
ignore-in-object-files
Relatar símbolos não resolvidos que estão contidos em bibliotecas compartilhadas, mas ignorá-los se vierem de arquivos de objeto regulares.
ignore-in-shared-libs
Relatar símbolos não resolvidos que vêm de arquivos de objeto regulares, mas ignorá-los se vierem de bibliotecas compartilhadas. Isso pode ser útil ao criar um binário dinâmico e é conhecido que todas as bibliotecas compartilhadas que devem ser referenciadas estão incluídas na linha de comando do vinculador.
O comportamento para bibliotecas compartilhadas por si só também pode ser controlado pela opção --[no-]allow-shlib-undefined.
Normalmente, o vinculador gerará uma mensagem de erro para cada símbolo não resolvido relatado, mas a opção --warn-unresolved-symbols pode alterar isso para um aviso.
--dll-verbose
--verbose[=NUMBER]
Exibir o número da versão para ld e listar as emulações do vinculador suportadas. Exibir quais arquivos de entrada podem e não podem ser abertos. Exibir o script do vinculador usado pelo vinculador. Se o argumento NUMBER opcional for > 1, o status do símbolo do plugin também será exibido.
--version-script=version-scriptfile
Especifique o nome de um script de versão para o vinculador. Isso é normalmente usado ao criar bibliotecas compartilhadas para especificar informações adicionais sobre a hierarquia de versão da biblioteca que está sendo criada. Esta opção é totalmente suportada apenas em plataformas ELF que suportam bibliotecas compartilhadas; consulte VERSION. É parcialmente suportado em plataformas PE, que podem usar scripts de versão para filtrar a visibilidade dos símbolos no modo de exportação automática: quaisquer símbolos marcados como locais no script de versão não serão exportados.
--warn-common
Adverte quando um símbolo comum é combinado com outro símbolo comum ou com uma definição de símbolo.
Os linkers Unix permitem essa prática um tanto descuidada, mas os linkers em alguns outros sistemas operacionais
não permitem. Esta opção permite encontrar problemas potenciais decorrentes da combinação de símbolos globais.
Infelizmente, algumas bibliotecas C usam essa prática, então você pode receber alguns avisos sobre símbolos
nas bibliotecas, bem como em seus programas.
Existem três tipos de símbolos globais, ilustrados aqui por exemplos em C:
int i = 1;
Uma definição, que vai na seção de dados inicializados do arquivo de saída.
extern int i;
Uma referência não definida, que não aloca espaço. Deve haver ou uma definição ou um símbolo comum para a variável em algum lugar.
int i;
Um símbolo comum. Se houver apenas (um ou mais) símbolos comuns para uma variável, ele vai
para a área de dados não inicializados do arquivo de saída. O linker mescla vários símbolos comuns
para a mesma variável em um único símbolo. Se eles tiverem tamanhos diferentes, ele
escolhe o maior tamanho. O linker transforma um símbolo comum em uma declaração, se houver
uma definição da mesma variável.
A opção --warn-common pode produzir cinco tipos de avisos. Cada aviso consiste em um par
de linhas: a primeira descreve o símbolo encontrado e a segunda descreve o símbolo anterior encontrado com o mesmo nome.
Um ou ambos os dois símbolos serão um símbolo comum.
Transformando um símbolo comum em uma referência, porque já existe uma definição para o
símbolo.
<file>(<section>): aviso: símbolo comum de '<symbol>'
substituído por definição
<file>(<section>): aviso: definido aqui
Transformando um símbolo comum em uma referência, porque uma definição posterior para o
símbolo é encontrada. Este é o mesmo que o caso anterior, exceto que os símbolos são
encontrados em uma ordem diferente.
<file>(<section>): aviso: definição de '<symbol>'
substituindo o símbolo comum
<file>(<section>): aviso: símbolo comum está aqui
Mesclando um símbolo comum com um símbolo comum anterior do mesmo tamanho.
<file>(<section>): aviso: múltiplos símbolos comuns
de '<symbol>'
<file>(<section>): aviso: símbolo comum anterior está aqui
Mesclando um símbolo comum com um símbolo comum anterior maior.
<file>(<section>): aviso: símbolo comum de '<symbol>'
substituído por um símbolo comum maior
<file>(<section>): aviso: símbolo comum maior está aqui
Mesclando um símbolo comum com um símbolo comum anterior menor. Este é o mesmo que o
caso anterior, exceto que os símbolos são encontrados em uma ordem diferente.
<file>(<section>): aviso: comum de `<symbol>'
substituindo um comum menor
<file>(<section>): aviso: o comum menor está aqui
--warn-constructors
Emite um aviso se algum construtor global for usado. Isso só é útil para alguns formatos de arquivo de objeto.
Para formatos como COFF ou ELF, o vinculador não pode detectar o uso de construtores globais.
--warn-execstack
--warn-execstack-objects
--no-warn-execstack
Em plataformas ELF, o vinculador pode gerar mensagens de aviso se for solicitado a criar um arquivo de saída que contenha uma pilha executável.
Existem três estados possíveis:
Não gerar avisos.
Sempre gerar avisos, mesmo que a pilha executável seja solicitada por meio da opção de linha de comando -z execstack.
Gerar um aviso somente se um arquivo de objeto solicitar uma pilha executável, mas não se a opção -z execstack for usada.
O estado padrão depende de como o vinculador foi configurado quando foi compilado. A opção --no-warn-execstack sempre coloca o vinculador no estado sem avisos. A opção --warn-execstack coloca o vinculador no estado de aviso sempre. A opção --warn-execstack-objects coloca o vinculador no estado de aviso apenas para arquivos de objeto.
Observação: arquivos de entrada no formato ELF podem especificar que precisam de uma pilha executável, tendo uma seção .note.GNU-stack com o bit executável definido em seus sinalizadores de seção. Eles podem especificar que não precisam de uma pilha executável, tendo a mesma seção, mas sem o bit de sinalização executável definido. Se um arquivo de entrada não tiver uma seção .note.GNU-stack, o comportamento padrão é específico do destino. Para alguns destinos, a ausência de tal seção implica que uma pilha executável é necessária. Este é frequentemente um problema para arquivos assembly criados manualmente.
--error-execstack
--no-error-execstack
Se o vinculador for gerar uma mensagem de aviso sobre uma pilha executável, a opção --error-execstack, em vez disso, converterá esse aviso em um erro. Observe que esta opção não altera o estado de geração de avisos de pilha executável do vinculador. Use --warn-execstack ou --warn-execstack-objects para definir um estado de aviso específico.
A opção --no-error-execstack restaurará o comportamento padrão de gerar mensagens de aviso.
--warn-multiple-gp
Emite um aviso se vários valores de ponteiro global forem necessários no arquivo de saída. Isso só tem significado para alguns processadores, como o Alpha. Especificamente, alguns processadores colocam constantes de valor grande em uma seção especial. Um registro especial (o ponteiro global) aponta para o meio desta seção, para que as constantes possam ser carregadas de forma eficiente por meio de um modo de endereçamento relativo ao registro base. Como o deslocamento no modo de endereçamento relativo ao registro base é fixo e relativamente pequeno (por exemplo, 16 bits), isso limita o tamanho máximo do pool de constantes. Assim, em programas grandes, geralmente é necessário usar vários valores de ponteiro global para poder endereçar todas as constantes possíveis. Esta opção faz com que um aviso seja emitido sempre que isso ocorrer.
--warn-once
Apenas exibir um aviso para cada símbolo não definido, em vez de um aviso por módulo que se refere a ele.
--warn-rwx-segments
--no-warn-rwx-segments
Exibir um aviso se o vinculador criar um segmento carregável, de tamanho diferente de zero, que tenha todas as três flags de permissão de leitura, gravação e execução definidas. Esse segmento representa uma possível vulnerabilidade de segurança. Além disso, avisos serão gerados se um segmento de armazenamento local de thread for criado com a flag de permissão de execução definida, independentemente de ter ou não as flags de leitura e/ou gravação definidas.
Esses avisos são habilitados por padrão. Eles podem ser desabilitados por meio da opção --no-warn-rwx-segments e reabilitados por meio da opção --warn-rwx-segments.
--error-rwx-segments
--no-error-rwx-segments
Se o vinculador for gerar uma mensagem de aviso sobre um segmento executável, gravável ou um segmento TLS executável, a opção --error-rwx-segments converterá esse aviso em um erro. A opção --no-error-rwx-segments restaurará o comportamento padrão de apenas gerar uma mensagem de aviso.
Observe que a opção --error-rwx-segments por si só não ativa os avisos sobre esses segmentos. Esses avisos são ativados por padrão, caso o vinculador tenha sido configurado dessa forma, ou por meio da opção de linha de comando --warn-rwx-segments.
--warn-section-align
Exibir um aviso se o endereço de uma seção de saída for alterado devido ao alinhamento. Normalmente, o alinhamento será definido por uma seção de entrada. O endereço só será alterado se não for explicitamente especificado; ou seja, se o comando "SECTIONS" não especificar um endereço inicial para a seção.
--warn-textrel
Exibir um aviso se o vinculador adicionar DT_TEXTREL a um executável independente de posição ou objeto compartilhado.
--warn-alternate-em
Exibir um aviso se um objeto tiver um código de máquina ELF alternativo.
--warn-unresolved-symbols
Se o vinculador for relatar um símbolo não resolvido (consulte a opção --unresolved-symbols), ele normalmente gerará um erro. Esta opção faz com que ele gere um aviso em vez disso.
--error-unresolved-symbols
Isso restaura o comportamento padrão do vinculador de gerar erros ao relatar símbolos não resolvidos.
--whole-archive
Para cada arquivo de archive mencionado na linha de comando após a opção --whole-archive, inclua todos os arquivos de objeto no archive no link, em vez de pesquisar no archive os arquivos de objeto necessários. Normalmente, isso é usado para transformar um arquivo de archive em uma biblioteca compartilhada, forçando que cada objeto seja incluído na biblioteca compartilhada resultante. Esta opção pode ser usada mais de uma vez.
Duas observações ao usar esta opção no gcc: Primeiro, o gcc não tem conhecimento desta opção, portanto, você deve usar -Wl,-whole-archive. Segundo, não se esqueça de usar -Wl,-no-whole-archive após sua lista de arquivos de archive, porque o gcc adicionará sua própria lista de arquivos de archive ao seu link e você pode não querer que essa flag afete esses arquivos.
--wrap=symbol
Use uma função wrapper para o símbolo. Qualquer referência indefinida para o símbolo será resolvida para "__wrap_symbol". Qualquer referência indefinida para "__real_symbol" será resolvida para o símbolo.
Isso pode ser usado para fornecer um wrapper para uma função do sistema. A função wrapper deve ser chamada "__wrap_symbol". Se ela quiser chamar a função do sistema, ela deve chamar "__real_symbol".
Aqui está um exemplo trivial:
void *
__wrap_malloc (size_t c)
{
printf ("malloc chamado com %zu\n", c);
return __real_malloc (c);
}
Se você vincular outro código a este arquivo usando --wrap malloc, então todas as chamadas para "malloc"
irão chamar a função "__wrap_malloc" em vez disso. A chamada para "__real_malloc" em "__wrap_malloc"
irá chamar a função "malloc" real.
Você pode querer fornecer uma função "__real_malloc" também, para que as vinculações sem a opção --wrap
tenham sucesso. Se você fizer isso, você não deve colocar a definição de "__real_malloc" no mesmo
arquivo que "__wrap_malloc"; se você fizer isso, o assembler pode resolver a chamada antes que o
linker tenha a chance de fazer o wrap para "malloc".
Apenas referências indefinidas são substituídas pelo linker. Então, referências internas da unidade de
tradução para o símbolo não são resolvidas para "__wrap_symbol". No próximo exemplo, a chamada para
"f" em "g" não é resolvida para "__wrap_f".
int
f (void)
{
return 123;
}
int
g (void)
{
return f();
}
--eh-frame-hdr
--no-eh-frame-hdr
Solicita (--eh-frame-hdr) ou suprime (--no-eh-frame-hdr) a criação da seção ".eh_frame_hdr" e do cabeçalho de segmento ELF "PT_GNU_EH_FRAME".
--no-ld-generated-unwind-info
Solicita a criação de informações de "desenrolamento" ".eh_frame" para seções de código geradas pelo linker, como PLT. Esta opção está ativada por padrão se as informações de "desenrolamento" geradas pelo linker forem suportadas. Esta opção também controla a geração de informações de rastreamento de pilha ".sframe" para seções de código geradas pelo linker, como PLT.
--enable-new-dtags
--disable-new-dtags
Este linker pode criar as novas tags dinâmicas em ELF. Mas os sistemas ELF mais antigos podem não entendê-las. Se você especificar --enable-new-dtags, as novas tags dinâmicas serão criadas conforme necessário e as tags dinâmicas mais antigas serão omitidas. Se você especificar --disable-new-dtags, nenhuma nova tag dinâmica será criada. Por padrão, as novas tags dinâmicas não são criadas. Observe que essas opções estão disponíveis apenas para sistemas ELF.
--hash-size=number
Define o tamanho padrão das tabelas hash do linker para um número primo próximo a number. Aumentar este valor pode reduzir o tempo que o linker leva para executar suas tarefas, em troca de aumentar os requisitos de memória do linker. Da mesma forma, reduzir este valor pode reduzir os requisitos de memória em troca de velocidade. O valor padrão é 4051 em circunstâncias normais e 1021 se a opção de linha de comando --reduce-memory-overheads for usada.
--hash-style=style
Define o tipo da tabela de hash do vinculador. style pode ser "sysv" para a seção ELF clássica ".hash", "gnu" para a nova seção GNU ".gnu.hash" ou "both" para ambas as tabelas de hash, a seção ELF clássica ".hash" e a nova seção GNU ".gnu.hash". O padrão depende de como o vinculador foi configurado, mas para a maioria dos sistemas baseados em Linux, será "both".
--compress-debug-sections=none
--compress-debug-sections=zlib
--compress-debug-sections=zlib-gnu
--compress-debug-sections=zlib-gabi
--compress-debug-sections=zstd
Em plataformas ELF, essas opções controlam como as seções de depuração DWARF são compactadas usando zlib.
--compress-debug-sections=none não compacta as seções de depuração DWARF.
--compress-debug-sections=zlib-gnu compacta as seções de depuração DWARF e as renomeia para que comecem com .zdebug em vez de .debug. --compress-debug-sections=zlib-gabi também compacta as seções de depuração DWARF, mas, em vez de renomeá-las, define o sinalizador SHF_COMPRESSED nos cabeçalhos das seções.
A opção --compress-debug-sections=zlib é um alias para --compress-debug-sections=zlib-gabi.
--compress-debug-sections=zstd compacta as seções de depuração DWARF usando zstd.
Observe que esta opção substitui qualquer compactação nas seções de depuração de entrada, portanto, se um binário for vinculado com --compress-debug-sections=none, por exemplo, quaisquer seções de depuração compactadas nos arquivos de entrada serão descompactadas antes de serem copiadas para o binário de saída.
O comportamento padrão de compactação varia dependendo do destino e das opções de configuração usadas para construir o conjunto de ferramentas. O padrão pode ser determinado examinando a saída da opção --help do vinculador.
--reduce-memory-overheads
Esta opção reduz os requisitos de memória em tempo de execução do ld, às custas da velocidade de vinculação. Isso foi introduzido para selecionar o algoritmo antigo O(n^2) para a geração de arquivos de mapa de vínculo, em vez do novo algoritmo O(n) que usa cerca de 40% mais de memória para armazenamento de símbolos.
Outro efeito da opção é definir o tamanho padrão da tabela de hash para 1021, o que também economiza memória à custa de aumentar o tempo de execução do vinculador. No entanto, isso não é feito se a opção --hash-size foi usada.
A opção --reduce-memory-overheads também pode ser usada para habilitar outros compromissos em versões futuras do vinculador.
--max-cache-size=size
ld normalmente armazena em cache as informações de realocação e as tabelas de símbolos dos arquivos de entrada na memória com tamanho ilimitado. Esta opção define o tamanho máximo do cache para size. Observe que, se a opção de linha de comando --no-keep-memory foi usada, o vinculador atuará como se o tamanho máximo do cache estivesse definido como 0, ou seja, nada é retido.
--build-id
--build-id=style
Solicita a criação de uma seção de anotação ELF ".note.gnu.build-id" ou uma seção COFF ".buildid". O conteúdo da anotação são bits exclusivos que identificam este arquivo vinculado. style pode ser "uuid" para usar 128 bits aleatórios; "sha1" para usar um hash SHA1 de 160 bits, "md5" para usar um hash MD5 de 128 bits ou "xx" para usar um XXHASH de 128 bits nas partes normativas do conteúdo de saída; ou "0xhexstring" para usar uma string de bits escolhida especificada como um número par de dígitos hexadecimais ("-" e ":" entre os pares de dígitos são ignorados). Se style for omitido, "sha1" será usado.
Os estilos "md5", "sha1" e "xx" produzem um identificador que é sempre o mesmo em um arquivo de saída idêntico, mas é quase certamente único entre todos os arquivos de saída não idênticos. Não se destina a ser comparado como uma soma de verificação do conteúdo do arquivo. Um arquivo vinculado pode ser alterado posteriormente por outras ferramentas, mas a string de bits de ID de compilação que identifica o arquivo vinculado original não muda.
Passar "none" para o estilo desabilita a configuração de quaisquer opções "--build-id" anteriores na linha de comando.
--package-metadata=JSON
Solicita a criação de uma seção de anotação ELF ".note.package". O conteúdo da anotação está em formato JSON, conforme a especificação de metadados do pacote. Para obter mais informações, consulte: https://systemd.io/ELF_PACKAGE_METADATA/. O argumento JSON suporta codificação percentual e codificação de sequência %[string] (onde string se refere ao nome nas Referências de Caracteres Nomeadas do HTML): %[comma] para ,, %[lbrace] para {, %[quot] para ", %[rbrace] para } e %[space] para o caractere de espaço. Se o argumento JSON estiver ausente/vazio, isso desativará a criação da anotação de metadados, se uma tiver sido habilitada por uma ocorrência anterior da opção --package-metadata. Se o vinculador foi compilado com libjansson, a string JSON será validada.
O vinculador PE i386 suporta a opção -shared, que faz com que a saída seja uma biblioteca vinculada dinamicamente (DLL) em vez de um executável normal. Você deve nomear a saída como "*.dll" quando usar esta opção. Além disso, o vinculador suporta totalmente os arquivos "*.def" padrão, que podem ser especificados na linha de comando do vinculador como um arquivo de objeto (na verdade, deve preceder os arquivos de onde ele exporta símbolos, para garantir que eles sejam vinculados, assim como um arquivo de objeto normal).
Além das opções comuns a todos os destinos, o vinculador PE i386 suporta opções de linha de comando adicionais que são específicas para o destino PE i386. As opções que recebem valores podem ser separadas de seus valores por um espaço ou um sinal de igual.
--add-stdcall-alias
Se fornecido, os símbolos com um sufixo stdcall (@nn) serão exportados como estão e também com o sufixo removido. [Esta opção é específica para a porta do vinculador direcionada ao PE i386]
--base-file file
Use o arquivo como o nome de um arquivo no qual salvar os endereços base de todas as realocações necessárias para gerar DLLs com dlltool. [Esta é uma opção específica do PE i386]
--dll
Crie uma DLL em vez de um executável normal. Você também pode usar -shared ou especificar um "LIBRARY" em um determinado arquivo ".def". [Esta opção é específica para a porta do vinculador direcionada ao PE i386]
--enable-long-section-names
--disable-long-section-names
As variantes PE do formato de objeto COFF adicionam uma extensão que permite o uso de nomes de seção com mais de oito caracteres, que é o limite normal para COFF. Por padrão, esses nomes só são permitidos em arquivos de objeto, pois as imagens executáveis totalmente vinculadas não contêm a tabela de strings COFF necessária para suportar os nomes mais longos. Como uma extensão GNU, é possível permitir seu uso em imagens executáveis ou, possivelmente desnecessariamente, desativá-lo em arquivos de objeto, usando essas duas opções. As imagens executáveis geradas com esses nomes de seção longos são ligeiramente não padronizadas, pois contêm uma tabela de strings, e podem gerar resultados confusos quando examinadas com ferramentas não GNU compatíveis com PE, como visualizadores e despejadores de arquivos. No entanto, o GDB depende do uso de nomes de seção PE longos para encontrar seções de informações de depuração Dwarf-2 em uma imagem executável em tempo de execução, e, portanto, se nenhuma das opções for especificada na linha de comando, o ld habilitará os nomes de seção longos, substituindo o comportamento padrão e tecnicamente correto, quando encontrar a presença de informações de depuração ao vincular uma imagem executável e não remover símbolos. [Esta opção é válida para todas as portas do vinculador que têm como alvo o PE]
--enable-stdcall-fixup
--disable-stdcall-fixup
Se o vinculador encontrar um símbolo que não consegue resolver, ele tentará fazer uma "vinculação difusa" procurando por outro símbolo definido que difere apenas no formato do nome do símbolo (cdecl vs. stdcall) e resolverá esse símbolo vinculando-o à correspondência. Por exemplo, o símbolo indefinido "_foo" pode ser vinculado à função "_foo@12", ou o símbolo indefinido "_bar@16" pode ser vinculado à função "_bar". Quando o vinculador faz isso, ele imprime um aviso, pois normalmente deveria ter falhado ao vincular, mas, às vezes, as bibliotecas de importação geradas a partir de DLLs de terceiros podem precisar que esse recurso seja utilizável. Se você especificar --enable-stdcall-fixup, esse recurso será totalmente habilitado e os avisos não serão impressos. Se você especificar --disable-stdcall-fixup, esse recurso será desabilitado e essas incompatibilidades serão consideradas erros. [Esta opção é específica para a porta do vinculador i386 que tem como alvo o PE]
--leading-underscore
--no-leading-underscore
Para a maioria dos destinos, o prefixo de símbolo padrão é um sublinhado e é definido na descrição do destino. Com esta opção, é possível desativar/habilitar o prefixo de símbolo sublinhado padrão.
--export-all-symbols
Se fornecida, todos os símbolos globais nos objetos usados para construir uma DLL serão exportados pela DLL. Observe que este é o padrão se não houver outros símbolos exportados. Quando os símbolos são explicitamente exportados por meio de arquivos DEF ou implicitamente exportados por meio de atributos de função, o padrão é não exportar mais nada, a menos que esta opção seja fornecida. Observe que os símbolos "DllMain@12", "DllEntryPoint@0", "DllMainCRTStartup@12" e "impure_ptr" não serão exportados automaticamente. Além disso, os símbolos importados de outras DLLs não serão reexportados, nem os símbolos que especificam o layout interno da DLL, como aqueles que começam com "_head_" ou terminam com "_iname". Além disso, nenhum símbolo de "libgcc", "libstd++", "libmingw32" ou "crtX.o" será exportado. Os símbolos cujos nomes começam com "__rtti_" ou "__builtin_" não serão exportados, para ajudar com DLLs C++. Finalmente, existe uma extensa lista de símbolos privados do Cygwin que não são exportados (obviamente, isso se aplica ao construir DLLs para destinos Cygwin). Esses exclusões do Cygwin são: "_cygwin_dll_entry@12", "_cygwin_crt0_common@8", "_cygwin_noncygwin_dll_entry@12", "_fmode", "_impure_ptr", "cygwin_attach_dll", "cygwin_premain0", "cygwin_premain1", "cygwin_premain2", "cygwin_premain3" e "environ". [Esta opção é específica para a porta do vinculador i386 que tem como alvo o PE]
--exclude-symbols símbolo,símbolo,...
Especifica uma lista de símbolos que não devem ser exportados automaticamente. Os nomes dos símbolos podem ser delimitados por vírgulas ou dois pontos. [Esta opção é específica para a porta do vinculador direcionada ao i386 PE]
--exclude-all-symbols
Especifica que nenhum símbolo deve ser exportado automaticamente. [Esta opção é específica para a porta do vinculador direcionada ao i386 PE]
--file-alignment
Especifica o alinhamento do arquivo. As seções no arquivo sempre começarão em deslocamentos de arquivo que são múltiplos deste número. O padrão é 512. [Esta opção é específica para a porta do vinculador direcionada ao i386 PE]
--heap reserve
--heap reserve,commit
Especifica o número de bytes de memória a serem reservados (e, opcionalmente, alocados) para serem usados como heap para este programa. O padrão é 1 MB reservado, 4 KB alocado. [Esta opção é específica para a porta do vinculador direcionada ao i386 PE]
--kill-at
Se fornecido, os sufixos stdcall (@nn) serão removidos dos símbolos antes que eles sejam exportados. [Esta opção é específica para a porta do vinculador direcionada ao i386 PE]
--large-address-aware
Se fornecido, o bit apropriado no campo "Características" do cabeçalho COFF é definido para indicar que este executável suporta endereços virtuais maiores que 2 gigabytes. Isso deve ser usado em conjunto com a opção /3GB ou /USERVA=valor megabytes na seção "[sistemas operacionais]" do BOOT.INI. Caso contrário, este bit não terá efeito. [Esta opção é específica para as portas do vinculador direcionadas ao PE]
--disable-large-address-aware
Reverte o efeito de uma opção --large-address-aware anterior. Isso é útil se --large-address-aware for sempre definido pelo driver do compilador (por exemplo, Cygwin gcc) e o executável não suportar endereços virtuais maiores que 2 gigabytes. [Esta opção é específica para as portas do vinculador direcionadas ao PE]
--major-image-version valor
Define o número principal da "versão da imagem". O padrão é 1. [Esta opção é específica para a porta do vinculador direcionada ao i386 PE]
--major-os-version valor
Define o número principal da "versão do sistema operacional". O padrão é 4. [Esta opção é específica para a porta i386 PE do vinculador]
--major-subsystem-version valor
Define o número principal da "versão do subsistema". O padrão é 4. [Esta opção é específica para a porta i386 PE do vinculador]
--minor-image-version valor
Define o número secundário da "versão da imagem". O padrão é 0. [Esta opção é específica para a porta i386 PE do vinculador]
--minor-os-version valor
Define o número secundário da "versão do sistema operacional". O padrão é 0. [Esta opção é específica para a porta i386 PE do vinculador]
--minor-subsystem-version valor
Define o número secundário da "versão do subsistema". O padrão é 0. [Esta opção é específica para a porta i386 PE do vinculador]
--output-def arquivo
O vinculador criará o arquivo arquivo que conterá um arquivo DEF correspondente à DLL que o vinculador está gerando. Este arquivo DEF (que deve ser chamado "*.def") pode ser usado para criar uma biblioteca de importação com "dlltool" ou pode ser usado como referência para símbolos exportados automática ou implicitamente. [Esta opção é específica para a porta i386 PE do vinculador]
--enable-auto-image-base
--enable-auto-image-base=valor
Escolha automaticamente a base da imagem para DLLs, opcionalmente começando com o valor base, a menos que uma seja especificada usando o argumento "--image-base". Ao usar um hash gerado a partir do nome da DLL para criar bases de imagem exclusivas para cada DLL, evitam-se colisões na memória e realocações que podem atrasar a execução do programa. [Esta opção é específica para a porta i386 PE do vinculador]
--disable-auto-image-base
Não gere automaticamente uma base de imagem exclusiva. Se não houver uma base de imagem especificada pelo usuário ("--image-base"), use o padrão da plataforma. [Esta opção é específica para a porta i386 PE do vinculador]
--dll-search-prefix string
Ao vincular dinamicamente a uma DLL sem uma biblioteca de importação, procure por "<string><nome_base>.dll" em vez de "lib<nome_base>.dll". Este comportamento permite distinguir facilmente entre DLLs criadas para as várias "subplataformas": nativa, Cygwin, UWin, PW, etc. Por exemplo, as DLLs Cygwin geralmente usam "--dll-search-prefix=cyg". [Esta opção é específica para a porta i386 PE do vinculador]
--enable-auto-import
Realize a vinculação sofisticada de "_symbol" para "__imp__symbol" para importações de dados de DLLs, permitindo, assim, contornar o mecanismo dllimport no lado do usuário e referenciar nomes de símbolos não "mangled". [Esta opção é específica para a porta i386 PE do vinculador]
As seguintes observações dizem respeito à implementação original do recurso e estão desatualizadas hoje em dia para os destinos Cygwin e MinGW.
Observação: O uso da extensão 'auto-import' fará com que a seção de texto do arquivo de imagem seja tornada gravável. Isso não está em conformidade com a especificação PE-COFF publicada pela Microsoft.
Observe que o uso da extensão 'auto-import' também fará com que dados somente leitura, que normalmente seriam colocados na seção .rdata, sejam colocados na seção .data. Isso é para contornar um problema com constantes que é descrito aqui: http://www.cygwin.com/ml/cygwin/2004-09/msg01101.html
O uso de 'auto-import' geralmente "funcionará" — mas, às vezes, você pode ver esta mensagem:
"A variável '<var>' não pode ser importada automaticamente. Consulte a documentação do "--enable-auto-import" do ld para obter detalhes."
Esta mensagem ocorre quando alguma (sub)expressão acessa um endereço que, em última análise, é dado pela soma de duas constantes (as tabelas de importação do Win32 permitem apenas uma). Exemplos de onde isso pode ocorrer incluem acessos a campos de variáveis de estrutura importadas de uma DLL, bem como o uso de um índice constante em uma variável de matriz importada de uma DLL. Qualquer variável de vários bytes (matrizes, estruturas, long long, etc.) pode acionar essa condição de erro. No entanto, independentemente do tipo de dados exato da variável exportada que causa o problema, o ld sempre detectará, emitirá o aviso e sairá.
Existem várias maneiras de resolver essa dificuldade, independentemente do tipo de dados da variável exportada:
Uma maneira é usar a opção --enable-runtime-pseudo-reloc. Isso deixa a tarefa de ajustar as referências em seu código cliente para o ambiente de tempo de execução, portanto, este método funciona apenas quando o ambiente de tempo de execução oferece suporte a esse recurso.
Uma segunda solução é forçar uma das "constantes" a ser uma variável — ou seja, desconhecida e não otimizável em tempo de compilação. Para matrizes, existem duas possibilidades: a) tornar o indexador (o endereço da matriz) uma variável ou b) tornar o "índice" constante uma variável. Assim:
extern type extern_array[];
extern_array[1] -->
{ volatile type *t=extern_array; t[1] }
ou
extern type extern_array[];
extern_array[1] -->
{ volatile int t=1; extern_array[t] }
Para estruturas (e a maioria dos outros tipos de dados de vários bytes), a única opção é tornar a própria estrutura (ou o long long, ou o ...) uma variável:
extern struct s extern_struct;
extern_struct.field -->
{ volatile struct s *t=&extern_struct; t->field }
ou
extern long long extern_ll;
extern_ll -->
{ volatile long long * local_ll=&extern_ll; *local_ll }
Um terceiro método para lidar com essa dificuldade é abandonar o 'auto-import' para o símbolo ofensivo e marcá-lo com "__declspec(dllimport)". No entanto, na prática, isso exige o uso de #defines em tempo de compilação para indicar se você está construindo uma DLL, construindo código de cliente que será vinculado à DLL ou simplesmente construindo/vinculando a uma biblioteca estática. Ao fazer a escolha entre os vários métodos para resolver o 'problema de endereço direto com deslocamento constante', você deve considerar o uso típico no mundo real:
Original:
--foo.h
extern int arr[];
--foo.c
#include "foo.h"
void main(int argc, char **argv){
printf("%d\n",arr[1]);
}
Solução 1:
--foo.h
extern int arr[];
--foo.c
#include "foo.h"
void main(int argc, char **argv){
/* Este ajuste é para win32 e cygwin; não "otimize" */
volatile int *parr = arr;
printf("%d\n",parr[1]);
}
Solução 2:
--foo.h
/* Observação: a exportação automática é presumida (sem __declspec(dllexport)) */
#if (defined(_WIN32) || defined(__CYGWIN__)) && \
!(defined(FOO_BUILD_DLL) || defined(FOO_STATIC))
#define FOO_IMPORT __declspec(dllimport)
#else
#define FOO_IMPORT
#endif
extern FOO_IMPORT int arr[];
--foo.c
#include "foo.h"
void main(int argc, char **argv){
printf("%d\n",arr[1]);
}
Uma quarta maneira de evitar este problema é reescrever sua biblioteca para usar uma
interface funcional em vez de uma interface de dados para as variáveis problemáticas (por exemplo, funções de acesso set_foo() e get_foo()).
--disable-auto-import
Não tente fazer o mapeamento sofisticado de "\_symbol" para "\_\_imp\_\_symbol" para importações de DADOS
de DLLs. [Esta opção é específica para a porta i386 PE do vinculador]
--enable-runtime-pseudo-reloc
Se o seu código contiver expressões descritas na seção --enable-auto-import, ou seja, importações de DADOS
de DLL com deslocamento diferente de zero, esta opção criará um vetor de "relocações pseudo em tempo de execução"
que podem ser usadas pelo ambiente de tempo de execução para ajustar as referências a esses dados em
seu código cliente. [Esta opção é específica para a porta i386 PE do vinculador]
--disable-runtime-pseudo-reloc
Não crie pseudo-relocações para importações de DADOS de DLL com deslocamento diferente de zero. [Esta opção é
específica para a porta i386 PE do vinculador]
--enable-extra-pe-debug
Mostre informações de depuração adicionais relacionadas ao mapeamento de símbolos de importação automática. [Esta opção é
específica para a porta i386 PE do vinculador]
--section-alignment
Define o alinhamento da seção. As seções na memória sempre começarão em endereços que são um múltiplo deste número. O padrão é 0x1000. [Esta opção é
específica para a porta i386 PE do vinculador]
--stack reserve
--stack reserve,commit
Especifique o número de bytes de memória a serem reservados (e, opcionalmente, alocados) para serem usados como pilha
para este programa. O padrão é 2 MB reservados, 4 KB alocados. [Esta opção é específica para a porta i386 PE do vinculador]
--subsystem which
--subsystem which:major
--subsystem which:major.minor
Especifica o subsistema sob o qual seu programa será executado. Os valores legais para which são "native", "windows", "console", "posix" e "xbox". Você pode definir opcionalmente a
versão do subsistema também. Valores numéricos também são aceitos para which. [Esta opção é
específica para a porta i386 PE do vinculador]
As seguintes opções definem flags no campo "DllCharacteristics" do cabeçalho do arquivo PE:
[Estas opções são específicas para as portas PE do vinculador]
--high-entropy-va
--disable-high-entropy-va
A imagem é compatível com o layout de randomização de endereço (ASLR) de 64 bits. Esta opção está habilitada por padrão para imagens PE de 64 bits em alvos MinGW.
Esta opção também implica --dynamicbase e --enable-reloc-section.
--dynamicbase
--disable-dynamicbase
O endereço base da imagem pode ser realocado usando a randomização de espaço de endereço (ASLR). Este recurso foi introduzido com o MS Windows Vista para alvos PE i386. Esta opção está habilitada por padrão para alvos MinGW, mas pode ser desabilitada por meio da opção --disable-dynamicbase. Esta opção também implica --enable-reloc-section.
--forceinteg
--disable-forceinteg
As verificações de integridade do código são aplicadas. Esta opção está desabilitada por padrão.
--nxcompat
--disable-nxcompat
A imagem é compatível com a prevenção de execução de dados (DEP). Este recurso foi introduzido com o MS Windows XP SP2 para alvos PE i386. A opção está habilitada por padrão para alvos MinGW.
--no-isolation
--disable-no-isolation
Embora a imagem entenda o isolamento, não isole a imagem. Esta opção está desabilitada por padrão.
--no-seh
--disable-no-seh
A imagem não usa SEH. Nenhum manipulador SE pode ser chamado desta imagem. Esta opção está desabilitada por padrão.
--no-bind
--disable-no-bind
Não vincule esta imagem. Esta opção está desabilitada por padrão.
--wdmdriver
--disable-wdmdriver
O driver usa o Modelo de Driver do Windows. Esta opção está desabilitada por padrão.
--tsaware
--disable-tsaware
A imagem está ciente do Terminal Server. Esta opção está desabilitada por padrão.
--insert-timestamp
--no-insert-timestamp
Insira um timestamp real na imagem. Este é o comportamento padrão, pois corresponde ao código legado e significa que a imagem funcionará com outras ferramentas proprietárias. O problema com este padrão é que ele resultará na produção de imagens ligeiramente diferentes cada vez que as mesmas fontes forem vinculadas. A opção --no-insert-timestamp pode ser usada para inserir um valor zero para o timestamp, garantindo que os binários produzidos a partir de fontes idênticas sejam comparáveis de forma idêntica.
Se --insert-timestamp estiver ativo, o tempo inserido será o tempo em que a vinculação ocorre ou, se a variável de ambiente "SOURCE_DATE_EPOCH" estiver definida, o número de segundos desde a época Unix, conforme especificado por essa variável.
--enable-reloc-section
--disable-reloc-section
Crie a tabela de realocação de base, que é necessária se a imagem for carregada em um endereço base diferente do especificado no cabeçalho PE. Esta opção está habilitada por padrão.
O alvo uClinux C6X usa um formato binário chamado DSBT para suportar bibliotecas compartilhadas. Cada biblioteca compartilhada no sistema precisa ter um índice exclusivo; todos os executáveis usam um índice de 0.
--dsbt-size size
Esta opção define o número de entradas na DSBT do executável ou biblioteca compartilhada atual para o tamanho especificado. O padrão é criar uma tabela com 64 entradas.
--dsbt-index index
Esta opção define o índice DSBT do executável ou biblioteca compartilhada atual para index. O valor padrão é 0, que é apropriado para gerar executáveis. Se uma biblioteca compartilhada for gerada com um índice DSBT de 0, as relocações "R_C6000_DSBT_INDEX" serão copiadas para o arquivo de saída.
A opção --no-merge-exidx-entries desativa a mesclagem de entradas exidx adjacentes nas informações de descompactação de quadros.
--branch-stub
Esta opção habilita o relaxamento de ramificações do vinculador, inserindo seções de stub de ramificação quando necessário para estender o alcance das ramificações. Esta opção geralmente não é necessária, pois o C-SKY suporta instruções de ramificação e chamada que podem acessar toda a faixa de memória e o relaxamento de ramificações normalmente é tratado pelo compilador ou montador.
--stub-group-size=N
Esta opção permite um controle mais preciso da criação de stubs de ramificação do vinculador. Ela define o tamanho máximo de um grupo de seções de entrada que podem ser tratadas por uma única seção de stub. Um valor negativo de N coloca as seções de stub após suas ramificações, enquanto um valor positivo permite que as seções de stub apareçam antes ou depois das ramificações. Valores de 1 ou -1 indicam que o vinculador deve escolher os valores padrão adequados.
Os vinculadores 68HC11 e 68HC12 suportam opções específicas para controlar o mapeamento de alternância de banco de memória e a geração de código de trampolim.
--no-trampoline
Esta opção desativa a geração de trampolim. Por padrão, um trampolim é gerado para cada função distante que é chamada usando uma instrução "jsr" (isso acontece quando um ponteiro para uma função distante é obtido).
--bank-window name
Esta opção indica ao vinculador o nome da região de memória na especificação MEMORY que descreve a janela de banco de memória. A definição de tal região é então usada pelo vinculador para calcular o endereçamento de página e dentro da janela de memória.
As seguintes opções são suportadas para controlar o tratamento da geração de GOT ao vincular para destinos 68K.
--got=type
Esta opção informa ao vinculador qual esquema de geração de GOT usar. type deve ser um de single, negative, multigot ou target. Para mais informações, consulte a entrada Info para ld.
As seguintes opções são suportadas para controlar a geração de instruções microMIPS e as verificações de relaxamento de ramificações para transições de modo ISA ao vincular para destinos MIPS.
--insn32
--no-insn32
Estas opções controlam a escolha das instruções microMIPS usadas no código gerado pelo vinculador, como no PLT ou nos stubs de ligação tardia, ou no relaxamento. Se --insn32 for usado, o vinculador usa apenas codificações de instrução de 32 bits. Por padrão ou se --no-insn32 for usado, todas as codificações de instrução são usadas, incluindo as de 16 bits, quando possível.
--ignore-branch-isa
--no-ignore-branch-isa
Estas opções controlam as verificações de relaxamento de ramificações para transições de modo ISA inválidas. Se --ignore-branch-isa for usado, o vinculador aceita quaisquer ramificações e qualquer transição de modo ISA necessária é perdida no cálculo de realocação, exceto em alguns casos de instruções "BAL" que atendem às condições de relaxamento e são convertidas em instruções "JALX" equivalentes, pois a realocação associada é calculada. Por padrão ou se --no-ignore-branch-isa for usado, uma verificação é feita, fazendo com que a perda de uma transição de modo ISA produza um erro.
--compact-branches
--no-compact-branches
Essas opções controlam a geração de instruções compactas pelo vinculador nas entradas da PLT para MIPS R6.
Para o alvo pdp11-aout, três variantes do formato de saída podem ser produzidas, selecionadas pelas opções a seguir. A variante padrão para pdp11-aout é a opção --omagic, enquanto para outros alvos, --nmagic é o padrão. A opção --imagic é definida apenas para o alvo pdp11-aout, enquanto as outras são descritas aqui, conforme se aplicam ao alvo pdp11-aout.
-N
--omagic
Marca a saída como "OMAGIC" (0407) no cabeçalho a.out para indicar que o segmento de texto não deve ser protegido contra gravação e compartilhado. Como as seções de texto e dados são ambas legíveis e graváveis, a seção de dados é alocada imediatamente contígua após o segmento de texto. Este é o formato mais antigo para programas executáveis PDP11 e é o padrão para ld em sistemas PDP11 Unix desde o início até 2.11BSD.
-n
--nmagic
Marca a saída como "NMAGIC" (0410) no cabeçalho a.out para indicar que, quando o arquivo de saída for executado, a porção de texto será somente leitura e compartilhada entre todos os processos que executam o mesmo arquivo. Isso envolve mover as áreas de dados para o primeiro limite de página possível de 8 KB após o final do texto. Esta opção cria um formato executável puro.
-z
--imagic
Marca a saída como "IMAGIC" (0411) no cabeçalho a.out para indicar que, quando o arquivo de saída for executado, as áreas de texto e dados do programa serão carregadas em espaços de endereçamento separados usando o recurso de espaço de instrução e dados separados da unidade de gerenciamento de memória em modelos maiores do PDP11. Isso dobra o espaço de endereçamento disponível para o programa. O segmento de texto é novamente puro, protegido contra gravação e compartilhável. A única diferença no formato de saída entre esta opção e as outras, além do número mágico, é que tanto a seção de texto quanto a seção de dados começam no local 0. A opção -z selecionou este formato em 2.11BSD. Esta opção cria um formato executável separado.
--no-omagic
Equivalente a --nmagic para pdp11-aout.
AMBIENTE
Você pode alterar o comportamento de ld com as variáveis de ambiente "GNUTARGET", "LDEMULATION" e "COLLECT_NO_DEMANGLE".
"GNUTARGET" determina o formato de arquivo de objeto de entrada, caso você não use -b (ou seu
sinônimo --format). Seu valor deve ser um dos nomes BFD para um formato de entrada. Se não houver
"GNUTARGET" no ambiente, ld usa o formato natural do alvo. Se "GNUTARGET" estiver definido como
"default", o BFD tentará descobrir o formato de entrada examinando arquivos de entrada binários;
este método geralmente tem sucesso, mas existem ambiguidades potenciais, pois não há um método
para garantir que o número mágico usado para especificar formatos de arquivo de objeto seja
único. No entanto, o procedimento de configuração para BFD em cada sistema coloca o formato
convencional para esse sistema primeiro na lista de pesquisa, portanto, as ambiguidades são
resolvidas em favor da convenção.
"LDEMULATION" determina a emulação padrão se você não usar a opção -m. A emulação pode
afetar vários aspectos do comportamento do vinculador, particularmente o script do vinculador padrão. Você pode listar
as emulações disponíveis com as opções --verbose ou -V. Se a opção -m não for usada e a
variável de ambiente "LDEMULATION" não estiver definida, a emulação padrão depende de como
o vinculador foi configurado.
Normalmente, o vinculador definirá o padrão para descompactar símbolos. No entanto, se "COLLECT_NO_DEMANGLE" for definido no ambiente, ele definirá o padrão para não descompactar símbolos. Esta variável de ambiente é usada de forma semelhante pelo programa wrapper do vinculador "gcc". O padrão pode ser substituído pelas opções --demangle e --no-demangle.
Se a opção específica do PE/COFF --insert-timestamp estiver ativa e a variável de ambiente SOURCE_DATE_EPOCH estiver definida, então o valor de timestamp nesta variável será inserido no cabeçalho COFF em vez do horário atual.
Se a variável de ambiente "LD_STATS" estiver definida, as informações de uso de recursos do vinculador serão registradas, como se a opção --stats tivesse sido usada. Se a variável "LD_STATS" tiver um valor de string, então esta será usada como o nome de um arquivo no qual as informações devem ser armazenadas. Caso contrário, as informações serão enviadas para o fluxo de saída padrão.
VEJA TAMBÉM
ar(1), nm(1), objcopy(1), objdump(1), readelf(1) e as entradas de Info para binutils e ld.
DIREITOS AUTORAIS
Copyright (c) 1991-2025 Free Software Foundation, Inc.
A permissão é concedida para copiar, distribuir e/ou modificar este documento sob os termos da GNU Free Documentation License, Versão 1.3 ou qualquer versão posterior publicada pela Free Software Foundation; sem Seções Invariantes, sem Textos de Capa e sem Textos de Contracapa. Uma cópia da licença está incluída na seção intitulada "GNU Free Documentation License".