Install GnuTLS in Mac OS X 10.6

Source: Internet
Author: User

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

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.