fbpx

Comandos Linux – Comando ld

Comando Linux ld

comando ld

Nos sistemas operacionais do tipo Unix, o ld é um vinculador. Ele combina vários objetos compilados e arquivos compactados, realoca seus dados e vincula referências de símbolos. Normalmente, o último passo na compilação de um programa é executar o ld .

Este documento cobre a versão GNU / Linux do ld .

Descrição

O ld aceita arquivos de linguagem de comando do vinculador gravados 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.

Para detalhes completos sobre a linguagem de comando ld , consulte a página de informações ld . Aqui, abordaremos uma ampla visão geral de como usar o GNU ld, usado na maioria das versões do Linux .

Esta versão do ld usa as bibliotecas BFD de uso geral para operar em arquivos de objetos. Isso permite que o ld leia, combine e escreva arquivos de objetos em vários 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 após encontrar um erro; sempre que possível, o ld continua executando, permitindo identificar outros erros (ou, em alguns casos, obter um arquivo de saída apesar do erro).

O GNU linker ld destina-se a cobrir uma ampla gama de situações e a ser o mais compatível possível com outros linkers. Como resultado, você tem muitas opções para controlar seu comportamento.

Sintaxe

  ld [ opções ] objfile ...

Opções

O vinculador suporta muitas opções de linha de comando , mas, na prática real, 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 suportado. Nesse sistema, para vincular um arquivo ” hello.o “:

  ld -o <saída> /lib/crt0.o hello.o -lc

Isso instrui o ld a produzir um arquivo chamado output como resultado da vinculação do arquivo ” /lib/crt0.o ” com ” hello.o ” e da biblioteca ” libc.a “, que virá dos diretórios de pesquisa padrão. Veja a 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. A repetição de opções que não sejam de arquivo com um argumento diferente não terá mais efeito ou substituirá ocorrências anteriores (aquelas mais à esquerda na linha de comando) dessa opção. As opções que podem ser especificadas significativamente mais de uma vez estão descritas nas descrições abaixo.

Os argumentos que não são de opção são arquivos ou archive de objetos que devem ser vinculados. Eles podem seguir, preceder ou ser misturados às opções da linha de comando, exceto que um argumento do arquivo de objeto não pode ser colocado entre uma opção e seu argumento.

Normalmente, o vinculador é chamado com pelo menos um arquivo de objeto, mas você pode especificar outras formas de arquivos de entrada binários usando -l , -R e a linguagem de comando do script. Se nenhum arquivo de entrada binário for especificado, o vinculador não produzirá nenhuma saída e emitirá a mensagem ” Nenhum arquivo de entrada “.

Se o vinculador não puder reconhecer o formato de um arquivo de objeto, ele assumirá que é um script de vinculador. Um script especificado dessa maneira aumenta o script principal do vinculador usado para o link (o script vinculador padrão ou o especificado usando -T ). Esse recurso permite que o vinculador vincule-se a um arquivo que parece ser um objeto ou arquivo morto , mas na verdade apenas define alguns valores de símbolo ou usa “INPUT” ou “GROUP” para carregar outros objetos. A especificação de um script dessa maneira apenas aumenta o script do vinculador principal, 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 das opções devem seguir a letra da opção sem interferir em espaço em branco ou ser fornecidos como argumentos separados imediatamente após a opção que os requer.

Para opções cujos nomes são várias letras, um ou dois traços 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: Várias opções de letras que começam com minúsculas ‘ o ‘ só podem ser precedidas por dois traços. Isso é para reduzir a confusão com a opção -o . Por exemplo, -omagic define o nome do arquivo de saída como mágico, enquanto –omagic define o sinalizador NMAGIC na saída.

Os argumentos para as opções de várias letras devem ser separados do nome da opção por um sinal de igual ou ser 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 exclusivas dos nomes das opções de várias letras são aceitas.

Observe que, se o vinculador estiver sendo chamado indiretamente, por meio de um driver de compilador (por exemplo, gcc ), todas as opções de linha de comando do vinculador deverão ser prefixadas por -Wl (ou o que for apropriado para o driver do compilador específico) como este:

  gcc -Wl, - grupo inicial foo.o bar.o -Wl, - grupo final

Isso é importante, porque, caso contrário, o programa do driver do compilador pode eliminar silenciosamente as opções do vinculador, resultando em um link incorreto. Também pode surgir confusão ao passar opções que exigem valores através de um driver, pois o uso de um espaço entre opção e 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. Nesse caso, é mais simples usar os formulários unidos das opções de uma e várias letras, como:

  gcc foo.o bar.o -Wl, -eENTRY -Wl, -Map = a.map

Aqui está uma tabela das opções genéricas da linha de comando aceitas pelo vinculador GNU:

@ fileLeia as 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 removida.

As opções no arquivo são separadas por espaço em branco . Um caractere de espaço em branco pode ser incluído em uma opção colocando a opção inteira entre aspas simples ou duplas. Qualquer caractere (incluindo uma barra invertida) pode ser incluído prefixando o caractere a ser incluído em uma barra invertida. O próprio arquivo pode conter opções adicionais de @ arquivo ; essas opções serão processadas recursivamente .

-uma palavra-chaveEsta opção é suportada para compatibilidade com HP-UX . O argumento da palavra-chave deve ser um dos arquivos de strings , compartilhado ou padrão . -aarchive é funcionalmente equivalente a -Bstatic , e as outras duas palavras-chave são funcionalmente equivalentes a -Bdynamic . Esta opção pode ser usada inúmeras vezes.
–audit AUDITLIBAdiciona AUDITLIB à entrada “DT_AUDIT” da seção dinâmica. AUDITLIB não está verificado quanto à existência, 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 vinculador encontrar um objeto com uma entrada de auditoria ao procurar bibliotecas compartilhadas, ele adicionará uma entrada “DT_DEPAUDIT” correspondente no arquivo de saída. Essa opção é significativa apenas nas plataformas ELF que suportam a interface “rtld-audit”.
-A arquitetura

–architecture = arquitetura

Na versão atual do ld , essa opção é útil apenas para a família de arquiteturas Intel 960. Nessa configuração ld , o argumento de arquitetura identifica a arquitetura específica da família 960, permitindo algumas salvaguardas e modificando o caminho de pesquisa da biblioteca de archive.

Versões futuras do ld podem suportar funcionalidades semelhantes para outras famílias de arquitetura.

-b formato de entrada

–format = formato de entrada

O ld pode ser configurado para suportar mais de um tipo de arquivo de objeto. Se o seu ld estiver configurado dessa maneira, você poderá usar a opção -b para especificar o formato binário para os arquivos de objetos de entrada que seguem esta opção na linha de comandos. Mesmo quando ld está configurado para suportar formatos de objetos alternativos, normalmente não é necessário especificar isso, pois ld deve ser configurado para esperar como formato de entrada padrão o formato mais comum em cada máquina. formato de entrada é uma sequência 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 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 objetos de diferentes formatos), incluindo -b -format-input antes de cada grupo de arquivos de objetos em um formato específico.

O formato padrão é obtido da variável de ambiente “GNUTARGET”.

Você também pode definir o formato de entrada de um script, usando o comando “TARGET”;

-c MRI-commandfile

–mri-script = MRI-commandfile

Para compatibilidade com vinculadores produzidos pela MRI, o ld aceita arquivos de script escritos em uma linguagem de comando alternativa e restrita, descrita na seção Arquivos de script compatíveis da MRI da documentação do GNU ld . Introduzir arquivos de script de ressonância magnética com a opção -c ; use a opção -T para executar scripts do vinculador escritos na linguagem de script ld de uso geral. Se MRI-cmdfile não existir, o ld procurará nos diretórios especificados por qualquer opção -L .
-d

-dc

-dp

Essas três opções são equivalentes; vários formulários são suportados para compatibilidade com outros vinculadores. Eles atribuem espaço a símbolos comuns, mesmo que um arquivo de saída realocá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 está verificado quanto à existência, nem usará o DT_SONAME especificado na biblioteca. Se especificado várias vezes, “DT_DEPAUDIT” conterá uma lista separada por dois pontos de interfaces de auditoria a serem usadas. Essa opção é significativa apenas nas plataformas ELF que suportam a interface “rtld-audit”. A opção -P é fornecida para compatibilidade com Solaris.
-e entrada

–entry = entrada

Use a entrada 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 a entrada como um número e usará isso como endereço de entrada (o número será interpretado na base 10 ; você pode usar um 0x inicial para a base 16 ou um 0 inicial para a base 8).
–exclude-libs lib, lib, …Especifica uma lista de bibliotecas de archive das quais os símbolos não devem ser exportados automaticamente. Os nomes da biblioteca podem ser delimitados por vírgulas ou dois pontos. A especificação de ” –exclude-libs ALL ” exclui símbolos em todas as bibliotecas de archive da exportação automática. Esta opção está disponível apenas para a porta direcionada i386 PE do vinculador e para portas direcionadas ELF. Para o i386 PE, os símbolos listados explicitamente em um arquivo .def ainda são exportados, independentemente desta opção. Para 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 objetos ou membros do archive, dos quais os símbolos não devem ser exportados automaticamente, mas que devem ser copiados por atacado na biblioteca de importação gerada durante o link. Os nomes dos módulos podem ser delimitados por vírgulas ou dois pontos e devem corresponder exatamente aos nomes de arquivos usados ​​pelo ld para abrir os arquivos; para membros do arquivo morto, esse é o nome do membro, mas para arquivos de objeto, o nome listado deve incluir e corresponder exatamente 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 de destino do 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 vinculado dinamicamente, o uso da opção -E ou –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 visíveis a partir de objetos dinâmicos em tempo de execução.

