|
iPXE
|
Linker tables. More...
Go to the source code of this file.
Macros | |
| #define | __attribute__(x) |
| #define | __table(type, name) |
| Declare a linker table. | |
| #define | __table_type(table) |
| Get linker table data type. | |
| #define | __table_extract_type(type, name) |
| #define | __table_name(table) |
| Get linker table name. | |
| #define | __table_extract_name(type, name) |
| #define | __table_section(table, idx) |
| Get linker table section name. | |
| #define | __table_str(x) |
| #define | __table_alignment(table) |
| Get linker table alignment. | |
| #define | __table_entry(table, idx) |
| Declare a linker table entry. | |
| #define | __table_entries(table, idx) |
| Get start of linker table entries. | |
| #define | __TABLE_ENTRIES(entries, table, idx) |
| Declare start of linker table entries. | |
| #define | table_start(table) |
| Get start of linker table. | |
| #define | TABLE_START(start, table) |
| Declare start of linker table. | |
| #define | table_end(table) |
| Get end of linker table. | |
| #define | TABLE_END(end, table) |
| Declare end of linker table. | |
| #define | table_num_entries(table) |
| Get number of entries in linker table. | |
| #define | table_index(table, entry) |
| Get index of entry within linker table. | |
| #define | for_each_table_entry(pointer, table) |
| Iterate through all entries within a linker table. | |
| #define | for_each_table_entry_continue(pointer, table) |
| Iterate through all remaining entries within a linker table. | |
| #define | for_each_table_entry_reverse(pointer, table) |
| Iterate through all entries within a linker table in reverse order. | |
| #define | for_each_table_entry_continue_reverse(pointer, table) |
| Iterate through all remaining entries within a linker table in reverse order. | |
Functions | |
| FILE_LICENCE (GPL2_OR_LATER_OR_UBDL) | |
| FILE_SECBOOT (PERMITTED) | |
Linker tables.
Read #ifdef considered harmful first for some background on the motivation for using linker tables.
This file provides macros for dealing with linker-generated tables of fixed-size symbols. We make fairly extensive use of these in order to avoid #ifdef spaghetti and/or linker symbol pollution. For example, instead of having code such as
we make serial.c generate an entry in the initialisation function table, and then have a function call_init_fns() that simply calls all functions present in this table. If and only if serial.o gets linked in, then its initialisation function will be called. We avoid linker symbol pollution (i.e. always dragging in serial.o just because of a call to serial_init()) and we also avoid #ifdef spaghetti (having to conditionalise every reference to functions in serial.c).
The linker script takes care of assembling the tables for us. All our table sections have names of the format .tbl.NAME.NN where NAME designates the data structure stored in the table (e.g. init_fns) and NN is a two-digit decimal number used to impose an ordering upon the tables if required. NN=00 is reserved for the symbol indicating "table start", and NN=99 is reserved for the symbol indicating "table end".
As an example, suppose that we want to create a "frobnicator" feature framework, and allow for several independent modules to provide frobnicating services. Then we would create a frob.h header file containing e.g.
Any module providing frobnicating services would look something like
The central frobnicator code (frob.c) would use the frobnicating modules as follows
See init.h and init.c for a real-life example.
Definition in file tables.h.
| #define __table_type | ( | table | ) |
Get linker table data type.
| table | Linker table |
| type | Data type |
| #define __table_name | ( | table | ) |
Get linker table name.
| table | Linker table |
| name | Table name |
| #define __table_section | ( | table, | |
| idx ) |
| #define __table_alignment | ( | table | ) |
Get linker table alignment.
| table | Linker table |
| align | Alignment |
| #define __table_entry | ( | table, | |
| idx ) |
Declare a linker table entry.
| table | Linker table |
| idx | Sub-table index |
Example usage:
Definition at line 239 of file tables.h.
| #define __table_entries | ( | table, | |
| idx ) |
Get start of linker table entries.
| table | Linker table |
| idx | Sub-table index |
| entries | Start of entries |
Definition at line 250 of file tables.h.
| #define __TABLE_ENTRIES | ( | entries, | |
| table, | |||
| idx ) |
Declare start of linker table entries.
| entries | Start of entries |
| table | Linker table |
| idx | Sub-table index |
Definition at line 263 of file tables.h.
| #define table_start | ( | table | ) |
Get start of linker table.
| table | Linker table |
| start | Start of linker table |
Example usage:
Definition at line 283 of file tables.h.
Referenced by dhcp_create_request(), resolv(), and sec80211_detect_ie().
| #define TABLE_START | ( | start, | |
| table ) |
Declare start of linker table.
| start | Start of linker table |
| table | Linker table |
| #define table_end | ( | table | ) |
Get end of linker table.
| table | Linker table |
| end | End of linker table |
Example usage:
Definition at line 309 of file tables.h.
Referenced by netdev_priv_offset(), pcicloud_api(), resmux_child_close(), and sec80211_detect_ie().
| #define TABLE_END | ( | end, | |
| table ) |
Declare end of linker table.
| end | End of linker table |
| table | Linker table |
| #define table_num_entries | ( | table | ) |
Get number of entries in linker table.
| table | Linker table |
| num_entries | Number of entries in linker table |
Example usage:
Definition at line 336 of file tables.h.
Referenced by dhcp_create_request(), eap_tx_nak(), netdev_close(), netdev_has_configuration_rc(), and netdev_priv_offset().
| #define table_index | ( | table, | |
| entry ) |
Get index of entry within linker table.
| table | Linker table |
| entry | Table entry |
Example usage:
Definition at line 362 of file tables.h.
Referenced by netdev_configuration().
| #define for_each_table_entry | ( | pointer, | |
| table ) |
Iterate through all entries within a linker table.
| pointer | Entry pointer |
| table | Linker table |
Example usage:
Definition at line 386 of file tables.h.
Referenced by acpi_install(), alloc_netdev(), applicable_setting(), apply_settings(), arp_find_protocol(), asn1_find_algorithm(), bofm_find_driver(), builtin_fetch(), console_configure(), discard_cache(), dt_find_driver(), eap_rx_request(), eap_tx_nak(), eapol_rx(), efi_driver_start(), efi_driver_supported(), efi_init(), efi_snp_hii_extract_config(), efi_snp_hii_questions(), efi_veto_hp_xhci(), eisa_probe(), entropy_enable_working(), entropy_sample_test_exec(), execv(), fc_els_detect(), fc_els_prli_descriptor(), fc_xchg_respond(), find_error(), find_gdb_transport(), find_netdev_configurator(), find_pxe_api_call(), find_setting(), find_setting_type(), free_image(), guestinfo_fetch(), has_input(), help_exec(), http_authentication(), http_format_accept_encoding(), http_format_headers(), http_parse_content_encoding(), http_parse_header(), http_parse_transfer_encoding(), http_scheme(), ib_mi_handle(), ib_notify(), icmp_echo_protocol(), icmpv6_handler(), image_probe(), imgstat(), init_processes(), initialise(), ipstat(), ipxe(), isabus_probe(), isapnp_probe(), keymap_find(), mca_probe(), memmap_update_used(), net80211_prepare_assoc(), net_rx(), netdev_configure_all(), netdev_notify(), parse_fc_els_handler(), parse_setting_name(), pci_find_driver(), pcicloud_find(), peerdisc_socket_close(), peerdisc_socket_open(), peerdisc_socket_tx(), probe_devices(), profstat(), putchar(), pxenv_file_api_check(), quiesce(), register_ibdev(), register_netdev(), route(), rsa_find_prefix(), rtl818x_probe(), run_all_tests(), sec80211_install(), select_setting_row(), sock_aton(), sock_ntoa(), startup(), tcpip_net_protocol(), tcpip_rx(), timer_probe(), tls_client_hello(), tls_find_cipher_suite(), tls_find_named_curve(), tls_signature_hash_algorithm(), tls_signature_hash_digest(), tls_signature_hash_pubkey(), unquiesce(), usb_find_driver(), vmbus_find_driver(), wpa_find_cryptosystem(), wpa_find_kie(), xenbus_find_driver(), xfer_open_socket(), and xfer_uri_opener().
| #define for_each_table_entry_continue | ( | pointer, | |
| table ) |
Iterate through all remaining entries within a linker table.
| pointer | Entry pointer, preset to most recent entry |
| table | Linker table |
Example usage:
Definition at line 415 of file tables.h.
| #define for_each_table_entry_reverse | ( | pointer, | |
| table ) |
Iterate through all entries within a linker table in reverse order.
| pointer | Entry pointer |
| table | Linker table |
Example usage:
Definition at line 441 of file tables.h.
Referenced by efi_driver_connect(), shutdown(), unregister_ibdev(), and unregister_netdev().
| #define for_each_table_entry_continue_reverse | ( | pointer, | |
| table ) |
Iterate through all remaining entries within a linker table in reverse order.
| pointer | Entry pointer, preset to most recent entry |
| table | Linker table |
Example usage:
Definition at line 470 of file tables.h.
Referenced by netdev_priv_offset(), peerdisc_socket_open(), register_ibdev(), and register_netdev().
| FILE_LICENCE | ( | GPL2_OR_LATER_OR_UBDL | ) |
| FILE_SECBOOT | ( | PERMITTED | ) |