OpenBSDでportsをビルドしていて、CUPSでエラーになりました。
Linking texttops... (snip) /usr/bin/ld: not enough GOT space for local GOT entries
GOTというのはGlobal Object Tableのことで、どうやらグローバル変数が収まりきらないというエラーのようです。初めて見るエラーなので、対処方法のメモを残しておきます。
パッチ
texttops.cには巨大なグローバル配列が定義されていますが、これらは他のソースからは参照されていないので、staticにしただけでビルドが通りました。
--- filter/texttops.c.orig +++ filter/texttops.c @@ -33,16 +33,16 @@ /* - * Globals... + * Locals... */ -char *Glyphs[65536]; /* PostScript glyphs for Unicode */ -int NumFonts; /* Number of fonts to use */ -char *Fonts[256][4]; /* Fonts to use */ -unsigned short Chars[65536]; /* 0xffcc (ff = font, cc = char) */ -unsigned short Codes[65536]; /* Unicode glyph mapping to fonts */ -int Widths[256]; /* Widths of each font */ -int Directions[256];/* Text directions for each font */ +static char *Glyphs[65536]; /* PostScript glyphs for Unicode */ +static int NumFonts; /* Number of fonts to use */ +static char *Fonts[256][4]; /* Fonts to use */ +static unsigned short Chars[65536]; /* 0xffcc (ff = font, cc = char) */ +static unsigned short Codes[65536]; /* Unicode glyph mapping to fonts */ +static int Widths[256]; /* Widths of each font */ +static int Directions[256];/* Text directions for each font */ /*
他の方法
もし他からも参照されていたらstaticにするだけでは対処できません。マクロでアクセス関数を変数に見立てるようにするしかなさそうです。
static char *Glyphs[65536]; char **_Glyphs() { return Glyphs; }
これをヘッダで以下のように公開します。
extern char **_Glyphs(); #define Glyphs (_Glyphs())
理由は異なると思いますが、errnoが似たような方法で公開されています。
int *__errno(void); #define errno (*__errno())