compilando com o gcc quebrado para usuários, mas bom para raiz

1

Então, em algum lugar ao longo do caminho, compilar como um usuário comum parou de funcionar no meu servidor. Eu estou no Debian estável. Não consigo pensar no que mudou no meu sistema que resultaria nisso, ou como corrigi-lo, mas agora somente o root pode compilar.

user@box:~/code/helloworld$ gcc helloworld.c -o helloworld
In file included from /usr/include/stdio.h:28:0,
                 from helloworld.c:3:
/usr/include/features.h:356:25: fatal error: /usr/local/include/sys/cdefs.h: Permission denied
compilation terminated.

Compilar como root está bem. Eu presumo que isso é um problema de permissões?

As user@server:

ls -la /usr/local/include/sys/cdefs.h
ls: cannot access /usr/local/include/sys/cdefs.h: Permission denied

ls -la /usr/local/include/sys/       
ls: cannot access /usr/local/include/sys/.: Permission denied
ls: cannot access /usr/local/include/sys/..: Permission denied
ls: cannot access /usr/local/include/sys/apparmor.h: Permission denied
ls: cannot access /usr/local/include/sys/cdefs.h: Permission denied
total 0
d????????? ? ? ? ?            ? .
d????????? ? ? ? ?            ? ..
-????????? ? ? ? ?            ? apparmor.h
-????????? ? ? ? ?            ? cdefs.h

O usuário pode ler / usr / local / include fine. Raiz mostra os perms em / usr / local / include / sys (note que o usuário está no grupo de funcionários):

drwxr-Sr-- 2 funcionários de raiz 4096 7 de dezembro 08:20 sys

Localização do cdefs.h

locate cdefs.h
/usr/include/ldap_cdefs.h
/usr/include/i386-linux-gnu/sys/cdefs.h
/usr/include/sys/cdefs.h
/usr/local/include/sys/cdefs.h

Eu tentei consertar o permanente mas não consigo acertar. Existe uma maneira de ignorar o cdefs.h de / usr / local e usar o que ele / usr / include /?

Qualquer ajuda muito apreciada!

    
por john 08.12.2012 / 13:46

2 respostas

1

Eu não acho que haja uma maneira particularmente boa de ignorá-lo totalmente (é possível com a opção gcc nostdinc , mas você precisará adicionar -I para todos os caminhos necessários).

No entanto, existe uma maneira fácil de forçar o compilador a escolher o que você deseja. De acordo com o link , a ordem normal dos caminhos de inclusão é:

 /usr/local/include
 libdir/gcc/target/version/include
 /usr/target/include
 /usr/include

Presumivelmente, isso é para permitir que você substitua facilmente uma inclusão do sistema por uma do usuário local. Mas o que supera todos esses é -I, então se você compilar:

gcc -I/usr/include/sys

Em seguida, ele selecionará cdefs.h de lá. Ele não eliminará / usr / local / include do caminho, portanto, se houver outros arquivos que se encaixem nessa categoria, talvez seja necessário mais -Is. Eles não são recursivos, portanto, por exemplo:

gcc -I/usr/include

Não priorizará / usr / include / sys, assim como a outra versão não priorizará / usr / include. Então você pode precisar de:

gcc -I/usr/include -I/usr/include/sys

Usar um makefile torna esse tipo de coisa significativamente mais fácil, a propósito. Eventualmente você vai querer aprender como fazer isso.

Pode haver alguns outros problemas com os quais você vai se deparar, seja qual for a razão para ter esse cabeçalho duplicado, mas você terá que explicar isso. Este é o seu sistema?

    
por 08.12.2012 / 15:53
0

I've tried fixing the perms but I can't get it right. Is there a way to ignore the cdefs.h from /usr/local and use the one it /usr/include/?

Sim, não os instale em /usr/local/ . O Debian nunca instalará nada em /usr/local , então se houver arquivos aqui, é porque você, outros administradores locais ou softwares mal empacotados instalaram essas coisas aqui. Instale-os em qualquer outro lugar. Mas a instalação de outros cabeçalhos da libc em / usr / local está causando problemas.

    
por 08.12.2012 / 14:58