Se você não usar nenhuma dessas opções (ou 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 mencionados por algum objeto dinâmico mencionado no link.

Se você usar ” dlopen ” para carregar um objeto dinâmico que precise se referir aos símbolos definidos pelo programa, em vez de algum outro objeto dinâmico, 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. Veja a descrição de –dynamic-list .

Observe que esta opção é específica para portas direcionadas ao ELF. Os destinos do PE oferecem suporte a uma função semelhante para exportar todos os símbolos de uma DLL ou EXE ; veja a descrição de –export-all-symbols abaixo.

-EBVincule objetos big endian . Isso afeta o formato de saída padrão.
-ELVincule objetos little-endian. Isso afeta o formato de saída padrão.
-f nome

–auxiliary = nome

Ao criar um objeto compartilhado ELF, defina o campo DT_AUXILIARY interno 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ê posteriormente vincular um programa a esse objeto de filtro, quando executar o programa, o vinculador dinâmico verá o campo DT_AUXILIARY. Se o vinculador dinâmico resolver qualquer símbolo do objeto de filtro, ele primeiro verificará se há uma definição no nome do objeto compartilhado. Se houver, ele será usado em vez da definição no objeto de filtro. O nome do objeto compartilhado não precisa existir. Assim, o nome do objeto compartilhado pode ser usado para fornecer uma implementação alternativa de certas funções, talvez para depuração ou 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 comandos.

-F name

–filter = nome

Ao criar um objeto compartilhado ELF, configure o campo DT_FILTER interno 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 nome do objeto compartilhado.

Se você posteriormente vincular um programa a esse objeto de filtro, quando 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, como de costume, mas, na verdade, será vinculado às definições encontradas no nome do objeto compartilhado. Assim, o objeto de filtro pode ser usado para selecionar um subconjunto dos símbolos fornecidos pelo nome do objeto.

Alguns vinculadores mais antigos usaram a opção -F em uma cadeia de ferramentas de compilação para especificar o formato do arquivo de objeto para os arquivos de objeto de entrada e saída. O vinculador GNU usa outros mecanismos para esse 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 ignora a opção -F quando não está criando um objeto compartilhado ELF.

-fini = nomeAo criar um objeto executável ou compartilhado ELF, chame NAME quando o objeto executável ou compartilhado for descarregado, configurando DT_FINI para o endereço da função. Por padrão, o vinculador usa ” _fini ” como a função a ser chamada.
-gIgnorado. Fornecido para compatibilidade com outras ferramentas.
Valor -G

–gpsize = value

Defina o tamanho máximo dos objetos a serem otimizados usando o registro GP para dimensionar. Isso é significativo apenas para formatos de arquivo de objeto, como o MIPS ECOFF, que suporta a inserção de objetos grandes e pequenos em seções diferentes. Isso é ignorado para outros formatos de arquivo de objeto.
-h nome

-soname = nome

Ao criar um objeto compartilhado ELF, defina o campo DT_SONAME interno para o nome especificado. Quando um executável é vinculado a um objeto compartilhado que possui um campo DT_SONAME, 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 de arquivo fornecido ao vinculador.
-EuExecute um link incremental (o mesmo que a opção -r ).
-init = nomeAo criar um objeto executável ou compartilhado ELF, chame NAME quando o objeto executável ou compartilhado for carregado, configurando 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

Adicione o archive ou objeto especificado por namespec à lista de arquivos a serem vinculados. Esta opção pode ser usada inúmeras vezes. Se namespec estiver no formato : filename , ld procurará no caminho da biblioteca um arquivo chamado filename , caso contrário, procurará no caminho da biblioteca um arquivo chamado lib namespec .a .

Em sistemas que suportam bibliotecas compartilhadas, o ld também pode procurar por arquivos que não sejam lib namespec .a . Especificamente, nos sistemas ELF e SunOS , o ld procurará em um diretório uma biblioteca chamada lib namespec .so antes de procurar um chamado lib namespec .a . Por convenção, uma extensão ” .so ” indica uma biblioteca compartilhada. Observe que esse comportamento não se aplica a : filename , que sempre especifica um arquivo chamado filename .

O vinculador pesquisará um arquivo morto apenas uma vez, no local em que ele está especificado na linha de comando. Se o arquivo morto definir um símbolo que não foi definido em algum objeto que apareceu antes do arquivo morto na linha de comando, o vinculador incluirá o (s) arquivo (s) apropriado (s) do arquivo morto. No entanto, um símbolo indefinido em um objeto que aparece mais tarde na linha de comando não fará com que o vinculador procure no arquivo morto novamente.

Consulte a opção – ( para obter 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.

Esse tipo de pesquisa de arquivo é padrão para os vinculadores Unix. No entanto, se você estiver usando ld no AIX , observe que ele é diferente do comportamento do vinculador do AIX.

-L searchdir

–library-path = searchdir

Adicione o caminho searchdir à lista de caminhos que o ld procurará por bibliotecas de archive e scripts de controle de 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 comandos. Os diretórios especificados na linha de comandos 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 pesquisa um script vinculador, a menos que a opção -T seja especificada.

Se searchdir começar com ” = “, o ” = ” será substituído pelo prefixo sysroot , um caminho especificado quando o vinculador estiver configurado.

O conjunto padrão de caminhos pesquisados ​​(sem ser especificado com -L ) depende de qual modo de emulação ld está usando e, em alguns casos, também de como foi configurado no tempo de compilação.

Os caminhos também podem ser especificados em um script de link com o comando “SEARCH_DIR”. Os diretórios especificados dessa maneira são pesquisados ​​no ponto em que o script do vinculador aparece na linha de comando.

emulação -mEmule 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 será obtida da variável de ambiente “LDEMULATION”, se isso for definido.

Caso contrário, a emulação padrão depende de como o vinculador foi configurado.

-M

–print-map

Imprima um mapa de links para a saída padrão. Um mapa de links fornece informações sobre o link, incluindo o seguinte:

  • Onde os arquivos de objetos são mapeados na memória.
  • Como os símbolos comuns são alocados.
  • Todos os membros do arquivo incluídos no link, com uma menção ao símbolo que causou o membro do arquivo.
  • Os valores atribuídos aos símbolos.

Nota: 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 links. Isso ocorre porque o vinculador descarta resultados intermediários e apenas retém o valor final de uma expressão. Sob tais circunstâncias, o vinculador exibe o valor final entre colchetes. Assim, por exemplo, um script vinculador que contém:

  foo = 1 
 foo = foo * 4 
 foo = foo + 8

produzirá a seguinte saída no mapa de link se a opção -M for usada:

  0x00000001 foo = 0x1 
 [0x0000000c] foo = (foo * 0x4) 
 [0x0000000c] foo = (foo + 0x8)
-n

–nmagic

Desative o alinhamento de páginas das seções e desative a vinculação em bibliotecas compartilhadas. Se o formato de saída suportar números mágicos no estilo Unix, marque a saída como “NMAGIC”.
-N

–omagic

Defina as seções de texto e dados para serem legíveis e graváveis. Além disso, não alinhe a página do segmento de dados e desative a vinculação em bibliotecas compartilhadas. Se o formato de saída suportar números mágicos no estilo Unix, marque a saída como “OMAGIC”. Nota: Embora uma seção de texto gravável seja permitida para destinos de PE-COFF, ela não está de acordo com a especificação de formato publicada pela Microsoft .
–no-omagicEsta opção nega a maioria dos efeitos da opção -N . Ele define a seção de texto como somente leitura e força o segmento de dados a ser alinhado por página. Nota  esta opção não permite a vinculação em bibliotecas compartilhadas. Use -Bdynamic para isso.
-o saída

– saída = saída

Use output como o nome do programa produzido por ld ; se essa 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.
-O nívelSe level for um valor numérico maior que zero, ld otimiza a saída. Isso pode demorar significativamente mais e, portanto, provavelmente só deve ser ativado para o binário final. No momento, essa opção afeta apenas a geração da biblioteca compartilhada ELF. Versões futuras do vinculador podem fazer mais uso dessa opção. Além disso, atualmente não há diferença no comportamento do vinculador para valores diferentes de zero desta opção. Novamente, isso pode mudar com versões futuras.
-q

–emit-relocs

Deixe seções e conteúdo de realocação em executáveis ​​totalmente vinculados. As ferramentas de análise e otimização pós-link podem precisar dessas informações para realizar as modificações corretas dos executáveis. Isso resulta em executáveis ​​maiores.

Atualmente, esta opção é suportada apenas nas plataformas ELF.

–force-dynamicForça o arquivo de saída a ter seções dinâmicas. Esta opção é específica para os destinos do VxWorks.
-r

–relocável

Gere saída realocável: ou seja, gere um arquivo de saída que, por sua vez, possa servir como entrada para ld . Isso geralmente é chamado de link parcial. Como efeito colateral, em ambientes que suportam números mágicos padrão do Unix, essa opção também define o número mágico do arquivo de saída como “OMAGIC”. Se essa 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 possui o mesmo formato que o arquivo de saída, a vinculação parcial é suportada apenas se esse arquivo de entrada não contiver realocações. Diferentes formatos de saída podem ter restrições adicionais; por exemplo, alguns formatos baseados em ” a.out ” não oferecem suporte à vinculação parcial a arquivos de entrada em outros formatos.

Esta opção faz a mesma coisa que -i .

-R nome do arquivo

–just-symbols = nome do arquivo

Leia os nomes dos símbolos e seus endereços no nome do arquivo , mas não o mude ou 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 .

-s

–strip-all

Omita todas as informações de símbolo do arquivo de saída.
-S

–strip-debug

Omita as informações do símbolo do depurador (mas nem todos os símbolos) do arquivo de saída.
-t

–vestígio

Imprima os nomes dos arquivos de entrada conforme ld os processa.
-T scriptfile

–script = scriptfile

Use scriptfile como o script do vinculador. Esse script substitui o script vinculador padrão do ld (em vez de adicionar a ele), portanto, o arquivo de comandos deve especificar tudo o que é necessário para descrever o arquivo de saída. Se o arquivo de script não existir no diretório atual, o ld procurará nos diretórios especificados por qualquer opção -L anterior. Várias opções -T se acumulam.
-dT scriptfile

–default-script = scriptfile

Use scriptfile como o script do vinculador padrão.

Essa opção é semelhante à opção –script, exceto que o processamento do script é adiado até depois que o restante da linha de comando foi 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 puder ser controlada diretamente pelo usuário. (por exemplo, porque a linha de comando está sendo construída por outra ferramenta, como o gcc ).

símbolo -u

–undefined = símbolo

Força o símbolo a ser inserido no arquivo de saída como um símbolo indefinido. Isso pode, por exemplo, acionar a vinculação de módulos adicionais a partir de 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 de script do vinculador “EXTERN”.
-UrPara algo diferente de programas C ++, essa opção é equivalente a -r : gera saída relocável; ou seja, um arquivo de saída que por sua vez pode servir como entrada para ld . Ao vincular programas C ++, -Ur resolve referências a construtores, ao contrário de -r . Não funciona para usar -Ur em arquivos que foram vinculados a -Ur ; uma vez que a tabela do construtor tenha sido criada, ela não poderá ser adicionada. Use -Ur apenas para o último link parcial e -r para os outros.
–unique [ = SEÇÃO]Cria uma seção de saída separada para cada seção de entrada correspondente a SECTION, ou se o argumento SECTION curinga opcional estiver ausente, para cada seção de entrada órfã. Uma seção órfã não é mencionada especificamente em um script de vinculador. Você pode usar essa opção várias vezes na linha de comando; Impede a mesclagem normal de seções de entrada com o mesmo nome, substituindo as atribuições da seção de saída em um script vinculador.
-v

–versão

-V

Exibe o número da versão para ld . A opção -V também lista as emulações suportadas.
-x

–discard-all

Exclua todos os símbolos locais.
-X

–discard-locals

Exclua todos os símbolos locais temporários. Esses símbolos começam com prefixos de rótulo local específicos do sistema, geralmente .L para sistemas ELF ou L para sistemas a.out tradicionais.
símbolo -y – símbolo -traço = símboloImprima o nome de cada arquivo vinculado no qual o símbolo aparece. Esta opção pode ser dada várias vezes. Em muitos sistemas, é necessário acrescentar um sublinhado.

Essa opção é útil quando você tem um símbolo indefinido no seu link, mas não sabe de onde vem a referência.

Caminho -YAdicione o caminho ao caminho de pesquisa da biblioteca padrão. Esta opção existe para compatibilidade com Solaris .
-z palavra-chaveAs palavras-chave reconhecidas são:

combrelocCombina várias seções de realocação e as classifica para possibilitar o cache de pesquisa dinâmica de símbolos.
defsNão permite símbolos indefinidos em arquivos de objetos. Símbolos indefinidos em bibliotecas compartilhadas ainda são permitidos.
execstackMarca o objeto como exigindo pilha executável.
initfirstEsta opção é significativa apenas ao criar um objeto compartilhado. Ele marca o objeto para que a inicialização do tempo de execução ocorra antes da inicialização do tempo de execução de quaisquer outros objetos trazidos para o processo ao mesmo tempo. Da mesma forma, a finalização do tempo de execução do objeto ocorrerá após a finalização do tempo de execução de quaisquer outros objetos.
interporMarca o objeto que sua tabela de símbolos interpõe antes de todos os símbolos, exceto o executável principal.
preguiçosoAo gerar uma biblioteca executável ou compartilhada, marque-a para informar ao vinculador dinâmico que adie a resolução da chamada da função até o ponto em que a função é chamada (ligação lenta), e não no tempo de carregamento. A ligação lenta é o padrão.
loadfltrMarca o objeto em que seus filtros são processados ​​imediatamente em tempo de execução.
muldefsPermite várias definições.
nocombrelocDesativa a combinação de várias seções de realocação.
nocopyrelocDesativa a produção de relocs de cópia.
nodefaultlibMarca o objeto que a pesquisa de dependências desse objeto ignorará os caminhos de pesquisa da biblioteca padrão.
nodeleteMarcas que o objeto não deve ser descarregado em tempo de execução.
nodlopenMarca o objeto não disponível para “dlopen”.
nodumpMarcas que o objeto não pode ser despejado por “dldump”.
noexecstackMarca o objeto como não exigindo pilha executável.
norelroNão crie um cabeçalho de segmento ELF “PT_GNU_RELRO” no objeto.
agoraAo gerar uma biblioteca executável ou compartilhada, marque-a para solicitar ao vinculador dinâmico que resolva todos os símbolos quando o programa for iniciado ou quando a biblioteca compartilhada estiver vinculada ao uso do dlopen, em vez de adiar a resolução da chamada de função para o ponto em que a função for iniciada. chamado.
origemMarcas que o objeto pode conter $ ORIGIN.
relroCrie um cabeçalho de segmento ELF “PT_GNU_RELRO” no objeto.
tamanho máximo da página = valorDefina o tamanho máximo da página da emulação para o valor .
tamanho da página comum = valorDefina o tamanho da página comum da emulação como valor .

Outras palavras-chave são ignoradas para compatibilidade com Solaris.

– ( arquivos -)

–start-group arquivos –end-group

Os arquivos devem ser uma lista de arquivos. Eles podem ser nomes de arquivo explícitos ou opções -l .

Os arquivos especificados são pesquisados ​​repetidamente até que nenhuma nova referência indefinida seja criada. Normalmente, um arquivo é pesquisado apenas uma vez na ordem em que é especificado na linha de comando. Se um símbolo nesse arquivo for necessário para resolver um símbolo indefinido referido 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 são pesquisados ​​repetidamente até que todas as referências possíveis sejam resolvidas.

O uso desta opção tem um custo de desempenho significativo. É melhor usá-lo somente quando houver referências circulares inevitáveis ​​entre dois ou mais arquivos.

–accept-unknown-input-arch

–no-accept-unknown-input-arch

Diz ao vinculador para aceitar arquivos de entrada cuja arquitetura não pode ser reconhecida. A suposição é que o usuário saiba o que está fazendo e deliberadamente deseja vincular esses arquivos de entrada desconhecidos. Esse era o comportamento padrão do vinculador, antes da liberação 2.14. O comportamento padrão da versão 2.14 em diante é rejeitar esses arquivos de entrada e, portanto, a opção –accept-unknown-input-arch foi adicionada para restaurar o comportamento antigo.
–como necessário

–não necessário

Esta opção afeta as tags ELF DT_NEEDED para bibliotecas dinâmicas mencionadas na linha de comandos após a opção – conforme necessário . Normalmente, o vinculador adicionará uma marca 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 satisfaça uma referência de símbolo indefinida de um arquivo de objeto regular ou, se a biblioteca não for encontrada nas listas DT_NEEDED de outras bibliotecas vinculadas até esse momento, um indefinido referência de símbolo de outra biblioteca dinâmica. –no-as-needed restaura o comportamento padrão.
–add-needed

–no-add-needed

Essas duas opções foram descontinuadas devido à semelhança de seus nomes com as opções – conforme necessário e – não conforme necessário . Eles foram substituídos pelas entradas –copy-dt-needed- e –no-copy-dt- needed- .
-assert keywordEsta opção é ignorada para compatibilidade com o SunOS.
-Bdynamic

-dy

-call_shared

Link para bibliotecas dinâmicas. Isso é significativo apenas nas plataformas para as quais as bibliotecas compartilhadas são suportadas. Esta opção é normalmente o padrão nessas plataformas. As diferentes variantes desta opção são para compatibilidade com vários sistemas. You may use this option multiple times on the command line: it affects library searching for -l options which follow it.
-BgroupSet the “DF_1_GROUP” flag in the “DT_FLAGS_1” entry in the dynamic section. This causes the runtime linker to handle lookups in this object and its dependencies to be performed only inside the group. –unresolved-symbols=report-all is implied. This option is only meaningful on ELF platforms which support shared libraries.
-Bstatic

-dn

-non_shared

-static

Do not link against shared libraries. This is only meaningful on platforms for which shared libraries are supported. The different variants of this option are for compatibility with various systems. You may use this option multiple times on the command line: it affects library searching for -l options which follow it. This option also implies –unresolved-symbols=report-all . This option can be used with -shared . Doing so means that a shared library is being created but that all of the library’s external references must be resolved by pulling in entries from static libraries.
-BsymbolicWhen creating a shared library, bind references to global symbols to the definition within the shared library, if any. Normally, it is possible for a program linked against a shared library to override the definition within the shared library. This option is only meaningful on ELF platforms which support shared libraries.
-Bsymbolic-functionsWhen creating a shared library, bind references to global function symbols to the definition within the shared library, if any. This option is only meaningful on ELF platforms which support shared libraries.
–dynamic-list=dynamic-list-fileSpecify the name of a dynamic list file to the linker. This is typically used when creating shared libraries to specify a list of global symbols whose references shouldn’t be bound to the definition within the shared library, or creating dynamically linked executables to specify a list of symbols which should be added to the symbol table in the executable. This option is only meaningful on ELF platforms which support shared libraries.

The format of the dynamic list is the same as the version node without scope and node name.

–dynamic-list-dataInclude all global data symbols to the dynamic list.
–dynamic-list-cpp-newProvide the builtin dynamic list for C++ operator new and delete. It is mainly useful for building shared libstdc++.
–dynamic-list-cpp-typeinfoProvide the builtin dynamic list for C++ runtime type identification.
–check-sections

–no-check-sections

Asks the linker not to check section addresses after they have been assigned to see if there are any overlaps. Normally the linker will perform this check, and if it finds any overlaps it will produce suitable error messages. The linker does know about, and does make allowances for sections in overlays. The default behaviour can be restored by using the command line switch –check-sections . Section overlap is not usually checked for relocatable links. You can force checking in that case by using the –check-sections option.
–copy-dt-needed-entries

–no-copy-dt-needed-entries

This option affects the treatment of dynamic libraries referred to by DT_NEEDED tags inside ELF dynamic libraries mentioned on the command line. Normally the linker won’t add a DT_NEEDED tag to the output binary for each library mentioned in a DT_NEEDED tag in an input dynamic library. With –copy-dt-needed-entries specified on the command line, however, any dynamic libraries that follow it will have their DT_NEEDED entries added. The default behaviour can be restored with –no-copy-dt-needed-entries .

This option also has an effect on the resolution of symbols in dynamic libraries. With –copy-dt-needed-entries dynamic libraries mentioned on the command line will be recursively searched, following their DT_NEEDED tags to other libraries, to resolve symbols required by the output binary. With the default setting, however, the searching of dynamic libraries that follow it will stop with the dynamic library itself. No DT_NEEDED links will be traversed to resolve symbols.

–crefOutput a cross reference table. If a linker map file is being generated, the cross reference table is printed to the map file. Otherwise, it is printed on the standard output.

The format of the table is intentionally simple, so that it may be easily processed by a script if necessary. The symbols are printed out, sorted by name. For each symbol, a list of file names is given. If the symbol is defined, the first file listed is the location of the definition. The remaining files contain references to the symbol.

–no-define-commonThis option inhibits the assignment of addresses to common symbols. The script command “INHIBIT_COMMON_ALLOCATION” has the same effect.

The –no-define-common option allows decoupling the decision to assign addresses to Common symbols from the choice of the output file type; otherwise a non-Relocatable output type forces assigning addresses to Common symbols. Using –no-define-common allows Common symbols that are referenced from a shared library to be assigned addresses only in the main program. This eliminates the unused duplicate space in the shared library, and also prevents any possible confusion over resolving to the wrong duplicate when there are many dynamic modules with specialized search paths for runtime symbol resolution.

–defsym= symbol = expressionCreate a global symbol in the output file, containing the absolute address given by expression . You may use this option as many times as necessary to define multiple symbols in the command line. A limited form of arithmetic is supported for the expression in this context: you may give a hexadecimal constant or the name of an existing symbol, or use “+” and “-” to add or subtract hexadecimal constants or symbols. If you need more elaborate expressions, consider using the linker command language from a script. Note: there should be no white space between symbol, the equals sign (” = “), and expression .
–demangle [ = style ]

–no-demangle

These options control whether to “demangle” symbol names in error messages and other output. When the linker is told to demangle, it tries to present symbol names in a readable fashion: it strips leading underscores if they are used by the object file format, and converts C++ mangled symbol names into user readable names. Compiladores diferentes têm diferentes estilos de distorção. O argumento de estilo desmontável opcional pode ser usado para escolher um estilo desmontável apropriado para o seu compilador. The linker will demangle by default unless the environment variable COLLECT_NO_DEMANGLE is set. These options may be used to override the default.
-I file

–dynamic-linker= file

Set the name of the dynamic linker. This is only meaningful when generating dynamically linked ELF executables. The default dynamic linker is normally correct; don’t use this unless you know what you are doing.
–fatal-warnings

–no-fatal-warnings

Treat all warnings as errors. The default behaviour can be restored with the option –no-fatal-warnings .
–force-exe-suffixMake sure that an output file has a .exe suffix.

If a successfully built fully linked output file does not have a ” .exe ” or ” .dll ” suffix, this option forces the linker to copy the output file to one of the same name with a ” .exe ” suffix. This option is useful when using unmodified Unix makefiles on a Microsoft Windows host, since some versions of Windows won’t run an image unless it ends in a ” .exe ” suffix.

–gc-sections

–no-gc-sections

Enable garbage collection of unused input sections. It is ignored on targets that do not support this option. The default behaviour (of not performing this garbage collection) can be restored by specifying –no-gc-sections on the command line.

–gc-sections decides which input sections are used by examining symbols and relocations. The section containing the entry symbol and all sections containing symbols undefined on the command-line will be kept, as will sections containing symbols referenced by dynamic objects. Note that when building shared libraries, the linker must assume that any visible symbol is referenced. Once this initial set of sections has been determined, the linker recursively marks as used any section referenced by their relocations. See –entry and –undefined .

This option can be set when doing a partial link (enabled with option -r ). In this case the root of symbols kept must be explicitly specified either by an –entry or –undefined option or by a “ENTRY” command in the linker script.

–print-gc-sections

–no-print-gc-sections

List all sections removed by garbage collection. The listing is printed on stderr. This option is only effective if garbage collection has been enabled via the –gc-sections ) option. The default behaviour (of not listing the sections that are removed) can be restored by specifying –no-print-gc-sections on the command line.
–print-output-formatImprima o nome do formato de saída padrão (talvez influenciado por outras opções da linha de comando). Essa é a sequência que aparecerá em um comando de script do vinculador “OUTPUT_FORMAT”.
–SocorroImprima um resumo das opções da linha de comandos na saída e saída padrão.
–target-helpImprima um resumo de todas as opções específicas de destino na saída e saída padrão.
-Map = mapfileImprima um mapa de links para o arquivo mapfile de arquivo . Veja a descrição da opção -M , acima.
–no-keep-memoryNormalmente, o ld otimiza a velocidade do uso da memória armazenando em cache as tabelas de símbolos dos arquivos de entrada na memória. Esta opção diz ao ld para otimizar o uso da memória, relendo as tabelas de símbolos conforme necessário. Isso pode ser necessário se o ld ficar sem espaço na memória ao vincular um executável grande.
–no-indefinido

-z defs

Relatar referências de símbolo não resolvidas de arquivos de objetos regulares. Isso é feito mesmo se o vinculador estiver criando uma biblioteca compartilhada não simbólica. A opção  [ no- ] allow-shlib-undefined controla o comportamento de reportar referências não resolvidas encontradas nas bibliotecas compartilhadas vinculadas.
–allow-multiple-definition

-z muldefs

Normalmente, quando um símbolo é definido várias vezes, o vinculador 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 não símbolos indefinidos em bibliotecas compartilhadas. Essa opção é semelhante a –no-undefined, exceto que determina o comportamento quando os símbolos indefinidos estão em uma biblioteca compartilhada, e não em um arquivo de objeto comum. Isso não afeta como os símbolos indefinidos nos arquivos de objetos regulares são manipulados.

O comportamento padrão é relatar erros para quaisquer símbolos indefinidos mencionados em bibliotecas compartilhadas se o vinculador estiver sendo usado para criar um executável, mas permitir isso se o vinculador estiver sendo usado para criar uma biblioteca compartilhada.

Os motivos para permitir referências de símbolo indefinidas em bibliotecas compartilhadas especificadas no momento do link são:

  • Uma biblioteca compartilhada especificada no tempo do link pode não ser a mesma que está disponível no tempo de carregamento, portanto, o símbolo pode realmente ser resolvido no tempo de carregamento.
  • Existem alguns sistemas operacionais, por exemplo, BeOS e HPPA, nos quais símbolos indefinidos em bibliotecas compartilhadas são normais.

O kernel do BeOS, por exemplo, corrige bibliotecas compartilhadas no tempo de carregamento para selecionar a função mais apropriada para a arquitetura atual. Isso é usado, por exemplo, para selecionar dinamicamente uma função memset apropriada.

–no-undefined-versionNormalmente, quando um símbolo tem uma versão indefinida, o vinculador o ignora. Esta opção não permite símbolos com versão indefinida e um erro fatal será emitido.
–default-symverCrie e use uma versão de símbolo padrão (o soname ) para símbolos exportados não versionados.
–padrão-importado-symverCrie e use uma versão de símbolo padrão (o soname ) para símbolos importados não versionados.
–no-warn-mismatchNormalmente, ld gera um erro se você tentar vincular arquivos de entrada incompatíveis por algum motivo, talvez porque tenham sido compilados para diferentes processadores ou para diferentes finalidades. Esta opção informa ao ld que deve permitir silenciosamente esses possíveis erros. Essa opção deve ser usada apenas com cuidado, nos casos em que você tomou alguma ação especial que garante que os erros do vinculador sejam inapropriados.
–no-warn-search-mismatchNormalmente, ld emite um aviso se encontrar uma biblioteca incompatível durante uma pesquisa na biblioteca. Esta opção silencia o aviso.
–no-todo-arquivoDesative o efeito da opção –whole-archive para os arquivos subsequentes.
–noinhibit-execMantenha o arquivo de saída executável 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 link; ele sai sem gravar um arquivo de saída quando emite algum erro.
-nostdlibSomente os diretórios da biblioteca de pesquisa especificados explicitamente na linha de comandos. Os diretórios da biblioteca especificados nos scripts do vinculador (incluindo scripts do vinculador especificados na linha de comandos) são ignorados.
–oformat = formato de saídaO ld pode ser configurado para suportar mais de um tipo de arquivo de objeto. Se o seu ld estiver configurado dessa maneira, você poderá usar a opção –oformat para especificar o formato binário para o arquivo do objeto de saída. Mesmo quando ld está configurado para suportar formatos de objetos alternativos, normalmente não é necessário especificar isso, pois 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 sequência 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.
-torta

–pic-executável

Crie um executável independente da posição. No momento, isso é suportado apenas em plataformas ELF. Os executáveis ​​independentes da posição são semelhantes às bibliotecas compartilhadas, pois são realocados pelo vinculador dinâmico para o endereço virtual que o SO escolhe para eles (que pode variar entre as chamadas). Como executáveis ​​normais vinculados dinamicamente, eles podem ser executados e os símbolos definidos no executável não podem ser substituídos por bibliotecas compartilhadas.
-qmagicEsta opção é ignorada para compatibilidade com Linux.
-QyEsta opção é ignorada para compatibilidade com SVR4.
–relaxar

–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 de destino que se tornam possíveis quando o vinculador resolve o endereçamento no programa, como relaxar os modos de endereço, sintetizar novas instruções, selecionar versão mais curta das instruções atuais e combinar valores constantes.

Em algumas plataformas, essas otimizações globais no tempo do link podem impossibilitar a depuração simbólica do executável resultante. Esse é o caso da família de processadores Matsushita MN10200 e MN10300.

Nas plataformas em que isso não é suportado, –relax é aceito, mas ignorado.

Nas plataformas em que –relax é aceito, a opção –no-relax pode ser usada para desativar o recurso.

–retain-symbols-file = nome do arquivoGuarde apenas os símbolos listados no nome do arquivo, descartando todos os outros. nome do arquivo é um arquivo simples, com um nome de símbolo por linha. Essa opção é especialmente útil em ambientes (como o VxWorks), onde uma grande tabela global de símbolos é 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 uma vez na linha de comando. Ele substitui -s e -S .

-rpath = dirInclua um diretório no caminho de pesquisa da biblioteca de tempo de execução. Isso é usado ao vincular um executável ELF a objetos compartilhados. Todos os argumentos -rpath são concatenados e transmitidos ao vinculador de tempo de execução, que os utiliza para localizar objetos compartilhados no 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 no link; consulte a descrição da opção -rpath-link . 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 se estiver definido.

A opção -rpath também pode ser usada no SunOS. Por padrão, no SunOS, o vinculador formará um patch de pesquisa em tempo de execução com todas as opções -L fornecidas. Se uma opção -rpath for usada, o caminho de pesquisa em tempo de execução será formado exclusivamente usando as opções -rpath , ignorando as opções -L . Isso pode ser útil ao usar o gcc , que adiciona muitas opções -L que podem estar nos sistemas de arquivos montados pelo 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 = dirAo usar o ELF ou o SunOS, uma biblioteca compartilhada pode exigir outra. Isso acontece quando um link ” ld -shared ” inclui uma biblioteca compartilhada como um dos arquivos de entrada.

Quando o vinculador encontra essa dependência ao criar um link não compartilhado e não realocável, ele tenta automaticamente localizar a biblioteca compartilhada necessária e incluí-la no link, se não for incluído explicitamente. Nesse caso, a opção -rpath-link especifica o primeiro conjunto de diretórios a serem pesquisados. A opção -rpath-link pode especificar uma sequência de nomes de diretório, especificando uma lista de nomes separados por dois pontos ou aparecendo várias vezes.

Essa opção deve ser usada com cautela, pois substitui o caminho de pesquisa que pode ter sido compilado em uma biblioteca compartilhada. Nesse caso, é possível usar involuntariamente um caminho de pesquisa diferente do que o vinculador de tempo de execução faria.

O vinculador usa os seguintes caminhos de pesquisa para localizar as bibliotecas compartilhadas necessárias:

  1. Todos os diretórios especificados pelas opções -rpath-link .
  2. Qualquer diretório especificado 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 ​​no tempo de execução, enquanto a opção -rpath-link é eficaz apenas no momento do link. A pesquisa de -rpath dessa maneira é suportada apenas por vinculadores nativos e cruzadores que foram configurados com a opção –with-sysroot .
  3. Em um sistema ELF, para vinculadores nativos, se as opções -rpath e -rpath-link não foram usadas, procure o conteúdo da variável de ambiente “LD_RUN_PATH”.
  4. No SunOS, se a opção -rpath não foi usada, procure os diretórios especificados usando as opções -L .
  5. Para um vinculador nativo, procure o conteúdo da variável de ambiente “LD_LIBRARY_PATH”.
  6. Para um vinculador ELF nativo, os diretórios em “DT_RUNPATH” ou “DT_RPATH” de uma biblioteca compartilhada são pesquisados ​​em busca de bibliotecas compartilhadas necessárias. As entradas “DT_RPATH” serão ignoradas se existirem entradas “DT_RUNPATH”.
  7. Os diretórios padrão, normalmente / lib e / usr / lib .
  8. Para um vinculador nativo em um sistema ELF, se o arquivo /etc/ld.so.conf existir, a lista de diretórios encontrados nesse arquivo.

Se a biblioteca compartilhada necessária não for encontrada, o vinculador emitirá um aviso e continuará com o link.

-compartilhado

-Bshareable

Crie uma biblioteca compartilhada. Atualmente, isso é suportado apenas nas plataformas ELF, XCOFF e SunOS. No SunOS, o vinculador criará automaticamente uma biblioteca compartilhada se a opção -e não for usada e houver símbolos indefinidos no link.
–sort-common

–sort-common = ascendente

–sort-common = descendente

Esta opção diz ao ld para classificar os símbolos comuns por alinhamento em ordem crescente ou decrescente quando os colocar nas seções de saída apropriadas. Os alinhamentos de símbolos considerados são dezesseis bytes ou maiores, oito bytes, quatro bytes, dois bytes e um byte. Isso evita intervalos 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 = nomeEsta opção aplicará “SORT_BY_NAME” a todos os padrões de seção curinga no script do vinculador.
–sort-section = alinhamentoEsta opção aplicará “SORT_BY_ALIGNMENT” a todos os padrões de seção curinga no script do vinculador.
– dividir por arquivo [ = tamanho ]Semelhante a –split-by-reloc, mas cria uma nova seção de saída para cada arquivo de entrada quando o tamanho é atingido. O tamanho padrão é 1, se não especificado.
– dividido por reloc [ = contagem ]Tenta criar seções extras no arquivo de saída para que nenhuma seção de saída única contenha mais do que contagem de realocações. Isso é útil ao gerar arquivos relocáveis ​​enormes para fazer o download em certos kernels em tempo real com o formato de arquivo de objeto COFF; já que o COFF não pode representar mais de 65535 realocações em uma única seção. Observe que isso falhará ao trabalhar 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 relocações de contagem, uma seção de saída conterá muitas relocações. O padrão da contagem é um valor de 32768.
–EstatísticasCalcule e exiba estatísticas sobre a operação do vinculador, como tempo de execução e uso de memória.
–sysroot = diretórioUse o diretório como o local do sysroot, substituindo o padrão no momento da configuração. Esta opção é suportada apenas por vinculadores que foram configurados usando –with-sysroot .
– formato tradicionalPara alguns destinos, a saída de ld é diferente em alguns aspectos da saída de algum vinculador existente. Essa opção solicita que o ld use o formato tradicional.

Por exemplo, no SunOS, ld combina entradas duplicadas na tabela de cadeias de símbolos. Isso pode reduzir o tamanho de um arquivo de saída com informações completas de depuração em mais de 30%. Infelizmente, o programa SunOS dbx não consegue ler o programa resultante (embora o gdb não tenha problemas). A opção –traditional-format diz ao ld para não combinar entradas duplicadas.

–section-start = sectionname = orgLocalize uma seção no arquivo de saída no endereço absoluto fornecido pela organização . Você pode usar esta opção quantas vezes forem necessárias para localizar várias seções na linha de comando. organização deve ser um único inteiro hexadecimal; para compatibilidade com outros vinculadores, você pode omitir o 0x inicial geralmente associado a valores hexadecimais. Nota: não deve haver espaço em branco entre o nome da seção , o sinal de igual (” = “) e a organização .
-Tbss = org

-Tdata = org

-Ttext = org

O mesmo que –section-start , com ” .bss “, ” .data ” ou ” .text ” como o nome da seção .
-Texto-segmento = orgAo criar um objeto executável ou compartilhado ELF, ele definirá o endereço do primeiro byte do segmento de texto.
-Trodata-segment = orgAo criar um objeto executável ou compartilhado ELF para um destino em que 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.
–unresolved-symbols = methodDetermine como lidar com símbolos não resolvidos. Existem quatro valores possíveis para o método :

ignore tudoNão relate quaisquer símbolos não resolvidos.
reportar tudoRelate todos os símbolos não resolvidos. Esse é o padrão.
ignorar em arquivos de objetoRelate símbolos não resolvidos que estão contidos em bibliotecas compartilhadas, mas ignore-os se vierem de arquivos de objetos regulares.
ignore-in-shared-libsRelate símbolos não resolvidos provenientes de arquivos de objetos comuns, mas ignore-os se forem provenientes de bibliotecas compartilhadas. Isso pode ser útil ao criar um binário dinâmico e sabe-se que todas as bibliotecas compartilhadas às quais ele deve se referir estão incluídas na linha de comando do vinculador.

O comportamento de bibliotecas compartilhadas por conta própria também pode ser controlado pela opção  [ no- ] allow-shlib-undefined .

Normalmente, o vinculador gera uma mensagem de erro para cada símbolo não resolvido relatado, mas a opção –warn-unresolved-symbols pode mudar isso para um aviso.

–dll-verbose

–verbose [ = NÚMERO]

Exiba o número da versão para ld e liste as emulações do vinculador suportadas. Exibe quais arquivos de entrada podem e não podem ser abertos. Exiba o script do vinculador sendo usado pelo vinculador. Se o argumento NUMBER opcional > 1 , o status do símbolo do plug-in também será exibido.
–version-script = version-scriptfileEspecifique o nome de um script de versão para o vinculador. Isso geralmente é usado ao criar bibliotecas compartilhadas para especificar informações adicionais sobre a hierarquia de versões da biblioteca que está sendo criada. Esta opção é totalmente suportada em plataformas ELF que suportam bibliotecas compartilhadas. É parcialmente suportado em plataformas PE, que podem usar scripts de versão para filtrar a visibilidade de símbolos no modo de exportação automática: todos os símbolos marcados como locais no script de versão não serão exportados.
–warn-commonAvise quando um símbolo comum é combinado com outro símbolo comum ou com uma definição de símbolo. Os vinculadores Unix permitem essa prática um tanto desleixada, mas os vinculadores em alguns outros sistemas operacionais não. Esta opção permite encontrar possíveis problemas ao combinar símbolos globais. Infelizmente, algumas bibliotecas C usam essa prática, portanto, você pode receber alguns avisos sobre símbolos nas bibliotecas e em seus programas.

Existem três tipos de símbolos globais, ilustrados aqui pelos exemplos 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 indefinida, que não aloca espaço. Deve haver 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, ela entrará na área de dados não inicializados do arquivo de saída. O vinculador mescla vários símbolos comuns para a mesma variável em um único símbolo. Se eles são de tamanhos diferentes, ele escolhe o maior tamanho. O vinculador 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: o primeiro descreve o símbolo recém-encontrado e o segundo descreve o símbolo anterior encontrado com o mesmo nome. Um ou os dois símbolos serão um símbolo comum.

1. Transformando um símbolo comum em uma referência, porque já existe uma definição para o símbolo.

  <file> (<section>): aviso: comum de `<symbol> ' 
 substituído por definição 
 <file> (<section>): aviso: definido aqui

2. Transformando um símbolo comum em uma referência, porque é encontrada uma definição posterior para o símbolo. É o mesmo que no caso anterior, exceto que os símbolos são encontrados em uma ordem diferente.

  <file> (<section>): aviso: definição de `<symbol> '
     substituindo comum
 <file> (<section>): aviso: comum está aqui

3. Mesclando um símbolo comum com um símbolo comum anterior do mesmo tamanho.

  <file> (<section>): aviso: vários arquivos comuns
     de `` <symbol> ''
 <file> (<section>): aviso: o anterior comum está aqui

4. Mesclando um símbolo comum com um símbolo comum maior anterior.

  <file> (<section>): aviso: comum de `<symbol> '
     substituído por maior comum
 <file> (<section>): aviso: maior comum está aqui

5. Mesclando um símbolo comum com um símbolo comum menor anterior. É o mesmo que no caso anterior, exceto que os símbolos são encontrados em uma ordem diferente.

  <file> (<section>): aviso: comum de `<symbol> '
     substituindo comum menor
 <file> (<section>): aviso: menor comum está aqui
–warn-construtoresAvise se algum construtor global é usado. Isso é útil apenas 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-multiple-gpAvise se vários valores globais de ponteiro são necessários no arquivo de saída. Isso é significativo apenas para determinados processadores, como o DEC Alpha. Especificamente, alguns processadores colocam constantes de grande valor 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 com eficiência por meio de um modo de endereçamento relativo do registro base. Como o deslocamento no modo relativo do registro base é fixo e relativamente pequeno (por exemplo, 16 bits ), isso limita o tamanho máximo do pool constante. Assim, em programas grandes, geralmente é necessário usar vários valores globais de ponteiro para poder tratar de todas as constantes possíveis. Esta opção faz com que um aviso seja emitido sempre que esse caso ocorrer.
–warn-onceAvise apenas uma vez para cada símbolo indefinido, em vez de uma vez por módulo que se refere a ele.
–warn-section-alignAvise se o endereço de uma seção de saída foi alterado devido ao alinhamento. Normalmente, o alinhamento será definido por uma seção de entrada. O endereço será alterado apenas se não for especificado explicitamente; isto é, se o comando “SECTIONS” não especificar um endereço de início para a seção.
–warn-shared-textrelAvise se o vinculador adiciona um DT_TEXTREL a um objeto compartilhado.
–warn-alternate-emAvise se um objeto possui código de máquina ELF alternativo.
–warn-unresolved-symbolsSe o vinculador reportar um símbolo não resolvido (consulte a opção – símbolos não resolvidos), normalmente ele gera um erro. Essa opção gera um aviso.
–erro-símbolos não resolvidosIsso restaura o comportamento padrão do vinculador de gerar erros quando está relatando símbolos não resolvidos.
–whole-archivePara cada 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 procurar no archive pelos arquivos de objeto necessários. Normalmente, isso é usado para transformar um arquivo morto em uma biblioteca compartilhada, forçando todos os objetos a serem incluídos na biblioteca compartilhada resultante. Esta opção pode ser usada mais de uma vez.

Duas notas ao usar esta opção no gcc : Primeiro, o gcc não sabe sobre essa opção, então você precisa usar -Wl, -whole-archive . Segundo, não esqueça de usar -Wl, -no-whole-archive após sua lista de arquivos, porque o gcc adicionará sua própria lista de arquivos ao seu link e você pode não querer que esse sinalizador os afete também.

–wrap = símboloUse uma função de invólucro para o símbolo . Qualquer referência indefinida ao símbolo será resolvida como ” __wrap_symbol “. Qualquer referência indefinida a ” __real_symbol ” será resolvida como símbolo .

Isso pode ser usado para fornecer um wrapper para uma função do sistema. A função de wrapper deve ser chamada ” __wrap_symbol “. Se desejar chamar a função do sistema, deve chamar ” __real_symbol “.

Aqui está um exemplo trivial:

  vazio *
 __wrap_malloc (size_t c)
 {
   printf ("malloc chamado com% zu \ n", c);
   return __real_malloc (c);
 }

Se você vincular outro código a esse arquivo usando –wrap malloc , todas as chamadas para ” malloc ” chamarão a função ” __wrap_malloc “. A chamada para ” __real_malloc ” em ” __wrap_malloc ” chamará a função ” malloc ” real.

Você também pode fornecer uma função ” __real_malloc “, para que os links sem a opção –wrap sejam bem-sucedidos. Se você fizer isso, não deverá colocar a definição de ” __real_malloc ” no mesmo arquivo que ” __wrap_malloc “; se o fizer, o assembler poderá resolver a chamada antes que o vinculador tenha a chance de encapsulá-la no ” malloc “.

–eh-frame-hdrSolicite a criação da seção ” .eh_frame_hdr ” e do cabeçalho do segmento ELF ” PT_GNU_EH_FRAME “.
–no-ld-gerado-desenrolar-infoSolicite a criação de informações de desenrolamento ” .eh_frame ” para seções de código geradas pelo vinculador, como PLT. Esta opção está ativada por padrão se as informações de desenrolamento geradas pelo vinculador forem suportadas.
–enable-new-dtags

–disable-new-dtags

Esse vinculador pode criar as novas tags dinâmicas no ELF. Mas os sistemas ELF mais antigos podem não entendê-los. Se você especificar –enable-new-dtags , as tags dinâmicas serão criadas conforme necessário. 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 = numberDefina o tamanho padrão das tabelas de hash do vinculador para um número primo próximo a number . Aumentar esse valor pode reduzir o tempo que o vinculador leva para executar suas tarefas, às custas de aumentar os requisitos de memória do vinculador. Da mesma forma, reduzir esse valor pode reduzir os requisitos de memória à custa da velocidade.
–hash-style = styleDefina o tipo de tabela de hash do vinculador. O estilo pode ser ” sysv ” para a seção ELF clássica ” .hash “, ” gnu ” para o novo estilo GNU “.gnu.hash” ou ” ambos ” para a ELF clássica ” .hash ” e o novo estilo GNU “.gnu .hash “tabelas de hash. O padrão é ” sysv “.
–reduzir sobrecarga de memóriaEssa opção reduz os requisitos de memória no tempo de execução ld , à custa da velocidade de vinculação. Isso foi introduzido para selecionar o antigo algoritmo O (n ^ 2) para geração de arquivo de mapa de links, em vez do novo algoritmo O (n) que utiliza cerca de 40% mais memória para armazenamento de símbolos.

Outro efeito do comutador é definir o tamanho da tabela de hash padrão como 1021, o que economiza memória à custa do aumento do tempo de execução do vinculador. Isso não é feito, no entanto, se a opção –hash-size tiver sido usada.

A opção –reduce-overheads-overheads também pode ser usada para permitir outras compensações em versões futuras do vinculador.

–build-id

–build-id = estilo

Solicite a criação da seção de notas ELF ” .note.gnu.build-id “. O conteúdo da nota são bits únicos que identificam esse arquivo vinculado. O estilo pode ser ” uuid ” para usar 128 bits aleatórios, ” sha1 ” para usar um hash SHA1 de 160 bits nas partes normativas do conteúdo de saída, ” md5 ” para usar um hash MD5 de 128 bits nas partes normativas do conteúdo de saída ou ” 0xhexstring ” para usar uma sequência de bits escolhida especificada como um número par de dígitos hexadecimais (”  ” e ” : ” caracteres entre pares de dígitos são ignorados). Se o estilo for omitido, ” sha1 ” será usado.

Os estilos ” md5 ” e ” sha1 ” produzem um identificador que é sempre o mesmo em um arquivo de saída idêntico, mas será exclusivo entre todos os arquivos de saída não-idênticos. Não se destina a ser comparado como uma soma de verificação para o conteúdo do arquivo. Um arquivo vinculado pode ser alterado posteriormente por outras ferramentas, mas a sequência de bits do ID de construção que identifica o arquivo vinculado original não muda.

Passar ” none ” para o estilo desabilita a configuração de qualquer opção ” –build-id ” anteriormente na linha de comando.

O vinculador i386 PE 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 ” * .dll ” ao 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, ele deve preceder os arquivamentos dos quais exporta símbolos, para garantir que eles sejam vinculados, apenas como um arquivo de objeto normal).

