File: ax_dll_string.html

package info (click to toggle)
autoconf-archive 20070512-1
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 6,712 kB
  • ctags: 20
  • sloc: sh: 615; makefile: 43
file content (155 lines) | stat: -rw-r--r-- 4,487 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
 <head>
  <title>
   Autoconf Macro: ax_dll_string
  </title>
  <link rel="stylesheet" type="text/css" href="autoconf-archive.css">
 </head>
 <body>
  <table summary="web navigation" style="width:100%;">
   <tbody>
    <tr>
     <td style="width:25%;" align="center" valign="top">
      <a href="http://autoconf-archive.cryp.to/ax_dll_string.m4">Download M4
      Source</a>
     </td>
     <td style="width:25%;" align="center" valign="top">
      <a href=
      "http://git.cryp.to/?p=autoconf-archive;a=history;f=ax_dll_string.m4">Macro
      History</a>
     </td>
     <td style="width:25%;" align="center" valign="top">
      <a href="macros-by-category.html">Category Index</a>
     </td>
     <td style="width:25%;" align="center" valign="top">
      <form method="get" action="http://www.google.com/search">
       <div>
        <input name="sitesearch" value="autoconf-archive.cryp.to" type=
        "hidden"><a href="http://www.google.com/">Search</a>: <input name="q"
        size="10" maxlength="255" type="text">
       </div>
      </form>
     </td>
    </tr>
   </tbody>
  </table>
  <hr>
  <h1>
   ax_dll_string
  </h1>
  <h2>
   Synopsis
  </h2>
  <p class="indent" style="white-space:nowrap;">
   <code>AX_DLL_STRING</code>
  </p>
  <h2>
   Description
  </h2>
  <div class="indent">
   <p>
    Tests for a bug currently in g++ 3.4.4 on Cygwin (maybe other targets with
    statically linked libstdc++?) where passing an empty std::string to a dll
    will cause a crash on destruction due to incorrect memory handling. See bug
    24196 in gcc's bugzilla for more details: <a href=
    "http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24196">http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24196</a>
   </p>
  </div>
  <h2>
   Author
  </h2>
  <p class="indent">
   Steven Brown &lt;swbrown@variadic.org&gt;
  </p>
  <h2>
   Last Modified
  </h2>
  <p class="indent">
   2006-04-08
  </p>
  <h2>
   M4 Source Code
  </h2>
  <div class="indent">
   <pre class="m4source">
dnl Plan: compile conftest-dll.cc, conftest-exe.cc.  It has a 'crash' param
dnl that can be passed.  Verify the compile worked and we can run it normally
dnl ok.  Then, pass 'crash', test if it crashed, fail.

AC_DEFUN([AX_DLL_STRING],
[
  AC_MSG_CHECKING(if the dll string test can be compiled)
  cat &lt;&lt; EOF &gt; conftest-dll.cc
[
#include &lt;string&gt;
using namespace std;

void testit(std::string (*contentGet)()) {
  contentGet();
}
]
EOF
  cat &lt;&lt; EOF &gt; conftest-exe.cc
[
#include &lt;string&gt;
#include &lt;cstring&gt;
using namespace std;

extern void testit(std::string (*contentGet)());

std::string contentGet() {
  return string(""); // Anything other than empty string works.
}

int main(int argc, char *argv[]) {
  if(argc == 2 &amp;&amp; strcmp(argv[1], "crash") == 0) {
    testit(&amp;contentGet);
  }
  return 0;
}
]
EOF
  $CXX -shared $CFLAGS $CPPFLAGS conftest-dll.cc -o conftest-dll.dll &gt;&amp;AS_MESSAGE_LOG_FD &amp;&amp; $CXX $CFLAGS $CPPFLAGS conftest-exe.cc conftest-dll.dll -o conftest-exe.exe &gt;&amp; AS_MESSAGE_LOG_FD
  if test x"$?" = x"0"; then
    AC_MSG_RESULT(yes)

    dnl Make sure it runs normally first.
    AC_MSG_CHECKING(if the dll string test is usable)
    if /bin/sh -c "(LD_LIBRARY_PATH=\"$PWD\" ./conftest-exe.exe)" &gt;&amp; AS_MESSAGE_LOG_FD 2&gt;&amp;1; then
      AC_MSG_RESULT(yes)

      dnl Now we can check for the bug.
      AC_MSG_CHECKING(if the dll string test is affected by gcc bug 24196)
      if ! /bin/sh -c "(LD_LIBRARY_PATH=\"$PWD\" ./conftest-exe.exe crash)" &gt;&amp; AS_MESSAGE_LOG_FD 2&gt;&amp;1; then
        AC_MSG_RESULT(yes)

        dnl We have the bug, user'll need to fix it.
        AC_MSG_ERROR([*** This toolchain is affected by gcc bug 24196.  For Cygwin as of 4/8/2006, you can downgrade to gcc/g++ 3.3.3 or check if there is a newer compiler available that's fixed.])
      else
        AC_MSG_RESULT(no)
      fi
    else
      AC_MSG_RESULT(no)
    fi
  else
    AC_MSG_RESULT(no)
  fi
])
</pre>
  </div>
  <h2>
   License
  </h2>
  <div class="indent">
   <span style="white-space:nowrap;">Copyright &copy; 2006 Steven Brown
   &lt;swbrown@variadic.org&gt;</span>
   <p>
    Copying and distribution of this file, with or without modification, are
    permitted in any medium without royalty provided the copyright notice and
    this notice are preserved.
   </p>
  </div>
 </body>
</html>