Wednesday 2 August 2017

Statically Linkedin Binary Options


Eu construí QT 5.0.1 estaticamente em VS 2010 em Windows 7 x64. Os parâmetros de configuração foram configurados - debug-and-release - opensource - confirm-license - platform win32-msvc2010 - exemplos de nomake - nomake testes - no-webkit - static e executei a compilação com jom com os seguintes parâmetros: O processo de compilação foi bem-sucedido E eu posso encontrar todas as libs e link meu aplicativo com QT estaticamente. Agora o problema é que quando eu tento executar o aplicativo, ele me dá um erro Falha ao carregar janelas do plugin da plataforma. Plataformas disponíveis são: Mas abaixo deste erro, ele não aparece nenhuma plataforma. Eu encontrei o mesmo erro ao ligar dinamicamente QT. Eu me livrei disso colocando DLLs de dependência (qt5core. dll, qt5gui. dll etc) no mesmo diretório do meu exe. Mas eu não consigo descobrir um caminho dessa vez. Após a compilação estática do QT, as DLLs nos plugins / plataformas / pasta desapareceram e são substituídas por libs. Eu também tentei link estaticamente com qwindows. lib, mas sem sucesso. Qualquer idéia Atenciosamente. Para verificar quais DLL são necessários para implantar seu aplicativo no Windows, use dependência Walker (www. dependencywalker /). De acordo com a página de documentação Qt para Windows - Deployment algumas DLL são necessárias para implantar um aplicativo Qt em plataformas Windows: Dependendo do compilador que você usa para compilar o aplicativo, algumas outras bibliotecas podem ser necessárias: MSVC bibliotecas específicas: msvcrXX. dll msvcpXX. Dll Bibliotecas específicas MinGW libgccsdw2-1.DLL libstdc-6.dll Observação: em todos esses arquivos, substitua XX pela versão atual da DLL em seu sistema. Se você didnt construir Qt estaticamente (padrão), você também precisará Qt5 DLL dependendo do módulo Qt que você usa em seu aplicativo. Exemplo: Todas essas DLL podem ser encontradas na pasta bin, em seu diretório de instalação do Qt. EDIT Recentemente, desenvolvedores Qt criou uma ferramenta chamada windeployqt. exe que ajuda você a reunir todas as bibliotecas necessárias para implantar um aplicativo: por Johan Petersson Ligando libstdc estaticamente Christopher Baus escreve sobre seus problemas ligando libstdc estaticamente. Sim, fazer binários C que funcionam corretamente em distribuições Linux diferentes é um pouco doloroso. O problema não é tanto ligar libstdc estaticamente é apenas uma biblioteca, afinal, exceto o suporte de runtime exigido pelo código C em geral, para permitir recursos como RTTI e manipulação de exceção. O código de suporte de tempo de execução usado por diferentes partes de um aplicativo C precisa ser compatível. Se uma parte do programa precisa de dynamiccast ou capturar objetos fornecidos por outro, ambas as partes devem concordar com certos detalhes de implementação: como encontrar vtables, como desenrolar a pilha e assim por diante. Para C e alguns outros idiomas compatíveis com o GCC com características semelhantes, tais detalhes são especificados por um ABI C. Sempre que o ABI usado pelas alterações do GCC você acabará com bibliotecas incompatíveis produzidas pelas diferentes versões do GCC. O mesmo é verdadeiro para C liso, mas o ABI de C é muito mais simples e foi em torno de um muito mais longo assim que seu razoavelmente estável. Tanto quanto sei, as alterações de ABI foram introduzidas com cada grande libertação de GCC (isto é, aquelas com componentes de número de primeira ou segunda versão diferentes). Para piorar as coisas, a maioria das principais distribuições Linux usam instantâneos do GCC e / ou corrigem suas versões do GCC, tornando praticamente impossível saber exatamente quais versões do GCC você pode estar lidando ao distribuir binários. Note que este problema não pode, em geral, ser resolvido através da ligação estática. Em primeiro lugar, o código compilado contra diferentes ABIs simplesmente não é compatível com binários. Não importa se você conseguir ligar código binário incompatível juntos, porque ele nunca funcionará corretamente. Em segundo lugar, o suporte de tempo de execução de linguagem normalmente depende de alguns dados sendo compartilhados, p. Para acessar algum tipo de bloqueio ou estrutura de dados global (semelhante à forma como os programas C precisam de uma errno compartilhada). Dados compartilhados implica que sempre que mais de uma parte de um programa precisa do suporte de tempo de execução e qualquer uma dessas partes é dinamicamente carregado, o suporte de tempo de execução precisa ser carregado dinamicamente também. Caso contrário, as diferentes partes do programa acabariam com cópias dos dados em vez de uma instância compartilhada. Essa é a razão para colocar o código de suporte de tempo de execução de idioma em uma biblioteca dinâmica por padrão. Existem muitas soluções alternativas diferentes e nenhuma solução perfeita, mas um compromisso bastante viável é ligar todo o código C a um executável ao usar bibliotecas C carregadas dinamicamente. Desta forma, há apenas uma parte do programa que precisa de mecanismos de suporte de tempo de execução C, que podem, portanto, ser vinculados de forma estática. Você pode misturar e combinar bibliotecas C vinculadas de forma estática e dinâmica, mas nenhum código C (ou qualquer código usando o suporte de tempo de execução C) pode ser vinculado dinamicamente para que isso funcione. Agora, o problema prático que as pessoas enfrentam quando tentam ligar libstdc estaticamente é que g. O front-end do GCC para compilar e vincular C, adiciona as bibliotecas apropriadas eo código de inicialização para C automaticamente e ligará um pouco desse código dinamicamente por padrão: Os links binários resultantes para uma versão compartilhada do libstdc, a biblioteca C padrão, E uma versão compartilhada do libgcc, uma biblioteca de suporte de tempo de execução do GCC necessária para o tratamento de exceções entre outras coisas. Este binário não funciona em uma máquina com versões diferentes dessas bibliotecas, mas como não precisa de outras bibliotecas C dinamicamente carregadas, a incompatibilidade pode ser removida ligando libstdc e libgcc estaticamente. Consultando a página do manual GCC, você encontrará a opção GCC - static-libgcc mencionada. Ele faz o link do compilador libgcc estaticamente ao invés de dinamicamente. O que aconteceu aqui Lembre-se do que eu disse anteriormente sobre não carregar qualquer código C dinamicamente Uma vez que ainda estamos ligando dinamicamente para libstdc, o código de suporte de tempo de execução em libgcc também deve ser vinculado dinamicamente. G ignorou o sinalizador - static-libgcc porque ligar libgcc estaticamente não resultaria em um programa que funcione corretamente. Precisamos vincular estaticamente as duas bibliotecas, ou nenhuma delas. Você pode pedir a g para lhe dizer exatamente quais são as etapas envolvidas na vinculação de um programa C (tente a opção - v se estiver curioso) e invoque um conjunto de comandos ligeiramente diferente para vincular seu aplicativo às versões estáticas do libstdc e do libgcc. Mas integrá-lo em seu próprio processo de compilação é doloroso, propenso a erros e específico para a máquina e a versão do compilador que você usa. Theres nenhuma opção - static-libstdc para ir junto com - static-libgcc. Mas você pode deixar que o compilador lhe diga o caminho para a biblioteca estática libstdc que usaria, e deixe g procurar bibliotecas em um diretório onde ele só vai encontrar a versão estática (neste caso o nosso diretório de compilação): Mais uma vez, para isso Para trabalhar de forma confiável você não deve usar dinamicamente carregado C código, incluindo o código carregado com dlopen. Em particular, a vinculação estática do código de suporte de tempo de execução é contra-indicada ao criar bibliotecas C dinamicamente carregáveis. Dependendo do seu linker pode ser possível, mas o planejamento para distribuir tais binários ainda é muito uma ordem para uma lata super-dimensionada de worms. Atualização: A partir do GCC 4.5 existe agora uma opção de compilador - static-libstdc que faz o que o youd espera que ele faça. (Graças a Tim Hutt por apontar isso.) Por christopher baus Johan. Obrigado por resolver isso. Eu entendo o problema de usar. sos que foram compilados contra a versão diferente do libstdc. Mas isso pode ser evitado ligando estaticamente todo o executável (menos libc). O resultado final que eu acredito é melhor para o usuário eo mantenedor (eu). Por ligação estática não existem dependências externas que devem ser satisfeitas. Seu executável acaba um pouco maior, mas no meu caso não é tão ruim. O que eu achei extraordinariamente frustrante é que - static-libgcc falha silenciosamente. Ainda estou confuso com sua solução para usar - L / some / path / to / libstdc /. A única maneira de obter gcc estaticamente link é fisicamente mover a biblioteca por Johan Sua certamente não é a única maneira, apenas a maneira mais fácil que eu conheço. Eu só preciso fazer que libstdc. a symlink um alvo no meu makefile e deixar g saber onde procurá-lo. As alternativas geralmente requerem algumas opções de links e bibliotecas especificadas na ordem correta e acho que é complicado conseguir a correta. Por Garrett Rooney Note que ligar o código C estaticamente tem alguns problemas além do que eu vi vocês discutirem. Especificamente, o ordenamento não determinístico da instanciação global de objetos pode ser um problema. Digamos que você tem no objeto global em uma biblioteca, e outra em outra biblioteca, e dentro de seus construtores eles conseguem fazer algo tal que um depende do outro. Em um mundo ligado estáticamente, você pode acabar em situações em que um objeto global é usado antes que seu construtor seja chamado, o que é desnecessário dizer que é uma coisa ruim. A causa raiz é o fato de que a ordem na qual os construtores de objetos globais é chamado é fixa (e arbitrária), e não é dependente de suas interdependências. Em um mundo dinamicamente vinculado, você pode contornar o problema forçando o vinculador de tempo de execução para lidar com a ordenação, você envolver o acesso ao objeto em uma função de algum tipo, e quando essa função é chamada o vinculador runtime puxa na outra biblioteca, o que faz com que O construtor a ser chamado cedo o suficiente. Eu percebo que este não é o tipo de problema que você está tentando resolver, mas estou apenas tentando apontar que a ligação estática não é a solução de fim-tudo ser-tudo para todos os problemas em terra C. Por Johan Não há garantias sobre a ordem de inicialização de objeto estático em C é uma limitação no idioma. Se um programa C ou biblioteca precisa de uma certa ordem de inicialização para funcionar corretamente, dependendo de recursos de plataforma inerentemente não-portáteis, e os desenvolvedores devem estar cientes de que isso sempre acontece com o custo do código frágil. Eu posso entender o desejo de liberar binários agnósticos de distribuição - quero dizer, se você está indo para distribuir binários, por que não para o maior número possível de plataformas - por Ken MacLeod (/ me acrescenta outro blog ao leitor de feeds, O que eu ainda não entendo é como o quotlast 20quot é manipulado: diferenças no ambiente de tempo de execução fora do próprio código. Ou seja. Layout de sistema de arquivos, scripts de inicialização / desligamento, log, integração, etc. Parece-me que há apenas um quotnichequot entre programas pequenos o suficiente que pode dinamicamente link contra várias distribuições e programas suficientemente grande para que o ambiente fora do executável é tão importante. Estou faltando alguma coisa por christopher baus O RedHat como distribuições todos basicamente usar os mesmos scripts rc e layouts de sistema de arquivos, mas eles têm diferentes versões do libstdc. Essa é uma razão. Eu também gosto de saber exatamente o que eu estou ligando para. No Windows isso particularmente se torna um pesadelo desde DLLs arent versionado. Além disso, você não precisa de usuários para resolver dependências, o que requer acesso root. Por Mike Hearn Statically ligando libgccs provavelmente não é uma boa idéia: para um, cada versão GCC 3.x fornece e AFAIK não mudou incompatível. Por outro lado, dá-lhe uma dependência silenciosa em versões mais recentes do glibc (vá dar uma olhada no símbolo registerframeinfobases seu binário acabou de adquirir). Para o projeto autopackage, forçamos a vinculação dinâmica do libgccs e colocá-lo no sistema no momento da instalação, se não estiver lá. Por Matt Hall OBRIGADO MUITO Você me salvou de um desastre de lançamento do projeto esta noite provocada por um conflito entre um 32-bit e um 64-bit libgcc. Por Karl Berry Eu tive recentemente este mesmo problema, querendo ligar libstdc estaticamente. Uma vez que esta página da web foi útil leitura, eu pensei Id post minha solução (até agora). Talvez alguém ache útil. Isso foi para o TeX Live. Que inclui o lcdf-typetools. Que são escritos em C. TL distribui binários. Eu não preciso explicar a dor resultante para quem lê aqui :). Eu não queria ter que configurar um diretório separado, como discutido acima, uma vez que (por causa das incompatibilidades libc, suspiro) o meu não é a máquina de construção final. Descobri que eu poderia obter link estático usando gcc em vez de g como o front-end, como no seguinte script de uma linha: Então eu digo a automake para usá-lo, digamos o seu nome cxxhack: (bem, para TL sua realmente vários Camadas de distância de uma chamada de configuração direta, mas isso não importa aqui.) Explicação: acontece que (incrivelmente irritante) g não usa o arquivo de especificações para determinar o comando de link final 8211 a parte stdc é hardwired no binário e não Variável de ambiente ou configuração de tempo de execução pode alterá-lo, tanto quanto eu poderia ver. (Gcc-3.4.4 / gcc / cp / gspec. c, linha 303 ou assim). Assim, a idéia é usar gcc em vez de g ou c para o compilador front-end, e link com - lstdc nós mesmos. G / c automaticamente link com-lm. Então nós fazemos isso também. Talvez haja uma maneira mais limpa de alterar a configuração de configuração do lcdf para obter a mesma linha de link, mas não consegui encontrá-la de improviso. Eu escrevi para bug-automake para o conselho. Algumas das saídas do configure pareciam duvidosas (quotno-lstdcquot), mas os binários pareciam funcionar. E ldd não relata nenhum libstdc. Aleluia. Suponho que isso não vai funcionar em face de exceções ou outras questões como mencionado aqui, mas estou esperando que ele será suficiente para nós. Se alguém tem quaisquer comentários ou sugestões melhores, Id ser grato ouvir. Meu e-mail é karlfreefriends. org. Por marvind Eu tentei o seguinte comando no RedHat Enterprise Linux 3.0 gcc - o exemplo example. cpp /usr/lib/gcc-lib/i386-redhat-linux/3.2.3/libstdc. a (o caminho da biblioteca a partir da saída de g - print-file-namelibstdc. a como você assinalou). A saída do ldd é: marlocalhost testldd example libc. so.6 gt /lib/tls/libc. so.6 (0xb749e000) /lib/ld-linux. so.2 gt /lib/ld-linux. so.2 ( 0xb75eb000) Parece que ele ligou a versão gcc corretamente. Observe que eu não especifiquei o local. De libgcc em tudo. Então, eu não sei por que eu tenho que especificar o - Bstatic, etc. Eu tenho o libstdc. so no local usual em / usr / lib com libgcc. so sob / lib. Agradeço uma clarificação. Obrigado. Por Johan marvind, você está compilando e vinculando código C com gcc em vez de g. Isso não é garantido para o trabalho, por precisamente as razões que eu menciono no início do meu post. Mesmo se você não obtiver erros durante a compilação e vinculação, o executável pode falhar inesperadamente ao usar determinados recursos C. Por Tony Feick Você já teve algum problema tentando link estático libpthread por Dmitry Johan, obrigado por sua nota maravilhosa. Se eu entendo corretamente, essa abordagem não funcionará se eu gostaria de vincular minha biblioteca SO com STDC estaticamente (porque todos os arquivos objeto em libstdc. a são compilados sem - fpic). Estou certo O que é a saída por Andrew Schetinin Obrigado por um artigo muito bom. Atualmente estou tendo uma tarefa semelhante, e encontrei um monte de problemas no caminho, além do que você tem aqui. Alguns Linux mais antigos tinham bugs em libstdc. a (havia um link simbólico apontando para arquivo não existente, ou havia símbolos em falta) - que foi resolvido pela aplicação de patches recentes. Também queríamos compilar nosso código com o gcc 4.1.2, pelo menos no RedHat 5, e ainda ser capaz no RedHat 4 (que tem a mesma versão do libstdc, mas mais antigo GLIBC). Não há problema com isso, desde que você ligue para libstdc. so (contanto que nenhum mais recente GLIBC recursos são usados, e - Wl, hash-styleboth é fornecido. Mas ele não funciona assim com ligação estática para libstdc anymore, desde Não há maneira de contornar esses novos símbolos GLIBC. Para Dmitry: Estranho, 32 libstdc bit não causa problemas ao ligar estaticamente a ele, mas 64 libstdc de bits não é tão bom - ele não consegue ligar para uma biblioteca compartilhada. É uma página muito boa eu encontrei sobre o assunto, o que explica que - por Varun Muralidharan Este artigo foi muito interessante. Por favor, venha com mais bibliotecas articlesLink depois de arquivos de objetos especialmente bibliotecas estáticas. Em versões antigas e modernas do ambiente de link (I39m não Seguro do status quo para versões modestamente antigas a partir de novembro de 2010), listando a biblioteca estática antes do arquivo code. c garante que os símbolos nele serão ignorados a menos que aconteça ser uma função main () em um do objeto de biblioteca Ndash Jonathan Leffler Apr 20 14 at 21:09 jb por padrão, gcc links dinamicamente. Quando você usa - lsomedynamiclib ele fica vinculado dinamicamente como esperado. Mas, quando gcc é dada uma biblioteca estática explicitamente, ele sempre tentará vinculá-lo estaticamente. Há, no entanto, alguns detalhes complicados sobre a ordem em que os símbolos se resolvem não sei bem como isso funciona. Eu aprendi que, quando em dúvida, tente reorganizar a ordem das bandeiras de biblioteca :-) ndash bchurchill Ago 5 at 23:02 Da manpage de ld (isto não funciona com gcc), referindo-se à opção --static: Você pode Use essa opção várias vezes na linha de comando: ela afeta a biblioteca que procura as opções - l que a seguem. Uma solução é colocar suas dependências dinâmicas antes da opção --static na linha de comando. Outra possibilidade é não usar --static. Mas, em vez disso, fornecer o nome de arquivo / caminho completo do arquivo de objeto estático (isto é, não usar a opção - l) para vincular estaticamente uma biblioteca específica. Exemplo: Como você pode ver no exemplo, libX11 não está na lista de bibliotecas vinculadas dinamicamente, pois foi vinculada estaticamente. Cuidado: Um arquivo. so sempre está vinculado dinamicamente, mesmo quando especificado com um nome de arquivo / caminho completo. Respondeu Nov 11 10 at 15:40 O problema como eu entendo é como segue. Você tem várias bibliotecas, algumas estáticas, algumas dinâmicas e outras estáticas e dinâmicas. Gcc s comportamento padrão é a ligação principalmente dinâmico. Ou seja, gcc links para bibliotecas dinâmicas quando possível, mas de outra forma cai de volta para bibliotecas estáticas. Quando você usa a opção - static para o gcc, o comportamento é apenas ligar bibliotecas estáticas e sair com um erro se nenhuma biblioteca estática puder ser encontrada, mesmo se houver uma biblioteca dinâmica apropriada. Outra opção, que eu tenho em várias ocasiões queria gcc tinha, é o que eu chamo de - mostalmente-estático e é essencialmente o oposto de - dynamic (o padrão). - a maior parte - estática, se existisse, preferiria ligar-se a bibliotecas estáticas, mas voltaria às bibliotecas dinâmicas. Esta opção não existe, mas pode ser emulada com o seguinte algoritmo: Construindo a linha de comando de link com out incluindo - static. Iterar sobre as opções de ligação dinâmica. Acumule caminhos de biblioteca, ou seja, essas opções da forma - Ltlibdirgt em uma variável ltlibpathgt Para cada opção de vínculo dinâmico, ou seja, aquelas da forma - lltlibnamegt. Execute o comando gcc ltlibpathgt - print-file-namelibltlibnamegt. a e capture a saída. Se o comando imprimir algo diferente do que você passou, ele será o caminho completo para a biblioteca estática. Substitua a opção de biblioteca dinâmica pelo caminho completo para a biblioteca estática. Enxágüe e repita até que você tenha processado toda a linha de comando do link. Opcionalmente, o script também pode ter uma lista de nomes de biblioteca para excluir da vinculação estática. O script bash a seguir parece fazer o truque: no meu sistema retorna: ou com uma exclusão: 3.14 Opções para vincular Estas opções entram em jogo quando o compilador links arquivos objeto em um arquivo de saída executável. Eles são sem sentido se o compilador não está fazendo um link etapa. Object-file-name Um nome de arquivo que não termina em um sufixo reconhecido especial é considerado para nomear um arquivo de objeto ou biblioteca. (Os arquivos de objeto são distinguidos das bibliotecas pelo vinculador de acordo com o conteúdo do arquivo.) Se o link for feito, esses arquivos de objeto são usados ​​como entrada para o vinculador. - c - S - E Se qualquer uma dessas opções for usada, o vinculador não será executado e os nomes de arquivo de objeto não devem ser usados ​​como argumentos. Consulte Opções gerais. - fuse-ldbfd Use o linker bfd em vez do vinculador padrão. - fuse-ldgold Use o vinculador de ouro em vez do vinculador padrão. - l biblioteca - l biblioteca Pesquisar na biblioteca nomeada biblioteca ao vincular. (A segunda alternativa com a biblioteca como um argumento separado é apenas para conformidade POSIX e não é recomendada.) Faz uma diferença onde no comando que você escreve esta opção o vinculador pesquisa e processa bibliotecas e arquivos objeto na ordem em que são especificados. Assim, lsquo foo. o - lz bar. o rsquo procura na biblioteca lsquo z rsquo depois do arquivo foo. o mas antes do bar. o. Se bar. o se refere a funções em lsquo z rsquo, essas funções podem não ser carregadas. O vinculador pesquisa uma lista padrão de diretórios para a biblioteca, que é na verdade um arquivo chamado lib biblioteca. a. O vinculador, em seguida, usa esse arquivo como se tivesse sido especificado precisamente pelo nome. Os diretórios procurados incluem vários diretórios padrão do sistema mais qualquer que você especificar com - L. Normalmente os arquivos encontrados desta forma são arquivos de biblioteca filesmdasharchive cujos membros são arquivos de objeto. O vinculador manipula um arquivo archive digitalizando por ele para membros que definem símbolos que até agora foram referenciados mas não definidos. Mas se o arquivo que é encontrado é um arquivo objeto comum, ele é vinculado da forma usual. A única diferença entre usar uma opção - l e especificar um nome de arquivo é que - l envolve a biblioteca com lsquo lib rsquo e lsquo. a rsquo e pesquisa vários diretórios. - lobjc Você precisa deste caso especial da opção - l para vincular um programa Objective-C ou Objective-C. - nostartfiles Não use os arquivos de inicialização do sistema padrão ao vincular. As bibliotecas de sistema padrão são usadas normalmente, a menos que - nostdlib ou - nodefaultlibs seja usado. - nodefaultlibs Não use as bibliotecas de sistema padrão ao vincular. Somente as bibliotecas especificadas são passadas para o vinculador e as opções que especificam a vinculação das bibliotecas do sistema, como - static-libgcc ou - shared-libgcc. São ignorados. Os arquivos de inicialização padrão são usados ​​normalmente, a menos que - nostartfiles seja usado. O compilador pode gerar chamadas para memcmp. Memset Memcpy e memmove. Essas entradas geralmente são resolvidas por entradas no libc. Esses pontos de entrada devem ser fornecidos através de algum outro mecanismo quando esta opção é especificada. - nostdlib Não use os arquivos de inicialização do sistema padrão ou bibliotecas ao vincular. Nenhum arquivo de inicialização e apenas as bibliotecas especificadas são passadas para o vinculador e as opções que especificam a vinculação das bibliotecas do sistema, como - static-libgcc ou - shared-libgcc. São ignorados. O compilador pode gerar chamadas para memcmp. Memset Memcpy e memmove. Essas entradas geralmente são resolvidas por entradas no libc. Esses pontos de entrada devem ser fornecidos através de algum outro mecanismo quando esta opção é especificada. Uma das bibliotecas padrão ignoradas por - nostdlib e - nodefaultlibs é libgcc. a. Uma biblioteca de subrotinas internas que o GCC usa para superar falhas de determinadas máquinas ou necessidades especiais para algumas linguagens. (Consulte Interfacing to GCC Output para mais discussão sobre o libgcc. a.) Na maioria dos casos, você precisa do libgcc. a mesmo quando quiser evitar outras bibliotecas padrão. Em outras palavras, quando você especifica - nostdlib ou - nodefaultlibs você deve normalmente especificar - lgcc também. Isso garante que você não tenha referências não resolvidas para subrotinas de biblioteca GCC internas. (Um exemplo de tal sub-rotina interna é usado para garantir que os construtores C são chamados see collect2.) - pie Produz um executável independente de posição em alvos que o suportam. Para resultados previsíveis, você também deve especificar o mesmo conjunto de opções usadas para compilação (-fpie.-FPIE. Ou suboptions de modelo) quando você especificar essa opção de vinculador. - no-pie Não produzir um executável de posição independente. - rdynamic Passar a bandeira - export-dynamic para o vinculador ELF, em destinos que o suportam. Isso instrui o vinculador para adicionar todos os símbolos, não apenas os usados, para a tabela de símbolos dinâmicos. Esta opção é necessária para alguns usos de dlopen ou para permitir a obtenção de backtraces de dentro de um programa. - s Remove toda a tabela de símbolos e as informações de realocação do executável. - static Em sistemas que suportam o vínculo dinâmico, isso impede o vínculo com as bibliotecas compartilhadas. Em outros sistemas, esta opção não tem efeito. - shared Produzir um objeto compartilhado que pode ser vinculado a outros objetos para formar um executável. Nem todos os sistemas suportam esta opção. Para resultados previsíveis, você também deve especificar o mesmo conjunto de opções usadas para compilação (-fpic. - fPIC ou suboptions de modelo) quando você especificar essa opção de vinculador. 1 - shared-libgcc - static-libgcc Em sistemas que fornecem libgcc como uma biblioteca compartilhada, essas opções forçam o uso da versão compartilhada ou estática, respectivamente. Se nenhuma versão compartilhada do libgcc foi criada quando o compilador foi configurado, essas opções não têm efeito. Existem várias situações em que um aplicativo deve usar o libgcc compartilhado em vez da versão estática. O mais comum deles é quando o aplicativo deseja lançar e capturar exceções em diferentes bibliotecas compartilhadas. Nesse caso, cada uma das bibliotecas, bem como o próprio aplicativo, devem usar o libgcc compartilhado. Portanto, os drivers G e GCJ adicionam automaticamente - shared-libgcc sempre que você constrói uma biblioteca compartilhada ou um executável principal, porque os programas C e Java normalmente usam exceções, então essa é a coisa certa a fazer. Se, em vez disso, você usar o driver GCC para criar bibliotecas compartilhadas, você pode achar que eles nem sempre estão vinculados com o libgcc compartilhado. Se o GCC encontrar, em seu tempo de configuração, que você tem um linker não-GNU ou um linker GNU que não suporta a opção --eh-frame-hdr. Ele vincula a versão compartilhada do libgcc em bibliotecas compartilhadas por padrão. Caso contrário, ele tira proveito do linker e otimiza a ligação com a versão compartilhada do libgcc. Vinculando-se à versão estática do libgcc por padrão. Isso permite que exceções se propaguem por meio dessas bibliotecas compartilhadas, sem incorrer em custos de deslocamento no tempo de carregamento da biblioteca. No entanto, se uma biblioteca ou executável principal é suposto para lançar ou pegar exceções, você deve vinculá-lo usando o driver G ou GCJ, conforme apropriado para os idiomas usados ​​no programa, ou usando a opção - shared-libgcc. Tal que está ligado com o libgcc compartilhado. - static-libasan Quando a opção - fsanitizeaddress é usada para vincular um programa, o driver do GCC vincula automaticamente o libasan. Se o libasan estiver disponível como uma biblioteca compartilhada, e a opção - static não for usada, então este link será contra a versão compartilhada do libasan. A opção - static-libasan direciona o driver do GCC para vincular libasan estaticamente, sem necessariamente vincular outras bibliotecas estaticamente. - static-libtsan Quando a opção - fsanitizethread é usada para vincular um programa, o driver do GCC vincula automaticamente o libtsan. Se o libtsan estiver disponível como uma biblioteca compartilhada, e a opção - static não for usada, então este links contra a versão compartilhada do libtsan. A opção - static-libtsan direciona o driver do GCC para ligar libtsan estaticamente, sem necessariamente vincular outras bibliotecas estaticamente. - static-liblsan Quando a opção - fsanitizeleak é usada para vincular um programa, o driver do GCC liga automaticamente ao liblsan. Se o liblsan estiver disponível como uma biblioteca compartilhada e a opção - static não for usada, este link será usado na versão compartilhada do liblsan. A opção - static-liblsan direciona o driver do GCC para ligar liblsan estaticamente, sem necessariamente vincular outras bibliotecas estaticamente. - static-libubsan Quando a opção - fsanitizeundefined é usada para vincular um programa, o driver do GCC vincula automaticamente o libubsan. Se libubsan estiver disponível como uma biblioteca compartilhada, e a opção - static não for usada, então esta liga-se à versão compartilhada do libubsan. A opção - static-libubsan direciona o driver do GCC para vincular libubsan estaticamente, sem necessariamente vincular outras bibliotecas estaticamente. - static-libmpx Quando as opções - fcheck-pointer e - mmpx são usadas para vincular um programa, o driver do GCC liga automaticamente ao libmpx. Se o libmpx estiver disponível como uma biblioteca compartilhada, e a opção - static não for usada, então isso será vinculado à versão compartilhada do libmpx. A opção - static-libmpx direciona o driver do GCC para vincular libmpx estaticamente, sem necessariamente vincular outras bibliotecas estaticamente. - static-libmpxwrappers Quando as opções - fcheck-pointer e - mmpx são usadas para vincular um programa sem usar também - fno-chkp-use-wrappers. O driver do GCC liga automaticamente contra libmpxwrappers. Se libmpxwrappers estiver disponível como uma biblioteca compartilhada e a opção - static não for usada, este link será usado na versão compartilhada do libmpxwrappers. A opção - static-libmpxwrappers direciona o driver do GCC para vincular libmpxwrappers estaticamente, sem necessariamente vincular outras bibliotecas estaticamente. - static-libstdc Quando o programa g é usado para vincular um programa C, ele normalmente liga automaticamente ao libstdc. Se o libstdc estiver disponível como uma biblioteca compartilhada e a opção - static não for usada, então este link será contra a versão compartilhada do libstdc. Isso é normalmente bom. No entanto, às vezes é útil para congelar a versão do libstdc usado pelo programa sem ir todo o caminho para um link totalmente estático. A opção - static-libstdc direciona o driver g para vincular libstdc estaticamente, sem necessariamente vincular outras bibliotecas estaticamente. - symbolic Vincular referências a símbolos globais ao criar um objeto compartilhado. Avisar sobre quaisquer referências não resolvidas (a menos que substituído pela opção de editor de link - Xlinker - z - Xlinker defs). Apenas alguns sistemas suportam esta opção. - T script Use script como o script de vinculador. Esta opção é suportada pela maioria dos sistemas usando o vinculador GNU. Em alguns alvos, como destinos sem placa sem um sistema operacional, a opção - T pode ser necessária ao vincular para evitar referências a símbolos indefinidos. - Xlinker opção Passar opção como uma opção para o vinculador. Você pode usar isso para fornecer opções de vinculador específicas do sistema que o GCC não reconhece. Se você quiser passar uma opção que leva um argumento separado, você deve usar - Xlinker duas vezes, uma vez para a opção e uma vez para o argumento. Por exemplo, para passar - atribuir definições. Você deve escrever definições - Xlinker - assert - Xlinker. Ele não funciona para escrever - Xlinker - assert definições. Porque isso passa a seqüência inteira como um único argumento, que não é o que o vinculador espera. Ao usar o vinculador GNU, geralmente é mais conveniente passar argumentos para opções de vinculador usando a sintaxe de valor de opção do que argumentos separados. Por exemplo, você pode especificar - Xlinker - Mapoutput. map em vez de - Xlinker - Map - Xlinker output. map. Outros vinculadores podem não suportar esta sintaxe para opções de linha de comando. - Wl, opção Pass opção como uma opção para o vinculador. Se a opção contém vírgulas, ela é dividida em várias opções nas vírgulas. Você pode usar esta sintaxe para passar um argumento para a opção. Por exemplo, - Wl, - Map, output. map passa - Mapa output. map para o vinculador. Ao usar o vinculador GNU, você também pode obter o mesmo efeito com - Wl, - Mapoutput. map. - u símbolo Finja o símbolo símbolo é indefinido, para forçar a ligação de módulos de biblioteca para defini-lo. Você pode usar - u várias vezes com símbolos diferentes para forçar o carregamento de módulos de biblioteca adicionais. - z palavra-chave - z é passado diretamente para o vinculador juntamente com a palavra-chave palavra-chave. Consulte a seção na documentação do seu vinculador para valores permitidos e seus significados. Notas de rodapé 1 Em alguns sistemas, o lsquo gcc - shared rsquo precisa construir código de stub suplementar para que os construtores trabalhem. On multi-libbed systems, lsquo gcc - shared rsquo must select the correct support libraries to link against. Failing to supply the correct flags may lead to subtle defects. Supplying them in cases where they are not necessary is innocuous. Coorg has become extremely popular among travellers in past few years. Coorg é conhecida pela sua hospitalidade, bravura do seu povo e belas paisagens. Coorg é admirado como a Escócia da Índia e também renomado como Caxemira do Sul para o seu olho banquete de beleza cênica. Aninhado entre os greeneries lusting do Western Ghats, Coorg tem muito a oferecer. Montes enevoados, vales e cachoeiras luxuriantes, florestas verdes, intermináveis ​​cordilheiras, hectares de plantação de café, laranjeiras, cardamomo, plantas de pimenta e aldeias exóticas fazem de Coorg uma das mais belas estações de montanha que você pode visitar na Índia. Kodagu é o distrito o mais pequeno do estado de Karnataka com costumes originais, cultura distinta e tradições. A palavra Kodagu é derivada da palavra de Kannada Kodaimalenadu, que significa floresta densa em uma colina íngreme. Kodagu é chamado pelo nome anglicizado de Coorg. Os povos de Kodagu / Coorg são chamados como Kodavas ou Coorgies. Coorg situado entre 900 e 1525 m acima do nível do mar ocupa 4.100 km no Ghats Ocidental um património mundial da UNESCO e um dos mundos oito hotspots de diversidade biológica. História de Coorg datas maneira de volta para tão cedo como 888 AD. Dinastias indianas do Sul dos Gangas, Kadambas, Chalukyas, Cholas, Hoysalas, Rastrakutas, Rayas Vijaynagar e Mysore Wodeyars governaram Kodagu. Kodavas conhecidos como valentes guerreiros e da casta de guerreiros indianos, Kodagu não tinha governantes indígenas. A dinastia Haleri foi a última dinastia notável na história de Kodagu, que governou toda a região de Kodagu por 234 anos. Coorg é belo, com 291 aldeias dispersas e com 5 centros urbanos. Coorg tinha uma população de 5,54,762 a partir do censo de 2011. A cidade de Madikeri ou Mercara é a sede do distrito de Coorg. O distrito de Coorg é dividido nos três talukas administrativos Madikeri, Virajpet (Viraranjendrapet) e Somwarpet. Madikeri, Somwarpet, Kushalnagar, Virajpet e Gonikoppal são os principais centros urbanos do distrito de Kodagu. O distrito de Coorg é composto por pessoas de distintas origens étnicas e de castas como Kodava, AreBashe Gowda, Kodagu Mappila, Tulu, Devanga, Malayali, Tamil e outras comunidades. Um quinto da população kodagu consiste em Kodavas e eles são etnicamente distintos dos outros povos da área. Os Kodavas / Coorgies são tradicionalmente agricultores e guerreiros. Coorg sendo maior produtor de café na Índia, cresce cerca de 30 do café produzido na Índia. Coorg também é sinônimo de cardamomo coorg, laranjas coorg, coorg mel, limão e pimenta. Muitas variedades de árvores como o carvalho de prata, a teca, o jacarandá, a lenha etc. são crescidas junto com o café. O rio Kaveri / Cauvery sobe em Talakaveri no lado oriental dos Ghats Ocidentais e seus afluentes fluem através da maior parte de Kodagu. Coorg tem uma temperatura média de 15C, variando de 13 a 35C (55 a 95F). Em julho e agosto a precipitação é alta, mês de novembro será showery e abril e maio será amp quente e ensolarado.

No comments:

Post a Comment