Além das opções comuns a todos os destinos, o vinculador do i386 PE oferece suporte a opções adicionais de linha de comando específicas do destino do i386 PE. As opções que aceitam valores podem ser separadas de seus valores por um espaço ou por um sinal de igual.

–add-stdcall-aliasSe 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 direcionada ao i386 PE do vinculador]
– arquivo -base- fileUse file como o nome de um arquivo no qual salvar os endereços base de todas as realocações necessárias para gerar DLLs com o dlltool . [Esta é uma opção específica do i386 PE]
–dllCrie uma DLL em vez de um executável comum. Você também pode usar -shared ou especificar uma ” BIBLIOTECA ” em um determinado arquivo ” .def “. [Esta opção é específica para a porta direcionada ao i386 PE do vinculador]
–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, o limite normal para Coff. Por padrão, esses nomes são permitidos apenas nos arquivos de objetos, pois as imagens executáveis ​​totalmente vinculadas não carregam a tabela de cadeias Coff necessária para suportar os nomes mais longos. Como uma extensão GNU, é possível permitir seu uso também em imagens executáveis ​​ou (provavelmente sem sentido) proibi-lo em arquivos de objetos, usando essas duas opções. As imagens executáveis ​​geradas com esses nomes de seção longos são um pouco fora do padrão, carregando uma tabela de cadeias de caracteres, e podem gerar resultados confusos quando examinadas com ferramentas que não reconhecem PE do GNU, como visualizadores de arquivos e dumpers. No entanto, o GDB depende do uso de nomes de seções longas do PE para encontrar seções de informações de depuração do Dwarf-2 em uma imagem executável em tempo de execução e, portanto, se nenhuma opção for especificada na linha de comando, o ld ativará nomes de seções longos, substituindo o padrão e comportamento tecnicamente correto, quando encontra a presença de informações de depuração enquanto vincula uma imagem executável e não remove símbolos. [Esta opção é válida para todas as portas direcionadas ao PE do vinculador]
–enable-stdcall-fixup

