4 /* =================================================================
8 * =================================================================
9 * ####ECOSGPLCOPYRIGHTBEGIN####
10 * -------------------------------------------
11 * This file is part of eCos, the Embedded Configurable Operating
13 * Copyright (C) 2005 eCosCentric Ltd.
15 * eCos is free software; you can redistribute it and/or modify it
16 * under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 2 or (at your option)
20 * eCos is distributed in the hope that it will be useful, but
21 * WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 * General Public License for more details.
25 * You should have received a copy of the GNU General Public License
26 * along with eCos; if not, write to the Free Software Foundation,
27 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
29 * As a special exception, if other files instantiate templates or
30 * use macros or inline functions from this file, or you compile this
31 * file and link it with other works to produce a work based on this
32 * file, this file does not by itself cause the resulting work to be
33 * covered by the GNU General Public License. However the source code
34 * for this file must still be made available in accordance with
35 * section (3) of the GNU General Public License.
37 * This exception does not invalidate any other reasons why a work
38 * based on this file might be covered by the GNU General Public
41 * -------------------------------------------
42 * ####ECOSGPLCOPYRIGHTEND####
43 * =================================================================
44 * #####DESCRIPTIONBEGIN####
46 * Author(s): Anthony Tonizzo (atonizzo@gmail.com)
47 * Contributors: nickg@ecoscentric.com
52 * ####DESCRIPTIONEND####
54 * =================================================================
57 //==============================================================================
59 #include <pkgconf/system.h>
60 #include <pkgconf/objloader.h>
61 #include <cyg/hal/hal_tables.h>
63 //==============================================================================
65 extern char *cyg_ldr_last_error;
67 //==============================================================================
69 #define CYG_LDR_MODE_FILESYSTEM 0
70 #define CYG_LDR_MODE_FTP 1
71 #define CYG_LDR_MODE_TFTP 2
72 #define CYG_LDR_MODE_MEMORY 3
73 #define CYG_LDR_MODE_HTTP 4
75 //==============================================================================
77 typedef struct ELF_OBJECT
82 size_t (*read)(struct ELF_OBJECT*, size_t, size_t, void*);
83 cyg_int32 (*seek)(struct ELF_OBJECT*, cyg_uint32);
84 cyg_int32 (*close)(struct ELF_OBJECT*);
86 // This is the absolute address in memory where the library resides.
89 // Start of the section header.
92 cyg_int32 hdrndx_symtab;
93 cyg_int32 hdrndx_strtab;
95 cyg_uint32 **sections;
97 } ELF_OBJECT, *PELF_OBJECT;
100 //==============================================================================
103 #if CYGPKG_SERVICES_OBJLOADER_DEBUG_LEVEL != 0
104 #define ELFDEBUG(a) diag_printf(a)
109 #if CYGPKG_SERVICES_OBJLOADER_DEBUG_LEVEL > 0
110 void cyg_ldr_print_section_data(PELF_OBJECT);
111 void cyg_ldr_print_symbol_names(PELF_OBJECT);
112 void cyg_ldr_print_rel_names(PELF_OBJECT);
115 //==============================================================================
116 // Internal functions
118 cyg_uint32 *cyg_ldr_load_elf_section(PELF_OBJECT, cyg_uint32);
119 void cyg_ldr_delete_elf_section(PELF_OBJECT, cyg_uint32);
120 cyg_uint32 *cyg_ldr_section_address(PELF_OBJECT, cyg_uint32);
121 void* cyg_ldr_scan_file(PELF_OBJECT);
122 cyg_int32 cyg_ldr_relocate_section(PELF_OBJECT, cyg_uint32);
123 void* cyg_ldr_find_symbol(void*, char*);
124 void* cyg_ldr_symbol_address(PELF_OBJECT, cyg_uint32);
125 void* cyg_ldr_external_address(PELF_OBJECT, cyg_uint32);
127 //==============================================================================
130 PELF_OBJECT cyg_ldr_open_library(CYG_ADDRWORD, cyg_int32);
131 void cyg_ldr_close_library(void*);
132 char* cyg_ldr_error(void);
133 void* cyg_ldr_get_symbol(void*, char*);
135 //==============================================================================
137 void *cyg_ldr_malloc(size_t) CYGBLD_ATTRIB_WEAK;
138 void cyg_ldr_free(void *) CYGBLD_ATTRIB_WEAK;
140 //==============================================================================
142 struct cyg_ldr_table_entry
146 } CYG_HAL_TABLE_TYPE;
148 typedef struct cyg_ldr_table_entry cyg_ldr_table_entry;
150 #define CYG_LDR_TABLE_ENTRY(__name, __symbol_name, __handler) \
151 cyg_ldr_table_entry __name CYG_HAL_TABLE_ENTRY(ldr_table) = \
152 { __symbol_name, __handler }
154 //==============================================================================
156 #define CYG_LDR_TABLE_KAPI_ALARM() \
157 CYG_LDR_TABLE_ENTRY(cyg_alarm_create_entry, \
158 "cyg_alarm_create", cyg_alarm_create); \
159 CYG_LDR_TABLE_ENTRY(cyg_alarm_delete_entry, \
160 "cyg_alarm_delete", cyg_alarm_delete); \
161 CYG_LDR_TABLE_ENTRY(cyg_alarm_initialize_entry, \
162 "cyg_alarm_initialize", cyg_alarm_initialize); \
163 CYG_LDR_TABLE_ENTRY(cyg_alarm_get_times_entry, \
164 "cyg_alarm_get_times", cyg_alarm_get_times); \
165 CYG_LDR_TABLE_ENTRY(cyg_alarm_enable_entry, \
166 "cyg_alarm_enable", cyg_alarm_enable); \
167 CYG_LDR_TABLE_ENTRY(cyg_alarm_disable_entry, \
168 "cyg_alarm_disable", cyg_alarm_disable);
170 #define CYG_LDR_TABLE_KAPI_CLOCK() \
171 CYG_LDR_TABLE_ENTRY(cyg_clock_create_entry, \
172 "cyg_clock_create", cyg_clock_create); \
173 CYG_LDR_TABLE_ENTRY(cyg_clock_delete_entry, \
174 "cyg_clock_delete", cyg_clock_delete); \
175 CYG_LDR_TABLE_ENTRY(cyg_clock_to_counter_entry, \
176 "cyg_clock_to_counter", cyg_clock_to_counter); \
177 CYG_LDR_TABLE_ENTRY(cyg_clock_set_resolution_entry, \
178 "cyg_clock_set_resolution", cyg_clock_set_resolution); \
179 CYG_LDR_TABLE_ENTRY(cyg_clock_get_resolution_entry, \
180 "cyg_clock_get_resolution",cyg_clock_get_resolution); \
181 CYG_LDR_TABLE_ENTRY(cyg_real_time_clock_entry, \
182 "cyg_real_time_clock", cyg_real_time_clock); \
183 CYG_LDR_TABLE_ENTRY(cyg_current_time_entry, \
184 "cyg_current_time", cyg_current_time);
186 #define CYG_LDR_TABLE_KAPI_COND() \
187 CYG_LDR_TABLE_ENTRY(cyg_cond_init_entry, \
188 "cyg_cond_init", cyg_cond_init); \
189 CYG_LDR_TABLE_ENTRY(cyg_cond_destroy_entry, \
190 "cyg_cond_destroy", cyg_cond_destroy); \
191 CYG_LDR_TABLE_ENTRY(cyg_cond_wait_entry, \
192 "cyg_cond_wait", cyg_cond_wait); \
193 CYG_LDR_TABLE_ENTRY(cyg_cond_signal_entry, \
194 "cyg_cond_signal", cyg_cond_signal); \
195 CYG_LDR_TABLE_ENTRY(cyg_cond_broadcast_entry, \
196 "cyg_cond_broadcast", cyg_cond_broadcast); \
197 CYG_LDR_TABLE_ENTRY(cyg_cond_timed_wait_entry, \
198 "cyg_cond_timed_wait", cyg_cond_timed_wait);
200 #define CYG_LDR_TABLE_KAPI_COUNTER() \
201 CYG_LDR_TABLE_ENTRY(cyg_counter_create_entry, \
202 "cyg_counter_create", cyg_counter_create); \
203 CYG_LDR_TABLE_ENTRY(cyg_counter_delete_entry, \
204 "cyg_counter_delete", cyg_counter_delete); \
205 CYG_LDR_TABLE_ENTRY(cyg_counter_current_value_entry, \
206 "cyg_counter_current_value", cyg_counter_current_value); \
207 CYG_LDR_TABLE_ENTRY(cyg_counter_set_value_entry, \
208 "cyg_counter_set_value", cyg_counter_set_value); \
209 CYG_LDR_TABLE_ENTRY(cyg_counter_tick_entry, \
210 "cyg_counter_tick", cyg_counter_tick); \
211 CYG_LDR_TABLE_ENTRY(cyg_counter_multi_tick_entry, \
212 "cyg_counter_multi_tick", cyg_counter_multi_tick);
214 #define CYG_LDR_TABLE_KAPI_EXCEPTIONS() \
215 CYG_LDR_TABLE_ENTRY(cyg_exception_set_handler_entry, \
216 "cyg_exception_set_handler", cyg_exception_set_handler); \
217 CYG_LDR_TABLE_ENTRY(cyg_exception_clear_handler_entry, \
218 "cyg_exception_clear_handler", \
219 cyg_exception_clear_handler); \
220 CYG_LDR_TABLE_ENTRY(cyg_exception_call_handler_entry, \
221 "cyg_exception_call_handler", \
222 cyg_exception_call_handler);
224 #define CYG_LDR_TABLE_KAPI_FLAG() \
225 CYG_LDR_TABLE_ENTRY(cyg_flag_init_entry, \
226 "cyg_flag_init", cyg_flag_init); \
227 CYG_LDR_TABLE_ENTRY(cyg_flag_destroy_entry, \
228 "cyg_flag_destroy", cyg_flag_destroy); \
229 CYG_LDR_TABLE_ENTRY(cyg_flag_setbits_entry, \
230 "cyg_flag_setbits", cyg_flag_setbits); \
231 CYG_LDR_TABLE_ENTRY(cyg_flag_maskbits_entry, \
232 "cyg_flag_maskbits", cyg_flag_maskbits); \
233 CYG_LDR_TABLE_ENTRY(cyg_flag_wait_entry, \
234 "cyg_flag_wait", cyg_flag_wait); \
235 CYG_LDR_TABLE_ENTRY(cyg_flag_timed_wait_entry, \
236 "cyg_flag_timed_wait", cyg_flag_timed_wait); \
237 CYG_LDR_TABLE_ENTRY(cyg_flag_poll_entry, \
238 "cyg_flag_poll", cyg_flag_poll); \
239 CYG_LDR_TABLE_ENTRY(cyg_flag_peek_entry, \
240 "cyg_flag_peek", cyg_flag_peek); \
241 CYG_LDR_TABLE_ENTRY(cyg_flag_waiting_entry, \
242 "cyg_flag_waiting", cyg_flag_waiting);
244 #define CYG_LDR_TABLE_KAPI_INTERRUPTS() \
245 CYG_LDR_TABLE_ENTRY(cyg_interrupt_create_entry, \
246 "cyg_interrupt_create", cyg_interrupt_create); \
247 CYG_LDR_TABLE_ENTRY(cyg_interrupt_delete_entry, \
248 "cyg_interrupt_delete", cyg_interrupt_delete); \
249 CYG_LDR_TABLE_ENTRY(cyg_interrupt_attach_entry, \
250 "cyg_interrupt_attach", cyg_interrupt_attach); \
251 CYG_LDR_TABLE_ENTRY(cyg_interrupt_detach_entry, \
252 "cyg_interrupt_detach", cyg_interrupt_detach); \
253 CYG_LDR_TABLE_ENTRY(cyg_interrupt_get_vsr_entry, \
254 "cyg_interrupt_get_vsr", cyg_interrupt_get_vsr); \
255 CYG_LDR_TABLE_ENTRY(cyg_interrupt_set_vsr_entry, \
256 "cyg_interrupt_set_vsr", cyg_interrupt_set_vsr); \
257 CYG_LDR_TABLE_ENTRY(cyg_interrupt_disable_entry, \
258 "cyg_interrupt_disable", cyg_interrupt_disable); \
259 CYG_LDR_TABLE_ENTRY(cyg_interrupt_enable_entry, \
260 "cyg_interrupt_enable", cyg_interrupt_enable); \
261 CYG_LDR_TABLE_ENTRY(cyg_interrupt_mask_entry, \
262 "cyg_interrupt_mask", cyg_interrupt_mask); \
263 CYG_LDR_TABLE_ENTRY(cyg_interrupt_mask_intunsafe_entry, \
264 "cyg_interrupt_mask_intunsafe", \
265 cyg_interrupt_mask_intunsafe); \
266 CYG_LDR_TABLE_ENTRY(cyg_interrupt_unmask_entry, \
267 "cyg_interrupt_unmask", cyg_interrupt_unmask); \
268 CYG_LDR_TABLE_ENTRY(cyg_interrupt_unmask_intunsafe_entry, \
269 "cyg_interrupt_unmask_intunsafe", \
270 cyg_interrupt_unmask_intunsafe); \
271 CYG_LDR_TABLE_ENTRY(cyg_interrupt_acknowledge_entry, \
272 "cyg_interrupt_acknowledge", \
273 cyg_interrupt_acknowledge); \
274 CYG_LDR_TABLE_ENTRY(cyg_interrupt_configure_entry, \
275 "cyg_interrupt_configure", cyg_interrupt_configure); \
276 CYG_LDR_TABLE_ENTRY(cyg_interrupt_set_cpu_entry, \
277 "cyg_interrupt_set_cpu", cyg_interrupt_set_cpu); \
278 CYG_LDR_TABLE_ENTRY(cyg_interrupt_get_cpu_entry, \
279 "cyg_interrupt_get_cpu", cyg_interrupt_get_cpu);
281 #define CYG_LDR_TABLE_KAPI_MBOX() \
282 CYG_LDR_TABLE_ENTRY(cyg_mbox_create_entry, \
283 "cyg_mbox_create", cyg_mbox_create); \
284 CYG_LDR_TABLE_ENTRY(cyg_mbox_delete_entry, \
285 "cyg_mbox_delete", cyg_mbox_delete); \
286 CYG_LDR_TABLE_ENTRY(cyg_mbox_get_entry, \
287 "cyg_mbox_get", cyg_mbox_get); \
288 CYG_LDR_TABLE_ENTRY(cyg_mbox_timed_get_entry, \
289 "cyg_mbox_timed_get", cyg_mbox_timed_get); \
290 CYG_LDR_TABLE_ENTRY(cyg_mbox_tryget_entry, \
291 "cyg_mbox_tryget", cyg_mbox_tryget); \
292 CYG_LDR_TABLE_ENTRY(cyg_mbox_peek_item_entry, \
293 "cyg_mbox_peek_item", cyg_mbox_peek_item); \
294 CYG_LDR_TABLE_ENTRY(cyg_mbox_put_entry, \
295 "cyg_mbox_put", cyg_mbox_put); \
296 CYG_LDR_TABLE_ENTRY(cyg_mbox_timed_put_entry, \
297 "cyg_mbox_timed_put", cyg_mbox_timed_put); \
298 CYG_LDR_TABLE_ENTRY(cyg_mbox_tryput_entry, \
299 "cyg_mbox_tryput", cyg_mbox_tryput); \
300 CYG_LDR_TABLE_ENTRY(cyg_mbox_peek_entry, \
301 "cyg_mbox_peek", cyg_mbox_peek); \
302 CYG_LDR_TABLE_ENTRY(cyg_mbox_waiting_to_get_entry, \
303 "cyg_mbox_waiting_to_get", \
304 cyg_mbox_waiting_to_get); \
305 CYG_LDR_TABLE_ENTRY(cyg_mbox_waiting_to_put_entry, \
306 "cyg_mbox_waiting_to_put", \
307 cyg_mbox_waiting_to_put);
309 #define CYG_LDR_TABLE_KAPI_MEMPOOL_FIX() \
310 CYG_LDR_TABLE_ENTRY(cyg_mempool_fix_create_entry, \
311 "cyg_mempool_fix_create", cyg_mempool_fix_create); \
312 CYG_LDR_TABLE_ENTRY(cyg_mempool_fix_delete_entry, \
313 "cyg_mempool_fix_delete", cyg_mempool_fix_delete); \
314 CYG_LDR_TABLE_ENTRY(cyg_mempool_fix_alloc_entry, \
315 "cyg_mempool_fix_alloc", cyg_mempool_fix_alloc); \
316 CYG_LDR_TABLE_ENTRY(cyg_mempool_fix_timed_alloc_entry, \
317 "cyg_mempool_fix_timed_alloc", \
318 cyg_mempool_fix_timed_alloc); \
319 CYG_LDR_TABLE_ENTRY(cyg_mempool_fix_try_alloc_entry, \
320 "cyg_mempool_fix_try_alloc", \
321 cyg_mempool_fix_try_alloc); \
322 CYG_LDR_TABLE_ENTRY(cyg_mempool_fix_free_entry, \
323 "cyg_mempool_fix_free", cyg_mempool_fix_free); \
324 CYG_LDR_TABLE_ENTRY(cyg_mempool_fix_waiting_entry, \
325 "cyg_mempool_fix_waiting", cyg_mempool_fix_waiting); \
326 CYG_LDR_TABLE_ENTRY(cyg_mempool_fix_get_info_entry, \
327 "cyg_mempool_fix_get_info", cyg_mempool_fix_get_info);
329 #define CYG_LDR_TABLE_KAPI_MEMPOOL_VAR() \
330 CYG_LDR_TABLE_ENTRY(cyg_mempool_var_create_entry, \
331 "cyg_mempool_var_create", cyg_mempool_var_create); \
332 CYG_LDR_TABLE_ENTRY(cyg_mempool_var_delete_entry, \
333 "cyg_mempool_var_delete", cyg_mempool_var_delete); \
334 CYG_LDR_TABLE_ENTRY(cyg_mempool_var_alloc_entry, \
335 "cyg_mempool_var_alloc", cyg_mempool_var_alloc); \
336 CYG_LDR_TABLE_ENTRY(cyg_mempool_var_timed_alloc_entry, \
337 "cyg_mempool_var_timed_alloc", \
338 cyg_mempool_var_timed_alloc); \
339 CYG_LDR_TABLE_ENTRY(cyg_mempool_var_try_alloc_entry, \
340 "cyg_mempool_var_try_alloc", \
341 cyg_mempool_var_try_alloc); \
342 CYG_LDR_TABLE_ENTRY(cyg_mempool_var_free_entry, \
343 "cyg_mempool_var_free", cyg_mempool_var_free); \
344 CYG_LDR_TABLE_ENTRY(cyg_mempool_var_waiting_entry, \
345 "cyg_mempool_var_waiting", cyg_mempool_var_waiting); \
346 CYG_LDR_TABLE_ENTRY(cyg_mempool_var_get_info_entry, \
347 "cyg_mempool_var_get_info", cyg_mempool_var_get_info);
349 #define CYG_LDR_TABLE_KAPI_MUTEX() \
350 CYG_LDR_TABLE_ENTRY(cyg_mutex_init_entry, \
351 "cyg_mutex_init", cyg_mutex_init); \
352 CYG_LDR_TABLE_ENTRY(cyg_mutex_destroy_entry, \
353 "cyg_mutex_destroy", cyg_mutex_destroy); \
354 CYG_LDR_TABLE_ENTRY(cyg_mutex_trylock_entry, \
355 "cyg_mutex_trylock", cyg_mutex_trylock); \
356 CYG_LDR_TABLE_ENTRY(cyg_mutex_unlock_entry, \
357 "cyg_mutex_unlock", cyg_mutex_unlock); \
358 CYG_LDR_TABLE_ENTRY(cyg_mutex_release_entry, \
359 "cyg_mutex_release", cyg_mutex_release); \
360 CYG_LDR_TABLE_ENTRY(cyg_mutex_set_ceiling_entry, \
361 "cyg_mutex_set_ceiling", cyg_mutex_set_ceiling); \
362 CYG_LDR_TABLE_ENTRY(cyg_mutex_set_protocol_entry, \
363 "cyg_mutex_set_protocol", cyg_mutex_set_protocol);
365 #define CYG_LDR_TABLE_KAPI_SCHEDULER() \
366 CYG_LDR_TABLE_ENTRY(cyg_scheduler_start_entry, \
367 "cyg_scheduler_start", cyg_scheduler_start); \
368 CYG_LDR_TABLE_ENTRY(cyg_scheduler_lock_entry, \
369 "cyg_scheduler_lock", cyg_scheduler_lock); \
370 CYG_LDR_TABLE_ENTRY(cyg_scheduler_safe_lock_entry, \
371 "cyg_scheduler_safe_lock", cyg_scheduler_safe_lock); \
372 CYG_LDR_TABLE_ENTRY(cyg_scheduler_unlock_entry, \
373 "cyg_scheduler_unlock", cyg_scheduler_unlock); \
374 CYG_LDR_TABLE_ENTRY(cyg_scheduler_read_lock_entry, \
375 "cyg_scheduler_read_lock", cyg_scheduler_read_lock); \
377 #define CYG_LDR_TABLE_KAPI_SEMAPHORE() \
378 CYG_LDR_TABLE_ENTRY(cyg_semaphore_init_entry, \
379 "cyg_semaphore_init", cyg_semaphore_init); \
380 CYG_LDR_TABLE_ENTRY(cyg_semaphore_destroy_entry, \
381 "cyg_semaphore_destroy", cyg_semaphore_destroy); \
382 CYG_LDR_TABLE_ENTRY(cyg_semaphore_wait_entry, \
383 "cyg_semaphore_wait", cyg_semaphore_wait); \
384 CYG_LDR_TABLE_ENTRY(cyg_semaphore_timed_wait_entry, \
385 "cyg_semaphore_timed_wait", cyg_semaphore_timed_wait); \
386 CYG_LDR_TABLE_ENTRY(cyg_semaphore_try_wait_entry, \
387 "cyg_semaphore_trywait", cyg_semaphore_trywait); \
388 CYG_LDR_TABLE_ENTRY(cyg_semaphore_post_entry, \
389 "cyg_semaphore_post", cyg_semaphore_post); \
390 CYG_LDR_TABLE_ENTRY(cyg_semaphore_peek_entry, \
391 "cyg_semaphore_peek", cyg_semaphore_peek);
393 #define CYG_LDR_TABLE_KAPI_THREAD() \
394 CYG_LDR_TABLE_ENTRY(cyg_thread_create_entry, \
395 "cyg_thread_create", cyg_thread_create); \
396 CYG_LDR_TABLE_ENTRY(cyg_thread_exit_entry, \
397 "cyg_thread_exit", cyg_thread_exit); \
398 CYG_LDR_TABLE_ENTRY(cyg_thread_delete_entry, \
399 "cyg_thread_delete", cyg_thread_delete); \
400 CYG_LDR_TABLE_ENTRY(cyg_thread_suspend_entry, \
401 "cyg_thread_suspend", cyg_thread_suspend); \
402 CYG_LDR_TABLE_ENTRY(cyg_thread_resume_entry, \
403 "cyg_thread_resume", cyg_thread_resume); \
404 CYG_LDR_TABLE_ENTRY(cyg_thread_kill_entry, \
405 "cyg_thread_kill", cyg_thread_kill); \
406 CYG_LDR_TABLE_ENTRY(cyg_thread_release_entry, \
407 "cyg_thread_release", cyg_thread_release); \
408 CYG_LDR_TABLE_ENTRY(cyg_thread_yield_entry, \
409 "cyg_thread_yield", cyg_thread_yield); \
410 CYG_LDR_TABLE_ENTRY(cyg_thread_self_entry, \
411 "cyg_thread_self", cyg_thread_self); \
412 CYG_LDR_TABLE_ENTRY(cyg_thread_idle_thread_entry, \
413 "cyg_thread_idle_thread", cyg_thread_idle_thread); \
414 CYG_LDR_TABLE_ENTRY(cyg_thread_set_priority_entry, \
415 "cyg_thread_set_priority", cyg_thread_set_priority); \
416 CYG_LDR_TABLE_ENTRY(cyg_thread_get_priority_entry, \
417 "cyg_thread_get_priority", cyg_thread_get_priority); \
418 CYG_LDR_TABLE_ENTRY(cyg_thread_get_current_priority_entry, \
419 "cyg_thread_get_current_priority", \
420 cyg_thread_get_current_priority); \
421 CYG_LDR_TABLE_ENTRY(cyg_thread_delay_entry, \
422 "cyg_thread_delay", cyg_thread_delay); \
423 CYG_LDR_TABLE_ENTRY(cyg_thread_get_stack_base_entry, \
424 "cyg_thread_get_stack_base", cyg_thread_get_stack_base); \
425 CYG_LDR_TABLE_ENTRY(cyg_thread_get_stack_size_entry, \
426 "cyg_thread_get_stack_size", cyg_thread_get_stack_size); \
427 CYG_LDR_TABLE_ENTRY(cyg_thread_new_data_index_entry, \
428 "cyg_thread_new_data_index", cyg_thread_new_data_index); \
429 CYG_LDR_TABLE_ENTRY(cyg_thread_free_data_index_entry, \
430 "cyg_thread_free_data_index", \
431 cyg_thread_free_data_index); \
432 CYG_LDR_TABLE_ENTRY(cyg_thread_get_data_entry, \
433 "cyg_thread_get_data", cyg_thread_get_data); \
434 CYG_LDR_TABLE_ENTRY(cyg_thread_get_data_ptr_entry, \
435 "cyg_thread_get_data_ptr", cyg_thread_get_data_ptr); \
436 CYG_LDR_TABLE_ENTRY(cyg_thread_set_data_entry, \
437 "cyg_thread_set_data", cyg_thread_set_data);
439 #define CYG_LDR_TABLE_STRING() \
440 CYG_LDR_TABLE_ENTRY(memchr_entry, "memchr", memchr); \
441 CYG_LDR_TABLE_ENTRY(memcmp_entry, "memcmp", memcmp); \
442 CYG_LDR_TABLE_ENTRY(memcpy_entry, "memcpy", memcpy); \
443 CYG_LDR_TABLE_ENTRY(memmove_entry, "memmove", memmove); \
444 CYG_LDR_TABLE_ENTRY(memset_entry, "memset", memset); \
445 CYG_LDR_TABLE_ENTRY(strcpy_entry, "strcpy", strcpy); \
446 CYG_LDR_TABLE_ENTRY(strncpy_entry, "strncpy", strncpy); \
447 CYG_LDR_TABLE_ENTRY(strcat_entry, "strcat", strcat); \
448 CYG_LDR_TABLE_ENTRY(strncat_entry, "strncat", strncat); \
449 CYG_LDR_TABLE_ENTRY(strchr_entry, "strchr", strchr); \
450 CYG_LDR_TABLE_ENTRY(strrchr_entry, "strrchr", strrchr); \
451 CYG_LDR_TABLE_ENTRY(strcoll_entry, "strcoll", strcoll); \
452 CYG_LDR_TABLE_ENTRY(strlen_entry, "strlen", strlen); \
453 CYG_LDR_TABLE_ENTRY(strcmp_entry, "strcmp", strcmp); \
454 CYG_LDR_TABLE_ENTRY(strncmp_entry, "strncmp", strncmp); \
455 CYG_LDR_TABLE_ENTRY(strcspn_entry, "strcspn", strcspn); \
456 CYG_LDR_TABLE_ENTRY(strerror_entry, "strerror", strerror); \
457 CYG_LDR_TABLE_ENTRY(strpbrk_entry, "strpbrk", strpbrk); \
458 CYG_LDR_TABLE_ENTRY(strspn_entry, "strspn", strspn); \
459 CYG_LDR_TABLE_ENTRY(strstr_entry, "strstr", strstr); \
460 CYG_LDR_TABLE_ENTRY(strtok_entry, "strtok", strtok); \
461 CYG_LDR_TABLE_ENTRY(strxfrm_entry, "strxfrm", strxfrm);
463 #define CYG_LDR_TABLE_STDIO() \
464 CYG_LDR_TABLE_ENTRY(clearerr_entry, "clearerr", clearerr); \
465 CYG_LDR_TABLE_ENTRY(fclose_entry, "fclose", fclose); \
466 CYG_LDR_TABLE_ENTRY(feof_entry, "feof", feof); \
467 CYG_LDR_TABLE_ENTRY(ferror_entry, "ferror", ferror); \
468 CYG_LDR_TABLE_ENTRY(fflush_entry, "fflush", fflush); \
469 CYG_LDR_TABLE_ENTRY(fgetc_entry, "fgetc", fgetc); \
470 CYG_LDR_TABLE_ENTRY(fgetpos_entry, "fgetpos", fgetpos); \
471 CYG_LDR_TABLE_ENTRY(fgets_entry, "fgets", fgets); \
472 CYG_LDR_TABLE_ENTRY(fopen_entry, "fopen", fopen); \
473 CYG_LDR_TABLE_ENTRY(fprintf_entry, "fprintf", fprintf); \
474 CYG_LDR_TABLE_ENTRY(fputc_entry, "fputc", fputc); \
475 CYG_LDR_TABLE_ENTRY(fputs_entry, "fputs", fputs); \
476 CYG_LDR_TABLE_ENTRY(fread_entry, "fread", fread); \
477 CYG_LDR_TABLE_ENTRY(freopen_entry, "freopen", freopen); \
478 CYG_LDR_TABLE_ENTRY(fscanf_entry, "fscanf", fscanf); \
479 CYG_LDR_TABLE_ENTRY(fseek_entry, "fseek", fseek); \
480 CYG_LDR_TABLE_ENTRY(fsetpos_entry, "fsetpos", fsetpos); \
481 CYG_LDR_TABLE_ENTRY(ftell_entry, "ftell", ftell); \
482 CYG_LDR_TABLE_ENTRY(fwrite_entry, "fwrite", fwrite); \
483 CYG_LDR_TABLE_ENTRY(perror_entry, "perror", perror); \
484 CYG_LDR_TABLE_ENTRY(printf_entry, "printf", printf); \
485 CYG_LDR_TABLE_ENTRY(putc_entry, "putc", putc); \
486 CYG_LDR_TABLE_ENTRY(putchar_entry, "putchar", putchar); \
487 CYG_LDR_TABLE_ENTRY(puts_entry, "puts", puts); \
488 CYG_LDR_TABLE_ENTRY(remove_entry, "remove", remove); \
489 CYG_LDR_TABLE_ENTRY(rename_entry, "rename", rename); \
490 CYG_LDR_TABLE_ENTRY(rewind_entry, "rewind", rewind); \
491 CYG_LDR_TABLE_ENTRY(scanf_entry, "scanf", scanf); \
492 CYG_LDR_TABLE_ENTRY(setbuf_entry, "setbuf", setbuf); \
493 CYG_LDR_TABLE_ENTRY(setvbuf_entry, "setvbuf", setvbuf); \
494 CYG_LDR_TABLE_ENTRY(sprintf_entry, "sprintf", sprintf); \
495 CYG_LDR_TABLE_ENTRY(sscanf_entry, "sscanf", sscanf); \
496 CYG_LDR_TABLE_ENTRY(tmpfile_entry, "tmpfile", tmpfile); \
497 CYG_LDR_TABLE_ENTRY(tmpnam_entry, "tmpnam", tmpnam); \
498 CYG_LDR_TABLE_ENTRY(ungetc_entry, "ungetc", ungetc);
500 #define CYG_LDR_TABLE_INFRA_DIAG() \
501 CYG_LDR_TABLE_ENTRY(diag_init_entry, "diag_init", diag_init); \
502 CYG_LDR_TABLE_ENTRY(diag_write_char_entry, \
503 "diag_write_char", diag_write_char); \
504 CYG_LDR_TABLE_ENTRY(diag_write_string_entry, \
505 "diag_write_string", diag_write_string); \
506 CYG_LDR_TABLE_ENTRY(diag_write_dec_entry, \
507 "diag_write_dec", diag_write_dec); \
508 CYG_LDR_TABLE_ENTRY(diag_write_hex_entry, \
509 "diag_write_hex", diag_write_hex); \
510 CYG_LDR_TABLE_ENTRY(diag_dump_buf_entry, \
511 "diag_dump_buf", diag_dump_buf); \
512 CYG_LDR_TABLE_ENTRY(diag_dump_buf_32bit_entry, \
513 "diag_dump_buf_32bit", diag_dump_buf_32bit); \
514 CYG_LDR_TABLE_ENTRY(diag_dump_buf_16bit_entry, \
515 "diag_dump_buf_16bit", diag_dump_buf_16bit); \
516 CYG_LDR_TABLE_ENTRY(diag_vdump_buf_with_offset_entry, \
517 "diag_vdump_buf_with_offset", \
518 diag_vdump_buf_with_offset); \
519 CYG_LDR_TABLE_ENTRY(diag_dump_buf_with_offset_entry, \
520 "diag_dump_buf_with_offset", \
521 diag_dump_buf_with_offset); \
522 CYG_LDR_TABLE_ENTRY(diag_dump_buf_with_offset_32bit_entry, \
523 "diag_dump_buf_with_offset_32bit", \
524 diag_dump_buf_with_offset_32bit); \
525 CYG_LDR_TABLE_ENTRY(diag_dump_buf_with_offset_16bit_entry, \
526 "diag_dump_buf_with_offset_16bit", \
527 diag_dump_buf_with_offset_16bit); \
528 CYG_LDR_TABLE_ENTRY(diag_printf_entry, "diag_printf", diag_printf); \
529 CYG_LDR_TABLE_ENTRY(diag_init_putc_entry, "diag_init_putc", diag_init_putc); \
530 CYG_LDR_TABLE_ENTRY(diag_sprintf_entry, "diag_sprintf", diag_sprintf); \
531 CYG_LDR_TABLE_ENTRY(diag_snprintf_entry, "diag_snprintf", diag_snprintf); \
532 CYG_LDR_TABLE_ENTRY(diag_vsprintf_entry, "diag_vsprintf", diag_vsprintf); \
533 CYG_LDR_TABLE_ENTRY(diag_vprintf_entry, "diag_vprintf", diag_vprintf);
535 //==============================================================================