Неисправность semctl () - ошибка в libc? - PullRequest
0 голосов
/ 02 октября 2018

Есть что-то тревожное в semctl(), работающем при вызове внутри разделяемой библиотеки.Значения, возвращенные для команды IPC_STAT, неверны.Поля uid , gid и mode .Нет проблем, когда функция вызывается из автономной программы.В таком случае все значения верны.Что важно в моем случае, я точно так же использую семафоры в разделяемой библиотеке и в автономной программе.

Ниже вы можете найти проблемный код:

static int sem_check( int semid ) {
    union semun semdata;
    semdata.buf = (struct semid_ds*)malloc( sizeof(struct semid_ds) );
    memset( semdata.buf, 0, sizeof(struct semid_ds) );

    int rc = semctl( semid, 0, IPC_STAT, semdata );

    if( rc==0 ) {
        if( semdata.buf->sem_perm.uid==0 && semdata.buf->sem_perm.gid==999 && semdata.buf->sem_perm.mode==0660 ) {
            printf("semaphore OK");
        } else {
            printf( "semaphore BAD: uid: %hd, gid: %hd, mode: %ho", semdata.buf->sem_perm.uid, semdata.buf->sem_perm.gid, semdata.buf->sem_perm.mode );
        }
    }
    else {
        printf( "semctl() error: %d", rc );
    }

    return rc;
}

В моемВ этом случае семафор создается с uid = 0, gid = 999 и mode = 0660.Когда я вызываю вышеуказанную функцию из автономной программы, я получаю те же значения (сообщение «Семафор ОК»).Когда я звоню из общей библиотеки, я получаю uid = 0, gid = 0 и mode = 7072 (сообщение «семафор ПЛОХОЙ»).Конечно, в обоих случаях у процесса есть права на чтение для семафора, и здесь не говорится об ошибке semctl().

Возможно ли, что я обнаружил ошибку в стандартной библиотеке C?

Моя рабочая среда:

  • Linux Debian Wheezy,
  • libc v2.13,
  • gcc v4.7.2.

1 Ответ

0 голосов
/ 18 октября 2018

Проблема решена.При создании разделяемой библиотеки вместо ld --shared должна использоваться команда gcc -shared.Это вызвано неправильным связыванием общих общих библиотек при создании предметной.Это известная ошибка, ссылка ниже.

https://sourceware.org/bugzilla/show_bug.cgi?id=20489

...