–disable-stdcall-fixup

Se o link encontrar um símbolo que não possa ser resolvido, ele tentará “vincular difusa” procurando outro símbolo definido que difira apenas no formato do nome do símbolo ( cdecl vs stdcall ) e resolverá esse símbolo vinculando-o ao Combine. Por exemplo, o símbolo indefinido ” _foo ” pode estar vinculado à função ” _foo@12 ” ou o símbolo indefinido ” _bar@16 ” pode estar 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 estará totalmente ativado e os avisos não serão impressos. Se você especificar –disable-stdcall-fixup , esse recurso será desativado e essas incompatibilidades serão consideradas erros. [Esta opção é específica para a porta direcionada ao i386 PE do vinculador]
– sublinhado

–no-líder-sublinhado

Para a maioria dos destinos, o símbolo-prefixo padrão é um sublinhado e é definido na descrição do destino. Com esta opção, é possível desativar / ativar o prefixo de símbolo de sublinhado padrão.
–export-all-symbolsSe fornecido, todos os símbolos globais nos objetos usados ​​para criar uma DLL serão exportados pela DLL. Observe que esse é o padrão se não houver símbolos exportados. Quando os símbolos são exportados explicitamente 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 essa 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 nas DLLs do C ++. Finalmente, há uma extensa lista de símbolos privados do cygwin que não são exportados (obviamente, isso se aplica ao criar DLLs para destinos do cygwin ). Essas exclusões de 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 ” environment “. [Esta opção é específica para a porta direcionada ao i386 PE do vinculador]
–exclude-symbols symbol, symbol, …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 direcionada ao i386 PE do vinculador]
–exclude-all-symbolsEspecifica que nenhum símbolo deve ser exportado automaticamente. [Esta opção é específica para a porta direcionada ao i386 PE do vinculador]
–alinhamento de arquivosEspecifique o alinhamento do arquivo. As seções no arquivo sempre começam com deslocamentos de arquivo que são múltiplos desse número. O padrão é 512. [Esta opção é específica para a porta de destino do i386 PE do vinculador]
 reserva de pilha

 reserva de pilha , confirmar

