【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

GOTエラー

OpenBSDportsをビルドしていて、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())