Skip to content

Commit 73c4d8c

Browse files
committed
test: Add tests for constructors
Make sure constructors are called with the default crt0 and not called with the minimal crt0. Signed-off-by: Keith Packard <[email protected]>
1 parent 46bf52f commit 73c4d8c

File tree

3 files changed

+117
-1
lines changed

3 files changed

+117
-1
lines changed

test/constructor-skip.c

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* SPDX-License-Identifier: BSD-3-Clause
3+
*
4+
* Copyright © 2021 Keith Packard
5+
*
6+
* Redistribution and use in source and binary forms, with or without
7+
* modification, are permitted provided that the following conditions
8+
* are met:
9+
*
10+
* 1. Redistributions of source code must retain the above copyright
11+
* notice, this list of conditions and the following disclaimer.
12+
*
13+
* 2. Redistributions in binary form must reproduce the above
14+
* copyright notice, this list of conditions and the following
15+
* disclaimer in the documentation and/or other materials provided
16+
* with the distribution.
17+
*
18+
* 3. Neither the name of the copyright holder nor the names of its
19+
* contributors may be used to endorse or promote products derived
20+
* from this software without specific prior written permission.
21+
*
22+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25+
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26+
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27+
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31+
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
33+
* OF THE POSSIBILITY OF SUCH DAMAGE.
34+
*/
35+
36+
#define CONSTRUCTOR_RET 1
37+
#include "constructor.c"

test/constructor.c

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* SPDX-License-Identifier: BSD-3-Clause
3+
*
4+
* Copyright © 2021 Keith Packard
5+
*
6+
* Redistribution and use in source and binary forms, with or without
7+
* modification, are permitted provided that the following conditions
8+
* are met:
9+
*
10+
* 1. Redistributions of source code must retain the above copyright
11+
* notice, this list of conditions and the following disclaimer.
12+
*
13+
* 2. Redistributions in binary form must reproduce the above
14+
* copyright notice, this list of conditions and the following
15+
* disclaimer in the documentation and/or other materials provided
16+
* with the distribution.
17+
*
18+
* 3. Neither the name of the copyright holder nor the names of its
19+
* contributors may be used to endorse or promote products derived
20+
* from this software without specific prior written permission.
21+
*
22+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25+
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26+
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27+
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31+
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
33+
* OF THE POSSIBILITY OF SUCH DAMAGE.
34+
*/
35+
36+
#include <stdlib.h>
37+
#include <unistd.h>
38+
#include <stdio.h>
39+
40+
#ifndef CONSTRUCTOR_RET
41+
#define CONSTRUCTOR_RET 0
42+
#endif
43+
44+
#define REGULAR_RET (1 - CONSTRUCTOR_RET)
45+
46+
void __attribute__((constructor(101)))
47+
crt_startup(void)
48+
{
49+
_exit(CONSTRUCTOR_RET);
50+
}
51+
52+
int main(void)
53+
{
54+
_exit(REGULAR_RET);
55+
}

test/meson.build

+25-1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,13 @@ foreach target : targets
5252
_libs_hosted = _libs_base
5353
endif
5454

55+
have_crt_minimal = is_variable('lib_crt_minimal' + target)
56+
if have_crt_minimal
57+
_libs_minimal = [get_variable('lib_crt_minimal'+ target)] + _libs_base
58+
else
59+
_libs_minimal = _libs_base
60+
endif
61+
5562
_c_args = value[1] + test_c_args + test_c_warnings
5663
_link_args = value[1] + test_link_args
5764

@@ -157,10 +164,27 @@ foreach target : targets
157164
should_fail: true
158165
)
159166

167+
if have_crt_minimal
168+
t1 = 'constructor-skip'
169+
if target == ''
170+
t1_name = t1
171+
else
172+
t1_name = join_paths(target, t1)
173+
endif
174+
175+
test(t1 + target,
176+
executable(t1_name, 'constructor-skip.c',
177+
c_args: float_printf_compile_args + _c_args,
178+
link_args: float_printf_link_args + _link_args,
179+
link_with: _libs_minimal,
180+
include_directories: inc),
181+
env: ['MESON_SOURCE_ROOT=' + meson.source_root()])
182+
endif
183+
160184
plain_tests = ['rand', 'regex', 'ungetc', 'fenv',
161185
'math_errhandling', 'malloc', 'tls',
162186
'ffs', 'setjmp', 'atexit', 'on_exit',
163-
'complex-funcs', 'math-funcs',
187+
'complex-funcs', 'math-funcs', 'constructor'
164188
]
165189

166190
if newlib_nano_malloc or not tests_disable_full_malloc_stress

0 commit comments

Comments
 (0)