Especifique o número de bytes de memória a serem reservados (e, opcionalmente, confirmados) a serem usados ​​como heap para este programa. O padrão é 1Mb reservado, 4K confirmado. [Esta opção é específica para a porta direcionada ao i386 PE do vinculador]
 valor base da imagemUse o valor como o endereço base do seu programa ou dll. Este é o local mais baixo de memória que será usado quando o programa ou a dll for carregada. Para reduzir a necessidade de realocar e melhorar o desempenho de suas dlls, cada uma deve ter um endereço base exclusivo e não se sobrepor a outras dlls. O padrão é 0x400000 para executáveis ​​e 0x10000000 para dlls. [Esta opção é específica para a porta direcionada ao i386 PE do vinculador]
–kill-atSe fornecido, os sufixos stdcall ( @nn ) serão removidos dos símbolos antes de serem exportados. [Esta opção é específica para a porta direcionada ao i386 PE do vinculador]
–grande-endereço-cienteSe fornecido, o bit apropriado no campo “Características” do cabeçalho COFF é definido para indicar que este executável oferece suporte a 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 portas direcionadas ao PE do vinculador]
 valor da versão da imagem principalDefine o número principal da “versão da imagem”. O padrão é 1. [Esta opção é específica para a porta de destino do i386 PE do vinculador]
