EP2 - SegFault com executável fornecido e imagem 1

Re: EP2 - SegFault com executável fornecido e imagem 1

por José Coelho de Pina -
Número de respostas: 0

Para compilar com a opção -Wl(...) no Linux (sem trocar esse valor pelo terminal), é necessário alterar o Makefile?

Hmmm.
Depois eu escrevo mais sobre isto, mas no momento da para dizer que tem algum problema com essas opções no linux  tímido (pelo menos com a minha distribuição Ubuntu) .

Gerei o executável para o Windows (no Vista) usando a opção Wl,--stack=10000000
como diz o FAQ da EP2 e tudo funcionou direito, ou seja, o programa explodia quando eu
carregava a imagem imagem1.ppm e depois que coloquei essa opção para aumentar
o stack limit o programa parou de explodir maneiro.

No linux, ao colocar essa opção (bem, tem que modificar um pouco...) aparecia uma mensagem de "opção stack não reconhecida" pensativo. Andei olhando por ai e parece que isto é realmente um problema, mas preciso investicar mais (isto fica para uma próxima mensagem).

Bem, o que eu queria mesmo escrever é que na página

http://stackoverflow.com/questions/2275550/change-stack-size-for-a-c-application-in-linux-during-compilation-with-gnu-com

há uma descrição de como, no início do programa (main()), colocar um trecho de código
que aumenta o stack limit.  Achei o código bacana boca aberta. Para isto, no EP2, é necessário colocar

#include <sys/resource.h>

junto com os includes e o ínicio do main() fica assim

int 
main(int argc, char *argv[])
{
  ImagemRGB *imgOriginal  = NULL; /* ponteiro para a imagem original */
  ImagemRGB *tela         = NULL; /* ponteiro para a imagem corrente ou atual */
  CelRegiao *listaRegioes = NULL; /* ponteiro para a lista de regioes */
  
  /* trecho copiado de 
  http://stackoverflow.com/questions/2275550/change-stack-size-for-a-c-application-in-linux-during-compilation-with-gnu-com
  */
  const rlim_t kStackSize = 16 * 1024 * 1024;   /* min stack size = 16 MB */
  struct rlimit rl;
  int result;

  result = getrlimit(RLIMIT_STACK, &rl);
  if (result == 0)
    {
      if (rl.rlim_cur < kStackSize)
        {
	  rl.rlim_cur = kStackSize;
	  result = setrlimit(RLIMIT_STACK, &rl);
	  if (result != 0)
            {
	      fprintf(stderr, "setrlimit returned result = %d\n", result);
            }
        }
    }

Testei e funcionou como especificado mostrando a língua.

Bem, o -Wl,--stack... fica para uma outra mensagem.