O gcc é portável entre todas as máquinas Linux de 64 bits?

1

Estou trabalhando remotamente conectando-me a um terminal Linux com o ssh. A máquina à qual estou me conectando é uma máquina Linux x86 de 64 bits. Meu computador também é uma máquina Ubuntu de 64 bits com um processador x86.

Eu preciso entregar tarefas de programa que compilam com o gcc e rodam em máquinas remotas ou elas não serão classificadas. O professor mencionou que o gcc pode compilar programas de maneira diferente em máquinas diferentes e que o C não é totalmente portátil como o Java.

Minha pergunta é que posso escrever meus programas no gedit e depurá-los com o gdb no meu computador e carregá-los com o scp (se eu fizer o trabalho por sshing no terminal unix remoto eu só posso usar nano / pico / vim)? Ou meu computador compilará de maneira diferente da máquina remota? Mais uma vez, ambos são máquinas Linux x86 de 64 bits.

    
por rmh52 15.05.2012 / 01:41

3 respostas

2

Se você enviar o binário (eu ficaria surpreso se você tivesse que fazer isso) ele funcionará (já que você mencionou que a arquitetura de ambas as máquinas é a mesma), provavelmente, a menos que haja uma diferença entre as bibliotecas instaladas e você acaba usando algumas delas.

Mas, supondo que você tenha que enviar o código-fonte, seu código será compilado no servidor remoto. Isso significa que, desde que você não esteja usando uma biblioteca específica presente em seu sistema, seus programas serão compilados e executados no servidor remoto. Mas se você acabar usando essa biblioteca, você pode especificar os flags de ligação (no seu Makefile ou mencioná-lo explicitamente como parte do seu envio).

    
por rhn-grg 15.05.2012 / 02:44
0

Como @ rhn-grg apontou, se ambas as máquinas têm a mesma arquitetura de processador, então a única diferença que pode impedir que seu binário seja executado em outra máquina são as bibliotecas com as quais seu binário está vinculado - por padrão binários são vinculados eles carregam as bibliotecas dinamicamente, o que permite manter os binários pequenos e também permite usar a RAM com mais eficiência, já que a biblioteca é carregada uma vez, mas pode ser usada por vários processos.

No entanto, nos casos em que você precisa garantir a "portabilidade" de um binário, você pode dizer a gcc para vincular estaticamente o binário - isto é, incluir todas as bibliotecas que ele usa no binário - isso produzirá um binário bastante grande não dependerá de nenhuma biblioteca externa.

Eu nunca tive a necessidade de fazer isso, no entanto, agora, quando você conhece as palavras mágicas (link estático, binário portátil), você pode encontrar muitas sugestões no Google, por exemplo isto :

  

Normalmente, quando você faz o download de um tarball de código-fonte, você faz o   padrão "configure; make; make install" para construí-lo. Se você quiser um   binário vinculado estaticamente, substitua o simples "make" por:

make SHARED=0 CC='gcc -static'

Para ver de quais bibliotecas seu binário depende, você pode usar o comando ldd :

$ ldd /bin/bash
    linux-vdso.so.1 =>  (0x00007fff6dbff000)
    libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f8e37337000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8e37133000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8e36d75000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f8e37587000)
    
por Sergey 15.05.2012 / 03:51
0

A questão à qual seu professor provavelmente se referiu é que os tamanhos de vários tipos em C dependem da plataforma. Por exemplo, você poderá armazenar números muito maiores em long variables se elas forem compiladas para um sistema x86-64 Linux, comparado a quando elas são compiladas para i386 Linux. Para programas corretos, isso não é um problema, mas se você tiver um programa que, por exemplo, usa int e long de forma intercambiável, ele pode funcionar bem em i386 , mas falha quando executado em sistemas de 64 bits.

Por outro lado, o Java usa o mesmo tamanho para tipos básicos em todas as plataformas, evitando assim essa classe de problemas de portabilidade.

Se o seu sistema de desenvolvimento e o sistema remoto forem x86-64 Linux, você não deverá se deparar com nenhum desses tipos de diferenças. Você não deve ter nenhum problema ao escrever e depurar seus programas localmente.

Com isso em mente, se você for classificado com base em como o programa se comporta no sistema remoto, valeria a pena testar os programas concluídos no sistema remoto.

    
por James Henstridge 15.05.2012 / 05:14