1
Programando Software
      Livre em C
    Fernando Mercês




                       2
Agenda

●   Por que o C nunca vai sumir?

●   A suíte de compiladores GNU

●   Criando um projeto de exemplo

●   Distribuindo o software

●   Mercado




                                       3
Por que o C nunca vai sumir?

●Metade do universo é escrito em C (kernel Linux, Windows,
httpd, samba, squid, bind, java, python, php, openldap, wine...)

●   Desempenho: o compilador C gera código de máquina.

●Portabilidade: SIM, basta que seu código não dependa de
bibliotecas não portáveis! E ainda existe Cygwin!

●Quem falou que C é velho? A última atualização da
especificação foi em 2011.

●O comitê WG14 da ISO/IEC especificou na C11 recursos como
multithreading (thread.h), bound checking em funções como
strcpy() e estruturas anônimas.



                                                               4
A suíte de compiladores GNU

●GNU Compiler Collection, compila C, C++, Objective-C,
Fortran, Java, Ada e Go.

●   A versão 4.7.1 saiu em 14 de junho deste ano.

●   Conta com poderosos aliados como gdb e make.

●Extensa documentação, cheia de recursos, otimizações
para processadores específicos, proteções de código etc.

●   Mas existem outros livres como CLang, tcc...




                                                           5
Brinque com o tcc!

$ cat ate3.c
#!/usr/bin/tcc -run

#include <stdio.h>

int main(void)
{
   for (int i=0; i<3; i++)
      printf("%dn", i);

    return 0;
}

$ chmod +x ate3.c
$ ./ate3.c
                             ---
$ cat << EOF | tcc -run -
>main(void) { puts("Diz aê pro tcc!"); }
>EOF


                                           6
A suíte de compiladores GNU

●GNU Compiler Collection, compila C, C++, Objective-C,
Fortran, Java, Ada e Go.

●   A versão 4.7.1 saiu em 14 de junho deste ano.

●   Conta com um poderoso aliado: o GNU Debugger (gdb).

●Extensa documentação, cheia de recursos, otimizações
para processadores específicos, proteções de código etc.

●   Experimente também o tcc!




                                                           7
Criando um projeto de exemplo

●   O que eu quero?
     Setar um dispositivo de bloco (/dev/sdX) como
     somente leitura ou não, para evitar escrita acidental
     como echo 'lalalaal' > /dev/sdX.

●   #comofas
     O Linux possui a syscall (e uma wrapper na glibc)
     ioctl, que aceita os comandos BLKROSET e BLKROGET.

●   Consultar manual da função ioctl()
     $ man 2 ioctl
     int ioctl(int d, int request, ...);



                                                             8
Prova de conceito

#includes...

int fd = open(“/dev/sdc”, O_RDONLY);
int ro = 1;

ioctl(fd, BLKROSET, &ro);

---

