1

我需要对 C 标准库 (glibc) 进行一些修改,以获得一些性能改进。具体来说,我将编写一些依赖于语言环境的函数(在 glibc 中表现不佳)的一些特殊版本,例如strcoll.

我已经从这里检查了 glibc 源,进入~/Desktop/glibc. 然后我运行以下命令序列而没有错误。

$ cd ~/Desktop
$ mkdir bglibc
$ cd bglibc
$ ./../glibc/configure --prefix=~/Desktop/bglibc
$ make
$ make install

至此,我已经成功编译安装 glibc 到~/Desktop/bglibc. ct.c然后我在 bglibc 目录中创建了以下测试程序 ( ):

#include <stdio.h>
#include <locale.h>

int main ()
{
  char *locale = NULL;
  locale = "en_US.utf8";

  char *result = setlocale(LC_COLLATE, locale);
  if (result == NULL) {
    printf("locale not set\n");
  }   

  printf("strcoll: %d\n", strcoll("some", "string"));

  return 0;
}

然后我用这个脚本构建它:

iSYSROOT=~/Desktop/bglibc

gcc -o ct ct.c \
  --sysroot=${SYSROOT} \
  -Wl,-rpath=${SYSROOT}/lib \
  -Wl,--dynamic-linker=${SYSROOT}/lib/ld.so.1

哪个可以正确构建它。然后我用这个脚本运行它:

#!/bin/sh
builddir=`dirname "$0"`
GCONV_PATH="${builddir}/iconvdata" \
exec    "${builddir}"/elf/ld-linux-x86-64.so.2 --library-path "${builddir}":"${builddir}"/*:"${builddir}"/*/*:"${builddir}"/*/*/* ${1+"$@"}

这是名称testrun.sh。要在我之前编译的程序 ( ct) 上运行它,我运行./testrun.sh ./ct.

这成功运行程序,但是程序打印出来locale not set,这意味着它无法将语言环境设置为"en_US.utf8". 因此,语言环境保留默认值 ( "C"),在这种情况下,strcoll只需返回strcmp. 但是,我需要这个调用来运行strcoll代码,以便对其性能进行测试,然后调整它以在特定语言环境下运行得更快。

我知道这"en_US.utf8"是我的系统(Ubuntu 12.04 lts)的有效语言环境,因为我看到了:

$ locale -a | grep US
en_US.utf8

我也尝试过运行该程序,但将语言环境变量设置为其他字符串,例如"en_US.UTF-16“、”、“""等等"en_US.UTF-8"”,但都没有运气。

我想这不是我在尝试让语言环境的东西与我的修改版 glibc 一起工作时遇到的第一个问题,但它是第一个。

关于我可以做些什么来使语言环境功能(特别是setlocale)正常工作的任何想法?

4

2 回答 2

1

我的猜测:您忘记“制作”一些语言环境。尝试:

$ make
$ make install
$ make localedata/install-locales

另见GNU libc 制作手册

安装后,您可能需要配置时区和语言环境安装...

于 2014-05-11T18:46:47.220 回答
0

尝试使用strace找出 glibc 尝试从哪里读取语言环境。我怀疑由于您设置了前缀 glibc 会尝试在其中找到它们~/Desktop/bglibc/share/locale/或类似的东西。当然 UTF-16 不适用于 8 位字符串类型......

于 2013-08-20T17:38:54.500 回答