–major-os-version valueDefine o número principal da “versão do sistema operacional”. O padrão é 4. [Esta opção é específica para a porta de destino do i386 PE do vinculador]
–major-subsystem-version valueDefine o número principal da “versão do subsistema”. O padrão é 4. [Esta opção é específica para a porta de destino do i386 PE do vinculador]
– valor da versão menor da imagemDefine o número menor da “versão da imagem”. O padrão é 0. [Esta opção é específica para a porta de destino do i386 PE do vinculador]
–minor-os-version valueDefine o número menor da “versão do sistema operacional”. O padrão é 0. [Esta opção é específica para a porta de destino do i386 PE do vinculador]
–minor-subsystem-version valueDefine o número menor da “versão do subsistema”. O padrão é 0. [Esta opção é específica para a porta de destino do i386 PE do vinculador]
Arquivo –output-defO ligante criará o ficheiro de arquivo que irá conter um arquivo DEF correspondente ao DLL o ligante está a gerar. Esse 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 direcionada ao i386 PE do vinculador]
–out-implib arquivoThe linker will create the file file which will contain an import lib corresponding to the DLL the linker is generating. This import lib (which should be called ” *.dll.a ” or ” *.a ” may be used to link clients against the generated DLL; this behaviour makes it possible to skip a separate ” dlltool ” import library creation step. [This option is specific to the i386 PE targeted port of the linker]
–enable-auto-image-baseAutomatically choose the image base for DLLs, unless one is specified using the ” –image-base ” argument. By using a hash generated from the dllname to create unique image bases for each DLL, in-memory collisions and relocations which can delay program execution are avoided. [This option is specific to the i386 PE targeted port of the linker]
–disable-auto-image-baseDo not automatically generate a unique image base. If there is no user-specified image base (” –image-base “) then use the platform default. [This option is specific to the i386 PE targeted port of the linker]
–dll-search-prefix stringWhen linking dynamically to a dll without an import library, search for ” <string><basename>.dll ” in preference to ” lib<basename>.dll “. This behaviour allows easy distinction between DLLs built for the various “subplatforms”: native , cygwin , uwin , pw , etc. For instance, cygwin DLLs typically use ” –dll-search-prefix=cyg “. [This option is specific to the i386 PE targeted port of the linker]
–enable-auto-importDo sophisticated linking of ” _symbol ” to ” __imp__symbol ” for DATA imports from DLLs, and create the necessary thunking symbols when building the import libraries with those DATA exports. Note: Use of the ‘ auto-import ‘ extension will cause the text section of the image file to be made writable. This does not conform to the PE-COFF format specification published by Microsoft.

Note: use of the ‘auto-import’ extension will also cause read only data which would normally be placed into the .rdata section to be placed into the .data section instead. This is to work around a problem with consts that is described at the cygwin website .

Using ‘auto-import’ generally will ‘just work’, but sometimes you may see this message:

 "variable '<var>' can't be auto-imported. 
Please read the documentation for 
ld's "--enable-auto-import" for details."

This message occurs when some (sub)expression accesses an address ultimately given by the sum of two constants (Win32 import tables only allow one). Instances where this may occur include accesses to member fields of struct variables imported from a DLL, as well as using a constant index into an array variable imported from a DLL. Any multiword variable ( array s, struct s, long long , etc) may trigger this error condition. However, regardless of the exact data type of the offending exported variable, ld will always detect it, issue the warning, and exit.

There are several ways to address this difficulty, regardless of the data type of the exported variable:

One way is to use –enable-runtime-pseudo-reloc switch. This leaves the task of adjusting references in your client code for runtime environment, so this method works only when runtime environment supports this feature.

A second solution is to force one of the ‘constants’ to be a variable — that is, unknown and un-optimizable at compile time. For arrays, there are two possibilities: a) make the indexee (the array’s address) a variable, or b) make the ‘constant’ index a variable. Portanto:

 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] } 

