Переполнение стека при добавлении зависимости от ссылки. Доступный стек уменьшен со связыванием? - PullRequest
3 голосов
/ 01 апреля 2020

Проблема

Я получаю переполнение стека, если связываюсь с библиотекой, и не получаю его, если не делаю. Вот код:

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define ASSERT_FATAL(cond) \
    do { if (!(cond))  { printf("FAILED COND\n"); exit(-1); }  } while(0)

void *func(void *dummy) {
    // let's make sure the compiler doesn't optimize this out
    volatile char buf[80000];
    for (int i = 0; i < sizeof(buf); ++i)
        buf[i] = rand()  % 128;

    sleep(1);
    printf("Thread finished\n");
}

int main() {
    pthread_t thread_id;
    pthread_attr_t attr;

    ASSERT_FATAL(pthread_attr_init(&attr) == 0);
    ASSERT_FATAL(pthread_attr_setstacksize(&attr, 100000) == 0);
    ASSERT_FATAL(pthread_create(&thread_id, &attr, func, NULL) == 0);

    pthread_attr_destroy(&attr);

    sleep(2);
    return 0;
}

Для воспроизведения:

  • Работает нормально с gcc test.c -pthread -O3
  • Сбои с переполнением стека с gcc test.c -pthread -O3 -Wl,--no-as-needed /usr/lib/x86_64-linux-gnu/libcholmod.so -Wl,--as-needed

ПРИМЕЧАНИЕ: я использую cholmod, потому что это было источником моих проблем в большей кодовой базе. В Ubuntu вы можете получить его, установив libsuitesparse-dev.

Мой вопрос

Что здесь происходит? Если я увеличу размер стека, он будет работать, но я хочу понять, что его вызывает. Может ли файл .so выполнять инициализацию для каждого потока и как-то уменьшить доступное пространство стека?

EDIT 1 : изменен весь код C ++ для чистого C кода

EDIT 2 : подтверждение результата создания потока / установки атрибута

...