# dd if=<(echo 'doingshit') of=/dev/sdc
dd: writing to `/dev/sdc': Operation not permitted




                                                     9
Antes de virar um projeto...

●   E se der erro?
     Tratamento de erro (if).

●   O usuário sabe o que o software faz?
     help(), usage(), documentação, manpages.

●   Quais as dependências?
     ldd.

●   Preciso licenciar o código?
    ● Cabeçalho GPL ou de outra licença livre.




                                                 10
Antes de virar um projeto (cont.)...

●   E o Makefile?

     all:
              gcc -W -Wall -Wextra -o devprot devprot.c

     clean:
              rm -f devprot

●   Compilando o devprot.c

     $ make

●   Testes
     Várias máquinas, diferentes arquiteturas.
     Diferentes dispositivos de blocos (para este caso).

                                                           11
Distribuindo o software

●   Tenho fegonha! Ah, focê chula?!

●   Controle de versão para *código*.

●Source Forge para todo o resto, como binários pré-
compilados.

●   No Github é muito fácil enviar e receber patches.




                                                        12
Mercado para C

●Kernel, aplicações 'core', alto desempenho, real time,
embarcados.

●Google, Opera, Mandriva, Red Hat, várias de
embarcados, de telecom, de segurança...

●   Em alta, por tempo inderteminado!

●   C++ também!

●   Lucro (in)direto: colaborando com SL.

●Outras linguagens “nativas” como D e Go vão demorar
um pouco para “colar”. Enquanto isso, divirta-C. ;-)

                                                          13
Referências

●   Especificações da linguagem C
    http://www.mentebinaria.com.br/artigos/0x1c/0x1c-cspecs.html

●   WG14
    http://www.open-std.org/jtc1/sc22/wg14/

●   Mudanças no gcc 4.7
    http://gcc.gnu.org/gcc-4.7/changes.html

●   BLKROGET e BLKROSET definidos em /usr/src/linux/fs.h

●   devprot.c completo
    http://www.mentebinaria.com.br/files/devprot.c

●   Escolha um pra colaborar:
    https://github.com/merces



                                                                   14
Obrigado




  Fernando Mercês
contato@4Linux.com.br


     @4LinuxBR

       /4linux




                        15

Programando Software Livre em C

  • 1.
  • 2.
    Programando Software Livre em C Fernando Mercês 2
  • 3.
    Agenda ● Por que o C nunca vai sumir? ● A suíte de compiladores GNU ● Criando um projeto de exemplo ● Distribuindo o software ● Mercado 3
  • 4.
    Por que oC nunca vai sumir? ●Metade do universo é escrito em C (kernel Linux, Windows, httpd, samba, squid, bind, java, python, php, openldap, wine...) ● Desempenho: o compilador C gera código de máquina. ●Portabilidade: SIM, basta que seu código não dependa de bibliotecas não portáveis! E ainda existe Cygwin! ●Quem falou que C é velho? A última atualização da especificação foi em 2011. ●O comitê WG14 da ISO/IEC especificou na C11 recursos como multithreading (thread.h), bound checking em funções como strcpy() e estruturas anônimas. 4
  • 5.
    A suíte decompiladores GNU ●GNU Compiler Collection, compila C, C++, Objective-C, Fortran, Java, Ada e Go. ● A versão 4.7.1 saiu em 14 de junho deste ano. ● Conta com poderosos aliados como gdb e make. ●Extensa documentação, cheia de recursos, otimizações para processadores específicos, proteções de código etc. ● Mas existem outros livres como CLang, tcc... 5
  • 6.
    Brinque com otcc! $ cat ate3.c #!/usr/bin/tcc -run #include <stdio.h> int main(void) { for (int i=0; i<3; i++) printf("%dn", i); return 0; } $ chmod +x ate3.c $ ./ate3.c --- $ cat << EOF | tcc -run - >main(void) { puts("Diz aê pro tcc!"); } >EOF 6
  • 7.
    A suíte decompiladores GNU ●GNU Compiler Collection, compila C, C++, Objective-C, Fortran, Java, Ada e Go. ● A versão 4.7.1 saiu em 14 de junho deste ano. ● Conta com um poderoso aliado: o GNU Debugger (gdb). ●Extensa documentação, cheia de recursos, otimizações para processadores específicos, proteções de código etc. ● Experimente também o tcc! 7
  • 8.
    Criando um projetode exemplo ● O que eu quero? Setar um dispositivo de bloco (/dev/sdX) como somente leitura ou não, para evitar escrita acidental como echo 'lalalaal' > /dev/sdX. ● #comofas O Linux possui a syscall (e uma wrapper na glibc) ioctl, que aceita os comandos BLKROSET e BLKROGET. ● Consultar manual da função ioctl() $ man 2 ioctl int ioctl(int d, int request, ...); 8
  • 9.
    Prova de conceito #includes... intfd = open(“/dev/sdc”, O_RDONLY); int ro = 1; ioctl(fd, BLKROSET, &ro); --- # dd if=<(echo 'doingshit') of=/dev/sdc dd: writing to `/dev/sdc': Operation not permitted 9
  • 10.
    Antes de virarum projeto... ● E se der erro? Tratamento de erro (if). ● O usuário sabe o que o software faz? help(), usage(), documentação, manpages. ● Quais as dependências? ldd. ● Preciso licenciar o código? ● Cabeçalho GPL ou de outra licença livre. 10
  • 11.
    Antes de virarum projeto (cont.)... ● E o Makefile? all: gcc -W -Wall -Wextra -o devprot devprot.c clean: rm -f devprot ● Compilando o devprot.c $ make ● Testes Várias máquinas, diferentes arquiteturas. Diferentes dispositivos de blocos (para este caso). 11
  • 12.
    Distribuindo o software ● Tenho fegonha! Ah, focê chula?! ● Controle de versão para *código*. ●Source Forge para todo o resto, como binários pré- compilados. ● No Github é muito fácil enviar e receber patches. 12
  • 13.
    Mercado para C ●Kernel,aplicações 'core', alto desempenho, real time, embarcados. ●Google, Opera, Mandriva, Red Hat, várias de embarcados, de telecom, de segurança... ● Em alta, por tempo inderteminado! ● C++ também! ● Lucro (in)direto: colaborando com SL. ●Outras linguagens “nativas” como D e Go vão demorar um pouco para “colar”. Enquanto isso, divirta-C. ;-) 13
  • 14.
    Referências ● Especificações da linguagem C http://www.mentebinaria.com.br/artigos/0x1c/0x1c-cspecs.html ● WG14 http://www.open-std.org/jtc1/sc22/wg14/ ● Mudanças no gcc 4.7 http://gcc.gnu.org/gcc-4.7/changes.html ● BLKROGET e BLKROSET definidos em /usr/src/linux/fs.h ● devprot.c completo http://www.mentebinaria.com.br/files/devprot.c ● Escolha um pra colaborar: https://github.com/merces 14
  • 15.
    Obrigado FernandoMercês contato@4Linux.com.br @4LinuxBR /4linux 15