For struct s (and most other multiword data types) the only option is to make the struct itself (or the long long , etc.) variable:

 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 }

A third method of dealing with this difficulty is to abandon ‘auto-import’ for the offending symbol and mark it with ” __declspec(dllimport) “. However, in practice that requires using compile-time #defines to indicate whether you are building a DLL, building client code that will link to the DLL, or merely building/linking to a static library. In making the choice between the various methods of resolving the ‘direct address with constant offset’ problem, you should consider typical real-world usage:

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){
  printf("%d\n",arr[1]);
 }

Solução 2:

foo.h :

 extern int arr[];

foo.c :

 #include "foo.h"
void main(int argc, char **argv){
  /* This workaround is for win32 
     and cygwin; do not "optimize" */
  volatile int *parr = arr;
  printf("%d\n",parr[1]);
 }

A fourth way to avoid this problem is to re-code your library to use a functional interface rather than a data interface for the offending variables (eg, set_foo() and get_foo() accessory functions). [This option is specific to the i386 PE targeted port of the linker]

–disable-auto-importDo not attempt to do sophisticated linking of ” _symbol ” to ” __imp__symbol ” for DATA imports from DLLs. [This option is specific to the i386 PE targeted port of the linker]
–enable-runtime-pseudo-relocIf your code contains expressions described in –enable-auto-import section, that is, DATA imports from DLL with non-zero offset, this switch will create a vector of ‘runtime pseudo relocations’ which can be used by runtime environment to adjust references to such data in your client code. [This option is specific to the i386 PE targeted port of the linker]
–disable-runtime-pseudo-relocDo not create pseudo relocations for non-zero offset DATA imports from DLLs. Esse é o padrão. [This option is specific to the i386 PE targeted port of the linker]
–enable-extra-pe-debugShow additional debug info related to auto-import symbol thunking. [This option is specific to the i386 PE targeted port of the linker]
–section-alignmentSets the section alignment. Sections in memory will always begin at addresses that are a multiple of this number. Defaults to 0x1000 . [This option is specific to the i386 PE targeted port of the linker]
–stack reserve

