Installation environment:
- Mac OS X: 10.6.6
- Xcode: 3.2.5
- GnuTLS: 2.10.4
- Libgcrypt: 1.4.6
- Libgpg-error: 1.10
To compile GnuTLS successfully, you must first install Libgcrypt. To compile Libgcrypt successfully, you must rely on Libgpg-error. Therefore, you must install the SDK in the order of Libgpg-error-> Libgcrypt-> GnuTLS. For details about the installation method, see the INSTALL document of each program. The following describes the problems encountered during the installation and solutions.
When making Libgcrypt, the following error occurs:
mpih-add1-asm.S:47:suffix or operands invalid for `push'mpih-add1-asm.S:48:suffix or operands invalid for `push'mpih-add1-asm.S:78:suffix or operands invalid for `jmp'mpih-add1-asm.S:113:suffix or operands invalid for `pop'mpih-add1-asm.S:114:suffix or operands invalid for `pop'
You can add the option when configuring configure.Disable-asmTo avoid.
./configure --disable-asm
When you make GnuTLS, the following error occurs:
serv.c:515:41: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1serv.c: In function 'peer_print_info':serv.c:515: error: '__darwin_obsz' undeclared (first use in this function)serv.c:515: error: (Each undeclared identifier is reported only onceserv.c:515: error: for each function it appears in.)serv.c:515: error: expected expression before ')' tokenserv.c:515: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a castserv.c:517:37: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1serv.c:517: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a castserv.c:518:31: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1serv.c:518: error: expected expression before ')' tokenserv.c:518: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a castserv.c:521:71: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1serv.c:519: error: expected expression before ')' tokenserv.c:519: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a castserv.c:533:51: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1serv.c:533: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a castserv.c:545:49: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1serv.c:544: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a castserv.c:553:49: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1serv.c:552: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a castserv.c:562:43: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1serv.c:560: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a castserv.c:570:43: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1serv.c:568: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a castserv.c:581:8: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1serv.c:579: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a castserv.c:590:78: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1serv.c:590: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a castserv.c:596:70: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1serv.c:596: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a castserv.c:601:68: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1serv.c:601: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a castserv.c:606:63: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1serv.c:606: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a castserv.c:611:60: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1serv.c:611: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a castserv.c:619:8: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1serv.c:618: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a castserv.c:623:54: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1serv.c:623: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a castserv.c:627:84: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1serv.c:627: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a cast
This error is caused by incompatibility of macro snprintf in Mac OS X 10.6. The solution is to modify the code in serv. c and split macro tmp2 into two macros. The specific modification is as follows:
1. Split the definition of tmp2 into tmp2b and tmp2l.
-#define tmp2 &http_buffer[strlen(http_buffer)], len-strlen(http_buffer)+#define tmp2b &http_buffer[strlen(http_buffer)]+#define tmp2l len-strlen(http_buffer)
2. replace all the places that call tmp2 with tmp2b and tmp2l.
References: GnuTLS does not build on OS X 10.6 due to incompatibility with snprintf macro
The following describes the errors and solutions in the original article:
Code built with gcc on Mac OS X 10.6 uses the object size checking feature of gcc by default. This involves redefiningseveral functions as macros; one of these functions is snprintf: #define snprintf(str, len, ...) \ __builtin___snprintf_chk (str, len, 0, __darwin_obsz(str), __VA_ARGS__)The usage of snprintf in src/serv.c in gnutls-2.10.4 is not compatible with that macro. serv.c attempts touse a macro (tmp2) that expands into two different arguments: #define tmp2 &http_buffer[strlen(http_buffer)], len-strlen(http_buffer) snprintf (tmp2, "%.2X", sesid[i]);Due to how nested macro evaluation works, the snprintf macro sees tmp2 as a single argument, and copies itinto __darwin_obsz(); then, when tmp2 is expanded, __darwin_obsz has two arguments, but it is onlydefined for one, and the result is a compilation error.One way to work around this issue might be to define _FORTIFY_SOURCE=0 so that the snprintf macro is notdefined, or simply doing an #undef snprintf for that file, but it seems safer and more portable to splittmp2 into two macros. I append a patch that does so.
GnuTLS details: click here
GnuTLS: click here