4 * Each RTEMS BSP provides its own crt0 and linker script. Unfortunately
5 * this means that crt0 and the linker script are not available as
6 * each tool is configured. Without a crt0 and linker script, some
7 * targets do not successfully link "conftest.c" during the configuration
8 * process. So this fake crt0.c provides all the symbols required to
9 * successfully link a program. The resulting program will not run
10 * but this is enough to satisfy the autoconf macro AC_PROG_CC.
22 #include <machine/_arc4random.h>
23 #include <machine/_libatomic.h>
25 void rtems_provides_crt0( void ) {} /* dummy symbol so file always has one */
27 #define RTEMS_STUB(ret, func, body) \
28 ret rtems_stub_##func body; \
31 /* RTEMS provides some of its own routines including a Malloc family */
32 RTEMS_STUB(void *,malloc(size_t s
), { return 0; })
33 RTEMS_STUB(void *,realloc(void* p
, size_t s
), { return 0; })
34 RTEMS_STUB(void, free(void* ptr
), { })
35 RTEMS_STUB(void *, calloc(size_t s1
, size_t s2
), { return 0; })
36 RTEMS_STUB(int, posix_memalign(void **p
, size_t si
, size_t s2
), { return -1; })
37 RTEMS_STUB(void *, aligned_alloc(size_t s1
, size_t s2
), { return 0; })
39 /* Stubs for routines from RTEMS <sys/lock.h> */
40 RTEMS_STUB(void, _Mutex_Acquire(struct _Mutex_Control
*p
), { })
41 RTEMS_STUB(int, _Mutex_Acquire_timed(struct _Mutex_Control
*p1
, const struct timespec
*p2
), { return -1; })
42 RTEMS_STUB(int, _Mutex_Try_Acquire(struct _Mutex_Control
*p
), { return -1; })
43 RTEMS_STUB(void, _Mutex_Release(struct _Mutex_Control
*p
), { })
45 RTEMS_STUB(void, _Mutex_recursive_Acquire(struct _Mutex_recursive_Control
*p
), { })
46 RTEMS_STUB(int, _Mutex_recursive_Acquire_timed(struct _Mutex_recursive_Control
*p1
, const struct timespec
*p2
), { return -1; })
47 RTEMS_STUB(int, _Mutex_recursive_Try_acquire(struct _Mutex_recursive_Control
*p
), { return -1; })
48 RTEMS_STUB(void, _Mutex_recursive_Release(struct _Mutex_recursive_Control
*p
), { })
50 RTEMS_STUB(void, _Condition_Wait(struct _Condition_Control
*p1
, struct _Mutex_Control
*p2
), { })
51 RTEMS_STUB(int, _Condition_Wait_timed(struct _Condition_Control
*p1
, struct _Mutex_Control
*p2
, const struct timespec
*p3
), { return -1; })
52 RTEMS_STUB(void, _Condition_Wait_recursive(struct _Condition_Control
*p1
, struct _Mutex_recursive_Control
*p2
), { })
53 RTEMS_STUB(int, _Condition_Wait_recursive_timed(struct _Condition_Control
*p1
, struct _Mutex_recursive_Control
*p2
, const struct timespec
*p3
), { return -1; })
54 RTEMS_STUB(void, _Condition_Signal(struct _Condition_Control
*p
), { })
55 RTEMS_STUB(void, _Condition_Broadcast(struct _Condition_Control
*p
), { })
57 RTEMS_STUB(void, _Semaphore_Wait(struct _Semaphore_Control
*p
), { })
58 RTEMS_STUB(void, _Semaphore_Post(struct _Semaphore_Control
*p
), { })
60 RTEMS_STUB(int, _Futex_Wait(struct _Futex_Control
*p1
, int *p2
, int i
), { return -1; })
61 RTEMS_STUB(int, _Futex_Wake(struct _Futex_Control
*p
, int i
), { return -1; })
63 RTEMS_STUB(int, _Sched_Count(void), { return -1; })
64 RTEMS_STUB(int, _Sched_Index(void), { return -1; })
65 RTEMS_STUB(int, _Sched_Name_to_index(const char *p
, size_t s
), { return -1; })
66 RTEMS_STUB(int, _Sched_Processor_count(int i
), { return 1; })
68 /* Stubs for routines from RTEMS <machine/_libatomic.h> */
69 RTEMS_STUB(__uint32_t
, _Libatomic_Protect_start(void *ptr
), { return 0; });
70 RTEMS_STUB(void, _Libatomic_Protect_end(void *ptr
, __uint32_t isr_level
), { });
71 RTEMS_STUB(void, _Libatomic_Lock_n(void *ptr
, __size_t n
), { });
72 RTEMS_STUB(void, _Libatomic_Unlock_n(void *ptr
, __size_t n
), { });
74 /* Stubs for routines for arc4random (from <unistd.h> and <machine/_arc4random.h> */
75 RTEMS_STUB(int, getentropy(void *ptr
, __size_t n
), { return -1; });
76 RTEMS_STUB(void, _arc4random_getentropy_fail(void), { });
80 * stubs for libstdc++ rtems-threads support functions from gcc/gthr-rtems.h
82 int rtems_gxx_once() { return -1; }
83 int rtems_gxx_key_create() { return -1; }
84 int rtems_gxx_key_delete() { return -1; }
85 void *rtems_gxx_getspecific() { return 0; }
86 int rtems_gxx_setspecific() { return -1; }
88 void rtems_gxx_mutex_init() { }
89 int rtems_gxx_mutex_lock() { return -1; }
90 int rtems_gxx_mutex_trylock() { return -1; }
91 int rtems_gxx_mutex_unlock() { return -1; }
93 void rtems_gxx_recursive_mutex_init() { }
94 int rtems_gxx_recursive_mutex_lock() { return -1; }
95 int rtems_gxx_recursive_mutex_trylock() { return -1; }
96 int rtems_gxx_recursive_mutex_unlock() { return -1; }
99 /* stubs for functions RTEMS provides */
100 RTEMS_STUB(int, access(const char *pathname
, int mode
), { return -1; })
101 RTEMS_STUB(int, clock_gettime(clockid_t clk_id
, struct timespec
*tp
), { return -1; })
102 RTEMS_STUB(int, close (int fd
), { return -1; })
103 RTEMS_STUB(int, dup2(int oldfd
, int newfd
), { return -1; })
104 RTEMS_STUB(int, fchmod(int fd
, mode_t mode
), { return -1; })
105 RTEMS_STUB(int, fcntl( int fd
, int cmd
, ... /* arg */ ), { return -1; })
106 RTEMS_STUB(pid_t
, fork(void), { return -1; })
107 RTEMS_STUB(int, fstat(int fd
, struct stat
*buf
), { return -1; })
108 RTEMS_STUB(int, getdents(int fd
, void *dp
, int count
), { return -1; })
109 RTEMS_STUB(char *, getlogin(void), { return 0; })
110 RTEMS_STUB(int, gettimeofday(struct timeval
*__restrict tv
, struct timezone
*__restrict tz
), { return -1; })
111 RTEMS_STUB(struct passwd
*, getpwnam(const char *name
), { return 0; })
112 RTEMS_STUB(struct passwd
*, getpwuid(uid_t uid
), { return 0; })
113 RTEMS_STUB(uid_t
, getuid(void), { return 0; })
114 RTEMS_STUB(int, nanosleep(const struct timespec
*req
, struct timespec
*rem
), { return -1; })
115 RTEMS_STUB(int, ftruncate(int fd
, off_t length
), { return -1; })
116 RTEMS_STUB(_off_t
, lseek(int fd
, _off_t offset
, int whence
), { return -1; })
117 RTEMS_STUB(int, lstat(const char *path
, struct stat
*buf
), { return -1; })
118 RTEMS_STUB(int, open(const char *pathname
, int flags
, int mode
), { return -1; })
119 RTEMS_STUB(int, pipe(int pipefd
[2]), { return -1; })
120 RTEMS_STUB(_ssize_t
, read(int fd
, void *buf
, size_t count
), { return -1; })
121 RTEMS_STUB(ssize_t
, readv (int fd
, const struct iovec
*iov
, int iovcnt
), { return -1; })
122 RTEMS_STUB(int, sched_yield(void), { return -1; })
123 RTEMS_STUB(int, sigfillset(sigset_t
*set
), { return -1; })
124 RTEMS_STUB(int, sigprocmask(int how
, const sigset_t
*set
, sigset_t
*oldset
), { return -1; })
125 RTEMS_STUB(int, stat(const char *path
, struct stat
*buf
), { return -1; })
126 RTEMS_STUB(long, sysconf(int name
), { return -1; })
127 RTEMS_STUB(int, unlink(const char *pathname
), { return -1; })
128 RTEMS_STUB(pid_t
, vfork(void), { return -1; })
129 #if !defined(_NO_POPEN) && !defined(_NO_WORDEXP)
130 /* pulled in by libc/sys/posix/popen.c and libc/sys/posix/word*.c */
131 RTEMS_STUB(int, waitpid (pid_t pid
, int *status
, int options
), { return -1; })
133 RTEMS_STUB(_ssize_t
, write (int fd
, const void *buf
, size_t nbytes
), { return -1; })
134 RTEMS_STUB(ssize_t
, writev (int fd
, const struct iovec
*iov
, int iovcnt
), { return -1; })
136 /* stubs for functions from reent.h */
137 RTEMS_STUB(int, _close_r (struct _reent
*r
, int fd
), { return -1; })
138 #if defined(_NO_EXECVE)
139 RTEMS_STUB(int, _execve_r (struct _reent
*r
, char *, char **, char **), { return -1; })
141 RTEMS_STUB(int, _fcntl_r (struct _reent
*ptr
, int fd
, int cmd
, int arg
), { return -1; })
142 #if !(defined (REENTRANT_SYSCALLS_PROVIDED) || defined (NO_EXEC))
144 /* cf. newlib/libc/reent/execr.c */
145 RTEMS_STUB(int, _fork_r (struct _reent
*r
), { return -1; })
148 RTEMS_STUB(int, _fstat_r (struct _reent
*r
, int fd
, struct stat
*buf
), { return -1; })
149 RTEMS_STUB(uid_t
, geteuid (), { return -1; })
150 RTEMS_STUB(gid_t
, getgid (), { return -1; })
151 RTEMS_STUB(gid_t
, _getgid_r (struct _reent
*r
), { return -1; })
152 RTEMS_STUB(struct _reent
*, __getreent (void), { return 0; })
153 RTEMS_STUB(pid_t
, getpid (), { return -1; })
154 RTEMS_STUB(pid_t
, getppid (), { return -1; })
155 RTEMS_STUB(pid_t
, _getpid_r (struct _reent
*r
), { return -1; })
156 RTEMS_STUB(int, _gettimeofday_r(struct _reent
*r
, struct timeval
*tp
, void *tzp
), { return 0; })
157 RTEMS_STUB(int, _isatty_r (struct _reent
*r
, int fd
), { return isatty( fd
); })
158 RTEMS_STUB(int, _kill_r (struct _reent
*r
, int pid
, int sig
), { return -1; })
159 #if !defined(REENTRANT_SYSCALLS_PROVIDED)
160 /* cf. newlib/libc/reent/linkr.c */
161 RTEMS_STUB(int, _link_r (struct _reent
*r
, const char *oldpath
, const char *newpath
), { return -1; })
163 RTEMS_STUB(_off_t
, _lseek_r ( struct _reent
*ptr
, int fd
, _off_t offset
, int whence
), { return -1; })
164 RTEMS_STUB(int, _open_r (struct _reent
*r
, const char *buf
, int flags
, int mode
), { return -1; })
165 RTEMS_STUB(_ssize_t
, _read_r (struct _reent
*r
, int fd
, void *buf
, size_t nbytes
), { return -1; })
166 RTEMS_STUB(int, _rename_r (struct _reent
*r
, const char *a
, const char *b
), { return -1; })
167 #if !(defined (REENTRANT_SYSCALLS_PROVIDED) || defined (MALLOC_PROVIDED))
168 /* cf. newlib/libc/reent/sbrkr.c */
169 RTEMS_STUB(void *,_sbrk_r (struct _reent
*r
, ptrdiff_t addr
), { return 0; })
171 RTEMS_STUB(int, _stat_r (struct _reent
*r
, const char *path
, struct stat
*buf
), { return -1; })
172 RTEMS_STUB(_CLOCK_T_
, _times_r (struct _reent
*r
, struct tms
*ptms
), { return -1; })
173 RTEMS_STUB(int, _unlink_r (struct _reent
*r
, const char *path
), { return -1; })
174 #if !(defined (REENTRANT_SYSCALLS_PROVIDED) || defined (NO_EXEC))
175 /* cf. newlib/libc/reent/execr.c */
176 RTEMS_STUB(int, _wait_r (struct _reent
*r
, int *status
), { return -1; })
178 RTEMS_STUB(_ssize_t
, _write_r (struct _reent
*r
, int fd
, const void *buf
, size_t nbytes
), { return -1; })
181 RTEMS_STUB(int, _execve(const char *path
, char * const *argv
, char * const *envp
), { return -1; })
182 RTEMS_STUB(void, _exit(int status
), { while(1); })
184 /* Pulled in by newlib/libc/posix/glob.c */
186 #ifndef __NETBSD_SYSCALLS
187 RTEMS_STUB(int, issetugid (void), { return 0; })
192 RTEMS_STUB(void *, _realloc_r(struct _reent
*r
, void *p
, size_t s
), { return 0; })
193 RTEMS_STUB(void *, _calloc_r(struct _reent
*r
, size_t s1
, size_t s2
), { return 0; })
194 RTEMS_STUB(void *, _malloc_r(struct _reent
* r
, size_t s
), { return 0; })
195 RTEMS_STUB(void, _free_r(struct _reent
*r
, void *p
), { })
197 /* stubs for functions required by libc/stdlib */
198 RTEMS_STUB(void, __assert_func(const char *file
, int line
, const char *func
, const char *failedexpr
), { while (1) ;})
201 RTEMS_STUB(void, __aeabi_read_tp(void), { })
204 RTEMS_STUB(void *, __tls_get_addr(const void *ti
), { return NULL
; })
206 /* The PowerPC expects certain symbols to be defined in the linker script. */
209 int __SDATA_START__
; int __SDATA2_START__
;
210 int __GOT_START__
; int __GOT_END__
;
211 int __GOT2_START__
; int __GOT2_END__
;
212 int __SBSS_END__
; int __SBSS2_END__
;
213 int __FIXUP_START__
; int __FIXUP_END__
;
214 int __EXCEPT_START__
; int __EXCEPT_END__
;
215 int __init
; int __fini
;
216 int __CTOR_LIST__
; int __CTOR_END__
;
217 int __DTOR_LIST__
; int __DTOR_END__
;
220 /* The SH expects certain symbols to be defined in the linker script. */
223 int __EH_FRAME_BEGIN__
;
228 * Initial stack pointer address "__stack"
229 * hard coded into GCC instead of providing it through ldscripts
231 const char* __stack
;
234 #if defined(__m68k__)
235 RTEMS_STUB(void, __m68k_read_tp(void), { })