次のプログラムを x86_64 Linux 環境 (Centos7) でコンパイルし、CIFSでマウントした ディレクトリの中身を 表示させようとしました。

gcc のオプションに -m32 をつけて 32bit でコンパイルしたときと、64bit でコンパイルした場合で、動作が異なり 32bit だと正しく 表示されません。

なぜ 32bit 版は正常に動作しないのでしょうか。
または、正常に動作させる方法が分かれば教えてください。

追記
errno の値と、perror() でエラーメッセージを表示させるようにサンプルを変更しました。
errno:12: Cannot allocate memory と表示されましたが、メモリは 1GB以上空いてるので メモリ不足ということはないと思います。
追記ここまで

// readdir() sample code
// usage : programname directory
#include        <stdio.h>
#include        <dirent.h>
#include        <errno.h>

int main(int argc, char **argv) {

        struct  dirent  *entry;
        DIR     *dir;
        int     cnt = 0;
        char    errmsg[16];

        // 引数チェック
        if (argc <= 1) return 2;

        dir = opendir( argv[1] );
        if (dir == NULL) return 1;
        printf( "directory opened\n");

        while( (entry = readdir(dir)) != NULL) {
                // ディレクトリ エントリーの名前を表示
                printf("d_name: %s\n", entry->d_name);
                cnt++;
        }
        // errno メッセージを表示
        sprintf(errmsg, "errno:%d", errno);
        perror(errmsg);

        closedir( dir );
        printf( "directory closed\n");

        // ディレクトリエントリの数を表示
        printf( "cnt = %d\n", cnt );
        return 0;
}

コンパイル

$ gcc -m32 -o a.i686 sample.c
$ gcc -o a.x86_64 sample.c

実行結果

$ ./a.x86_64 /mnt/cifs/
directory opened
d_name: .          ←ディレクトリの中身が参照できてる
d_name: ..         ←ディレクトリの中身が参照できてる
d_name: test.txt   ←ディレクトリの中身が参照できてる
errno:0: Success
directory closed
cnt = 3            ←中身は 3件あった
$ ./a.i686 /mnt/cifs/
directory opened
errno:12: Cannot allocate memory    ←メモリが確保できない?
directory closed
cnt = 0            ←中身が 0件となる

クライアント環境

  • Linux datacos7 3.10.0-957.5.1.el7.x86_64 #1 SMP Fri Feb 1 14:54:57 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
  • CentOS Linux release 7.6.1810 (Core)
  • cifs-utils-6.2-10.el7.x86_64
  • gcc-4.8.5-36.el7.x86_64
  • glibc-2.17-260.el7_6.3 (i686とx86_64)

サーバー環境

  • Windows 2016 Server