Вы пропускаете файл, который использовался бы для установки по умолчанию локали в отсутствие $LANG
или $LC_ALL
(или все более определенные $LC_whatever
) быть установленным.
На более старом glibc это/usr/lib/locale/locale-archive. Поскольку GNU/Linux хаотичен, необходимо использовать strace для определения, какие файлы ожидаются в конкретных версиях, используемых на машине:
strace -e file locale execve("/usr/bin/locale", ["locale"], [/* 36 vars */]) = 0 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 open("/lib/libc.so.6", O_RDONLY) = 3 open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
----------------------Комментарии добавили 1 день спустя:
"ltrace-S" должен быть хорошо, так как он показывает syscalls.
Иначе "ltrace" не очень полезен (т.е. это контрпродуктивно по сравнению с strace), потому что это только показывает верхние вызовы. Это очевидно (setlocale (3)), тогда как настоящая проблема происходит в libc.
Это кажется, что у Вас есть необработанные установленные данные локали, с тех пор en_US.UTF-8 работы.
Если так, затем что-то вроде этого должно решить Вашу проблему, установив значение по умолчанию в масштабе всей системы:
localedef -f UTF-8 -i en_US en_US.UTF-8
Нет никакой версии libc6 в debian, экспериментальном в данный момент. Версия, которая была в экспериментальном, была перемещена в sid и отсюда в тестирование и была также обновлена несколько раз с тех пор.
Как sid и тестирование, экспериментальное, движущаяся цель.
В данный момент debian имеет следующие версии libc6 пакета:
stable aka wheezy: 2.13-38
testing aka jessie: 2.17-92+b1
unstable aka sid: 2.17-92+b1
Ваш выбор в данный момент состоит в том, чтобы остаться с 2.13-38 и перекомпилировать Вашу программу против той версии libc6 или обновить до 2.17-92+b1 от sid или тестирования. Вам, возможно, все еще придется перекомпилировать Вашу программу после обновления до 2,17