–stack reserve , commit

Specify the number of bytes of memory to reserve (and optionally commit) to be used as stack for this program. The default is 2Mb reserved, 4K committed. [This option is specific to the i386 PE targeted port of the linker]
–subsystem which

–subsystem which : major

–subsystem which : major . menor

Specifies the subsystem under which your program will execute. The legal values for which are ” native “, ” windows “, ” console “, ” posix “, and ” xbox “. You may optionally set the subsystem version also. Numeric values are also accepted for which. [This option is specific to the i386 PE targeted port of the linker]

The following options set flags in the “DllCharacteristics” field of the PE file header: [These options are specific to PE targeted ports of the linker]

–dynamicbaseThe image base address may be relocated using address space layout randomization (ASLR). This feature was introduced with MS Windows Vista for i386 PE targets.
–forceintegCode integrity checks are enforced.
–nxcompatThe image is compatible with the Data Execution Prevention. This feature was introduced with MS Windows XP SP2 for i386 PE targets.
–no-isolationAlthough the image understands isolation, do not isolate the image.
–no-sehThe image does not use SEH. No SE handler may be called from this image.
–no-bindDo not bind this image.
–wdmdriverThe driver uses the MS Windows Driver Model.
–tsawareThe image is Terminal Server aware.

The C6X uClinux target uses a binary format called DSBT to support shared libraries. Each shared library in the system needs to have a unique index; all executables use an index of 0.

–dsbt-size sizeThis option sets the number of entires in the DSBT of the current executable or shared library to size. The default is to create a table with 64 entries.
–dsbt-index indexThis option sets the DSBT index of the current executable or shared library to index. The default is 0, which is appropriate for generating executables. If a shared library is generated with a DSBT index of 0, the “R_C6000_DSBT_INDEX” relocs are copied into the output file.

The –no-merge-exidx-entries switch disables the merging of adjacent exidx entries in frame unwind info.

The 68HC11 and 68HC12 linkers support specific options to control the memory bank switching mapping and trampoline code generation.

–no-trampolineThis option disables the generation of trampoline. By default, a trampoline is generated for each far function that is called using a “jsr” instruction (this happens when a pointer to a far function is taken).
–bank-window nameThis option indicates to the linker the name of the memory region in the MEMORY specification that describes the memory bank window. The definition of such region is then used by the linker to compute paging and addresses within the memory window.

The following option is supported to control handling of GOT generation when linking for 68K targets.

–got= typeThis option tells the linker which GOT generation scheme to use. The type should be one of single , negative , multigot or target . For more information refer to the Info entry for ld .

Meio Ambiente

You can change the behaviour of ld with the environment variables ” GNUTARGET “, ” LDEMULATION ” and ” COLLECT_NO_DEMANGLE “.

” GNUTARGET ” determines the input-file object format if you don’t use -b (or its synonym –format ). Its value should be one of the BFD names for an input format. If there is no ” GNUTARGET ” in the environment, ld uses the natural format of the target. If ” GNUTARGET ” is set to “default” then BFD attempts to discover the input format by examining binary input files; this method often succeeds, but there are potential ambiguities, since there is no method of ensuring that the magic number used to specify object-file formats is unique. However, the configuration procedure for BFD on each system places the conventional format for that system first in the search-list, so ambiguities are resolved in favor of convention.

” LDEMULATION ” determines the default emulation if you don’t use the -m option. The emulation can affect various aspects of linker behaviour, particularly the default linker script. You can list the available emulations with the –verbose or -V options. If the -m option is not used, and the ” LDEMULATION ” environment variable is not defined, the default emulation depends upon how the linker was configured.

Normalmente, o vinculador usará como padrão símbolos desmontáveis. No entanto, se ” COLLECT_NO_DEMANGLE ” estiver definido no ambiente, o padrão será não desmembrar símbolos. Essa variável de ambiente é usada de maneira semelhante pelo programa wrapper gcc linker. O padrão pode ser substituído pelas opções –demangle e –no-demangle .

Exemplos

 ld -o output /lib/crt0.o hello.o -lc

Vincular o arquivo /lib/crt0.o com os arquivos hello.o e libc.a (que é encontrada através de pesquisa os diretórios padrão de busca biblioteca), ea saída do arquivo vinculado para o arquivo de saída .

as – Um montador.
gprof – Exibir dados do perfil do gráfico de chamada.
pvs – Exibe as informações da versão interna de objetos dinâmicos em um arquivo ELF.

19 de novembro de 2019

Sobre nós

A Linux Force Brasil é uma empresa que ama a arte de ensinar. Nossa missão é criar talentos para a área de tecnologia e atender com excelência nossos clientes.

CNPJ: 13.299.207/0001-50
SAC:         0800 721 7901

[email protected]

Comercial  Comercial: (11) 3796-5900

Suporte:    (11) 3796-5900
[email protected]

Copyright © Linux Force Security  - Desde 2011.