diff mbox series

build: list symbols exports in a single file

Message ID 20210406163231.19663-1-david.marchand@redhat.com (mailing list archive)
State Superseded, archived
Headers show
Series build: list symbols exports in a single file | expand

Checks

Context Check Description
ci/iol-testing fail Testing issues
ci/iol-abi-testing success Testing PASS
ci/iol-mellanox-Performance success Performance Testing PASS
ci/intel-Testing success Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/Intel-compilation success Compilation OK
ci/github-robot fail github build: failed
ci/travis-robot success travis build: passed
ci/checkpatch success coding style OK

Commit Message

David Marchand April 6, 2021, 4:32 p.m. UTC
Rather than have two files that keeps getting out of sync, let's
annotate the version.map to generate the Windows export file.

Note: EAL version.map annotation achieved with:
$ ./buildtools/map-list-symbol.sh lib/librte_eal/version.map |
  while read file version sym; do
    ! git grep -qw $sym lib/librte_eal/*.def || continue;
    sed -i -e "s/$sym;/$sym; # WINDOWS_NO_EXPORT/" lib/librte_eal/*.map;
  done

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
 MAINTAINERS                        |   1 -
 buildtools/map_to_win.py           |   8 +-
 devtools/check-symbol-maps.sh      |  20 --
 lib/librte_eal/rte_eal_exports.def | 336 -----------------------------
 lib/librte_eal/version.map         | 136 ++++++------
 5 files changed, 69 insertions(+), 432 deletions(-)
 delete mode 100644 lib/librte_eal/rte_eal_exports.def

Comments

David Marchand April 6, 2021, 4:40 p.m. UTC | #1
On Tue, Apr 6, 2021 at 6:33 PM David Marchand <david.marchand@redhat.com> wrote:
> diff --git a/buildtools/map_to_win.py b/buildtools/map_to_win.py
> index 2a6cb88605..34434d96fa 100644
> --- a/buildtools/map_to_win.py
> +++ b/buildtools/map_to_win.py
> @@ -7,7 +7,7 @@
>
>
>  def is_function_line(ln):
> -    return ln.startswith('\t') and ln.endswith(';\n') and ":" not in ln
> +    return ln.startswith('\t') and ln.endswith(';\n') and ":" not in ln and "# WINDOWS_NO_EXPORT" not in ln
>
>  # MinGW keeps the original .map file but replaces per_lcore* to __emutls_v.per_lcore*
>  def create_mingw_map_file(input_map, output_map):
> @@ -24,12 +24,6 @@ def main(args):
>          create_mingw_map_file(args[1], args[2])
>          return 0
>
> -# special case, allow override if an def file already exists alongside map file
> -    override_file = join(dirname(args[1]), basename(args[2]))
> -    if exists(override_file):
> -        with open(override_file) as f_in:
> -            functions = f_in.readlines()
> -

Forgot to clean associated python imports.
Will be fixed in a v2 if no objection is raised on the principle of the patch.


>  # generate def file from map file.
>  # This works taking indented lines only which end with a ";" and which don't
>  # have a colon in them, i.e. the lines defining functions only.
Bruce Richardson April 6, 2021, 4:50 p.m. UTC | #2
On Tue, Apr 06, 2021 at 06:32:30PM +0200, David Marchand wrote:
> Rather than have two files that keeps getting out of sync, let's
> annotate the version.map to generate the Windows export file.
> 
> Note: EAL version.map annotation achieved with:
> $ ./buildtools/map-list-symbol.sh lib/librte_eal/version.map |
>   while read file version sym; do
>     ! git grep -qw $sym lib/librte_eal/*.def || continue;
>     sed -i -e "s/$sym;/$sym; # WINDOWS_NO_EXPORT/" lib/librte_eal/*.map;
>   done
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---
+1 to the idea, this is great to see.

>  MAINTAINERS                        |   1 -
>  buildtools/map_to_win.py           |   8 +-
>  devtools/check-symbol-maps.sh      |  20 --
>  lib/librte_eal/rte_eal_exports.def | 336 -----------------------------
>  lib/librte_eal/version.map         | 136 ++++++------
>  5 files changed, 69 insertions(+), 432 deletions(-)
>  delete mode 100644 lib/librte_eal/rte_eal_exports.def
> 
<snip>  
> -# special case, allow override if an def file already exists alongside map file
> -    override_file = join(dirname(args[1]), basename(args[2]))
> -    if exists(override_file):
> -        with open(override_file) as f_in:
> -            functions = f_in.readlines()
> -

If this is removed, then drivers/common/mlx5/version.map similarly needs to
be annotated so that we can remove rte_common_mlx5_exports.def
David Marchand April 6, 2021, 4:53 p.m. UTC | #3
On Tue, Apr 6, 2021 at 6:51 PM Bruce Richardson
<bruce.richardson@intel.com> wrote:
> > -# special case, allow override if an def file already exists alongside map file
> > -    override_file = join(dirname(args[1]), basename(args[2]))
> > -    if exists(override_file):
> > -        with open(override_file) as f_in:
> > -            functions = f_in.readlines()
> > -
>
> If this is removed, then drivers/common/mlx5/version.map similarly needs to
> be annotated so that we can remove rte_common_mlx5_exports.def

Erf, and I thought I had checked...
v2 incoming.
Kinsella, Ray April 7, 2021, 8:06 p.m. UTC | #4
On 06/04/2021 17:50, Bruce Richardson wrote:
> On Tue, Apr 06, 2021 at 06:32:30PM +0200, David Marchand wrote:
>> Rather than have two files that keeps getting out of sync, let's
>> annotate the version.map to generate the Windows export file.
>>
>> Note: EAL version.map annotation achieved with:
>> $ ./buildtools/map-list-symbol.sh lib/librte_eal/version.map |
>>   while read file version sym; do
>>     ! git grep -qw $sym lib/librte_eal/*.def || continue;
>>     sed -i -e "s/$sym;/$sym; # WINDOWS_NO_EXPORT/" lib/librte_eal/*.map;
>>   done
>>
>> Signed-off-by: David Marchand <david.marchand@redhat.com>
>> ---
> +1 to the idea, this is great to see.

+1 agreed.
> 
>>  MAINTAINERS                        |   1 -
>>  buildtools/map_to_win.py           |   8 +-
>>  devtools/check-symbol-maps.sh      |  20 --
>>  lib/librte_eal/rte_eal_exports.def | 336 -----------------------------
>>  lib/librte_eal/version.map         | 136 ++++++------
>>  5 files changed, 69 insertions(+), 432 deletions(-)
>>  delete mode 100644 lib/librte_eal/rte_eal_exports.def
>>
> <snip>  
>> -# special case, allow override if an def file already exists alongside map file
>> -    override_file = join(dirname(args[1]), basename(args[2]))
>> -    if exists(override_file):
>> -        with open(override_file) as f_in:
>> -            functions = f_in.readlines()
>> -
> 
> If this is removed, then drivers/common/mlx5/version.map similarly needs to
> be annotated so that we can remove rte_common_mlx5_exports.def
>
diff mbox series

Patch

diff --git a/MAINTAINERS b/MAINTAINERS
index 0ec5588540..f2d600d0cf 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -333,7 +333,6 @@  M: Narcisa Ana Maria Vasile <navasile@linux.microsoft.com>
 M: Dmitry Malloy <dmitrym@microsoft.com>
 M: Pallavi Kadam <pallavi.kadam@intel.com>
 F: lib/librte_eal/windows/
-F: lib/librte_eal/rte_eal_exports.def
 F: buildtools/map_to_win.py
 F: doc/guides/windows_gsg/
 
diff --git a/buildtools/map_to_win.py b/buildtools/map_to_win.py
index 2a6cb88605..34434d96fa 100644
--- a/buildtools/map_to_win.py
+++ b/buildtools/map_to_win.py
@@ -7,7 +7,7 @@ 
 
 
 def is_function_line(ln):
-    return ln.startswith('\t') and ln.endswith(';\n') and ":" not in ln
+    return ln.startswith('\t') and ln.endswith(';\n') and ":" not in ln and "# WINDOWS_NO_EXPORT" not in ln
 
 # MinGW keeps the original .map file but replaces per_lcore* to __emutls_v.per_lcore*
 def create_mingw_map_file(input_map, output_map):
@@ -24,12 +24,6 @@  def main(args):
         create_mingw_map_file(args[1], args[2])
         return 0
 
-# special case, allow override if an def file already exists alongside map file
-    override_file = join(dirname(args[1]), basename(args[2]))
-    if exists(override_file):
-        with open(override_file) as f_in:
-            functions = f_in.readlines()
-
 # generate def file from map file.
 # This works taking indented lines only which end with a ";" and which don't
 # have a colon in them, i.e. the lines defining functions only.
diff --git a/devtools/check-symbol-maps.sh b/devtools/check-symbol-maps.sh
index c3cbcaf720..b9e1e18456 100755
--- a/devtools/check-symbol-maps.sh
+++ b/devtools/check-symbol-maps.sh
@@ -35,24 +35,4 @@  if [ -n "$orphan_symbols" ] ; then
     ret=1
 fi
 
-find_orphan_windows_symbols ()
-{
-    for def in $(find lib drivers -name '*_exports.def') ; do
-        if echo $def | grep -q 'common_mlx5' ; then
-            continue # mlx5 exports different symbols per OS
-        fi
-        map=$(dirname $def)/version.map
-        for sym in $(grep -v ^EXPORTS $def); do
-            grep -q $sym $map || echo $sym
-        done
-    done
-}
-
-orphan_windows_symbols=$(find_orphan_windows_symbols)
-if [ -n "$orphan_windows_symbols" ] ; then
-    echo "Found only in Windows export file:"
-    echo "$orphan_windows_symbols" | sed 's,^,\t,'
-    ret=1
-fi
-
 exit $ret
diff --git a/lib/librte_eal/rte_eal_exports.def b/lib/librte_eal/rte_eal_exports.def
deleted file mode 100644
index c320077547..0000000000
--- a/lib/librte_eal/rte_eal_exports.def
+++ /dev/null
@@ -1,336 +0,0 @@ 
-EXPORTS
-	__rte_panic
-	per_lcore__lcore_id
-	per_lcore__rte_errno
-	per_lcore__thread_id
-	rte_bus_dump
-	rte_bus_find
-	rte_bus_find_by_device
-	rte_bus_find_by_name
-	rte_bus_get_iommu_class
-	rte_bus_probe
-	rte_bus_register
-	rte_bus_scan
-	rte_bus_unregister
-	rte_calloc
-	rte_calloc_socket
-	rte_cpu_get_flag_enabled
-	rte_cpu_get_flag_name
-	rte_ctrl_thread_create
-	rte_delay_us
-	rte_delay_us_block
-	rte_delay_us_callback_register
-	rte_dev_is_probed
-	rte_dev_probe
-	rte_dev_remove
-	rte_devargs_add
-	rte_devargs_dump
-	rte_devargs_insert
-	rte_devargs_next
-	rte_devargs_parse
-	rte_devargs_parsef
-	rte_devargs_remove
-	rte_devargs_type_count
-	rte_dump_physmem_layout
-	rte_dump_stack
-	rte_dump_tailq
-	rte_eal_alarm_cancel
-	rte_eal_alarm_set
-	rte_eal_cleanup
-	rte_eal_get_lcore_state
-	rte_eal_get_physmem_size
-	rte_eal_get_runtime_dir
-	rte_eal_has_hugepages
-	rte_eal_has_pci
-	rte_eal_hotplug_add
-	rte_eal_hotplug_remove
-	rte_eal_init
-	rte_eal_iova_mode
-	rte_eal_lcore_role
-	rte_eal_mbuf_user_pool_ops
-	rte_eal_mp_remote_launch
-	rte_eal_mp_wait_lcore
-	rte_eal_process_type
-	rte_eal_remote_launch
-	rte_eal_tailq_lookup
-	rte_eal_tailq_register
-	rte_eal_using_phys_addrs
-	rte_eal_wait_lcore
-	rte_epoll_ctl
-	rte_epoll_wait
-	rte_exit
-	rte_free
-	rte_get_main_lcore
-	rte_get_next_lcore
-	rte_get_tsc_hz
-	rte_hexdump
-	rte_hypervisor_get
-	rte_intr_allow_others
-	rte_intr_callback_register
-	rte_intr_callback_unregister
-	rte_intr_cap_multiple
-	rte_intr_disable
-	rte_intr_dp_is_en
-	rte_intr_efd_disable
-	rte_intr_efd_enable
-	rte_intr_enable
-	rte_intr_free_epoll_fd
-	rte_intr_rx_ctl
-	rte_intr_tls_epfd
-	rte_lcore_count
-	rte_lcore_has_role
-	rte_lcore_index
-	rte_lcore_is_enabled
-	rte_lcore_to_socket_id
-	rte_log
-	rte_log_cur_msg_loglevel
-	rte_log_cur_msg_logtype
-	rte_log_dump
-	rte_log_get_global_level
-	rte_log_get_level
-	rte_log_get_stream
-	rte_log_register
-	rte_log_set_global_level
-	rte_log_set_level
-	rte_log_set_level_pattern
-	rte_log_set_level_regexp
-	rte_malloc
-	rte_malloc_dump_stats
-	rte_malloc_get_socket_stats
-	rte_malloc_set_limit
-	rte_malloc_socket
-	rte_malloc_validate
-	rte_malloc_virt2iova
-	rte_mcfg_mem_read_lock
-	rte_mcfg_mem_read_unlock
-	rte_mcfg_mem_write_lock
-	rte_mcfg_mem_write_unlock
-	rte_mcfg_mempool_read_lock
-	rte_mcfg_mempool_read_unlock
-	rte_mcfg_mempool_write_lock
-	rte_mcfg_mempool_write_unlock
-	rte_mcfg_tailq_read_lock
-	rte_mcfg_tailq_read_unlock
-	rte_mcfg_tailq_write_lock
-	rte_mcfg_tailq_write_unlock
-	rte_mem_lock_page
-	rte_mem_virt2iova
-	rte_mem_virt2phy
-	rte_memdump
-	rte_memory_get_nchannel
-	rte_memory_get_nrank
-	rte_memzone_dump
-	rte_memzone_free
-	rte_memzone_lookup
-	rte_memzone_reserve
-	rte_memzone_reserve_aligned
-	rte_memzone_reserve_bounded
-	rte_memzone_walk
-	rte_openlog_stream
-	rte_rand
-	rte_realloc
-	rte_reciprocal_value
-	rte_reciprocal_value_u64
-	rte_rtm_supported
-	rte_service_attr_get
-	rte_service_attr_reset_all
-	rte_service_component_register
-	rte_service_component_runstate_set
-	rte_service_component_unregister
-	rte_service_dump
-	rte_service_finalize
-	rte_service_get_by_name
-	rte_service_get_count
-	rte_service_get_name
-	rte_service_lcore_add
-	rte_service_lcore_attr_get
-	rte_service_lcore_attr_reset_all
-	rte_service_lcore_count
-	rte_service_lcore_count_services
-	rte_service_lcore_del
-	rte_service_lcore_list
-	rte_service_lcore_reset_all
-	rte_service_lcore_start
-	rte_service_lcore_stop
-	rte_service_map_lcore_get
-	rte_service_map_lcore_set
-	rte_service_may_be_active
-	rte_service_probe_capability
-	rte_service_run_iter_on_app_lcore
-	rte_service_runstate_get
-	rte_service_runstate_set
-	rte_service_set_runstate_mapped_check
-	rte_service_set_stats_enable
-	rte_service_start_with_defaults
-	rte_set_application_usage_hook
-	rte_socket_count
-	rte_socket_id
-	rte_socket_id_by_idx
-	rte_strerror
-	rte_strscpy
-	rte_strsplit
-	rte_sys_gettid
-	rte_thread_get_affinity
-	rte_thread_set_affinity
-	rte_thread_setname
-	rte_vfio_container_dma_map
-	rte_vfio_container_dma_unmap
-	rte_vlog
-	rte_zmalloc
-	rte_zmalloc_socket
-
-	rte_mp_action_register
-	rte_mp_action_unregister
-	rte_mp_reply
-	rte_mp_sendmsg
-
-	rte_dev_event_callback_register
-	rte_dev_event_callback_unregister
-	rte_fbarray_attach
-	rte_fbarray_destroy
-	rte_fbarray_detach
-	rte_fbarray_dump_metadata
-	rte_fbarray_find_contig_free
-	rte_fbarray_find_contig_used
-	rte_fbarray_find_idx
-	rte_fbarray_find_next_free
-	rte_fbarray_find_next_n_free
-	rte_fbarray_find_next_n_used
-	rte_fbarray_find_next_used
-	rte_fbarray_get
-	rte_fbarray_init
-	rte_fbarray_is_used
-	rte_fbarray_set_free
-	rte_fbarray_set_used
-	rte_log_register_type_and_pick_level
-	rte_malloc_dump_heaps
-	rte_mem_alloc_validator_register
-	rte_mem_alloc_validator_unregister
-	rte_mem_check_dma_mask
-	rte_mem_event_callback_register
-	rte_mem_event_callback_unregister
-	rte_mem_iova2virt
-	rte_mem_virt2memseg
-	rte_mem_virt2memseg_list
-	rte_memseg_contig_walk
-	rte_memseg_list_walk
-	rte_memseg_walk
-	rte_mp_request_async
-	rte_mp_request_sync
-
-	rte_class_find
-	rte_class_find_by_name
-	rte_class_register
-	rte_class_unregister
-	rte_dev_iterator_init
-	rte_dev_iterator_next
-	rte_fbarray_find_prev_free
-	rte_fbarray_find_prev_n_free
-	rte_fbarray_find_prev_n_used
-	rte_fbarray_find_prev_used
-	rte_fbarray_find_rev_contig_free
-	rte_fbarray_find_rev_contig_used
-	rte_memseg_contig_walk_thread_unsafe
-	rte_memseg_list_walk_thread_unsafe
-	rte_memseg_walk_thread_unsafe
-
-	rte_delay_us_sleep
-	rte_dev_event_callback_process
-	rte_malloc_heap_create
-	rte_malloc_heap_destroy
-	rte_malloc_heap_get_socket
-	rte_malloc_heap_memory_add
-	rte_malloc_heap_memory_attach
-	rte_malloc_heap_memory_detach
-	rte_malloc_heap_memory_remove
-	rte_malloc_heap_socket_is_external
-	rte_mem_check_dma_mask_thread_unsafe
-	rte_mem_set_dma_mask
-	rte_memseg_get_fd
-	rte_memseg_get_fd_offset
-	rte_memseg_get_fd_offset_thread_unsafe
-	rte_memseg_get_fd_thread_unsafe
-
-	rte_extmem_attach
-	rte_extmem_detach
-	rte_extmem_register
-	rte_extmem_unregister
-
-	rte_dev_dma_map
-	rte_dev_dma_unmap
-	rte_fbarray_find_biggest_free
-	rte_fbarray_find_biggest_used
-	rte_fbarray_find_rev_biggest_free
-	rte_fbarray_find_rev_biggest_used
-	rte_intr_callback_unregister_pending
-	rte_realloc_socket
-
-	rte_intr_ack
-	rte_lcore_cpuset
-	rte_lcore_to_cpu_id
-	rte_mcfg_timer_lock
-	rte_mcfg_timer_unlock
-	rte_mcfg_get_single_file_segments
-
-	rte_thread_is_intr
-
-	__rte_eal_trace_alarm_cancel
-	__rte_eal_trace_alarm_set
-	__rte_eal_trace_generic_double
-	__rte_eal_trace_generic_float
-	__rte_eal_trace_generic_func
-	__rte_eal_trace_generic_i16
-	__rte_eal_trace_generic_i32
-	__rte_eal_trace_generic_i64
-	__rte_eal_trace_generic_i8
-	__rte_eal_trace_generic_int
-	__rte_eal_trace_generic_long
-	__rte_eal_trace_generic_ptr
-	__rte_eal_trace_generic_str
-	__rte_eal_trace_generic_u16
-	__rte_eal_trace_generic_u32
-	__rte_eal_trace_generic_u64
-	__rte_eal_trace_generic_u8
-	__rte_eal_trace_generic_void
-	__rte_eal_trace_intr_callback_register
-	__rte_eal_trace_intr_callback_unregister
-	__rte_eal_trace_intr_enable
-	__rte_eal_trace_intr_disable
-	__rte_eal_trace_mem_free
-	__rte_eal_trace_mem_malloc
-	__rte_eal_trace_mem_realloc
-	__rte_eal_trace_mem_zmalloc
-	__rte_eal_trace_memzone_free
-	__rte_eal_trace_memzone_lookup
-	__rte_eal_trace_memzone_reserve
-	__rte_eal_trace_thread_lcore_ready
-	__rte_eal_trace_thread_remote_launch
-	__rte_trace_mem_per_thread_alloc
-	__rte_trace_point_emit_field
-	__rte_trace_point_register
-	per_lcore_trace_mem
-	per_lcore_trace_point_sz
-	rte_log_can_log
-
-	rte_lcore_callback_register
-	rte_lcore_callback_unregister
-	rte_lcore_dump
-	rte_lcore_iterate
-	rte_mp_disable
-	rte_service_lcore_may_be_active
-	rte_thread_register
-	rte_thread_unregister
-
-	rte_epoll_wait_interruptible
-	rte_vect_get_max_simd_bitwidth
-	rte_vect_set_max_simd_bitwidth
-
-	rte_thread_key_create
-	rte_thread_key_delete
-	rte_thread_value_get
-	rte_thread_value_set
-
-	rte_mem_lock
-	rte_mem_map
-	rte_mem_page_size
-	rte_mem_unmap
diff --git a/lib/librte_eal/version.map b/lib/librte_eal/version.map
index e23745ae6e..151330b1b5 100644
--- a/lib/librte_eal/version.map
+++ b/lib/librte_eal/version.map
@@ -2,8 +2,8 @@  DPDK_21 {
 	global:
 
 	__rte_panic;
-	eal_parse_sysfs_value;
-	eal_timer_source;
+	eal_parse_sysfs_value; # WINDOWS_NO_EXPORT
+	eal_timer_source; # WINDOWS_NO_EXPORT
 	per_lcore__lcore_id;
 	per_lcore__rte_errno;
 	per_lcore__thread_id;
@@ -20,9 +20,9 @@  DPDK_21 {
 	rte_calloc_socket;
 	rte_cpu_get_flag_enabled;
 	rte_cpu_get_flag_name;
-	rte_cpu_is_supported;
+	rte_cpu_is_supported; # WINDOWS_NO_EXPORT
 	rte_ctrl_thread_create;
-	rte_cycles_vmware_tsc_map;
+	rte_cycles_vmware_tsc_map; # WINDOWS_NO_EXPORT
 	rte_delay_us;
 	rte_delay_us_block;
 	rte_delay_us_callback_register;
@@ -43,7 +43,7 @@  DPDK_21 {
 	rte_eal_alarm_cancel;
 	rte_eal_alarm_set;
 	rte_eal_cleanup;
-	rte_eal_create_uio_dev;
+	rte_eal_create_uio_dev; # WINDOWS_NO_EXPORT
 	rte_eal_get_lcore_state;
 	rte_eal_get_physmem_size;
 	rte_eal_get_runtime_dir;
@@ -51,34 +51,34 @@  DPDK_21 {
 	rte_eal_has_pci;
 	rte_eal_hotplug_add;
 	rte_eal_hotplug_remove;
-	rte_eal_hpet_init;
+	rte_eal_hpet_init; # WINDOWS_NO_EXPORT
 	rte_eal_init;
-	rte_eal_iopl_init;
+	rte_eal_iopl_init; # WINDOWS_NO_EXPORT
 	rte_eal_iova_mode;
 	rte_eal_lcore_role;
 	rte_eal_mbuf_user_pool_ops;
 	rte_eal_mp_remote_launch;
 	rte_eal_mp_wait_lcore;
-	rte_eal_primary_proc_alive;
+	rte_eal_primary_proc_alive; # WINDOWS_NO_EXPORT
 	rte_eal_process_type;
 	rte_eal_remote_launch;
 	rte_eal_tailq_lookup;
 	rte_eal_tailq_register;
 	rte_eal_using_phys_addrs;
-	rte_eal_vfio_intr_mode;
+	rte_eal_vfio_intr_mode; # WINDOWS_NO_EXPORT
 	rte_eal_wait_lcore;
 	rte_epoll_ctl;
 	rte_epoll_wait;
 	rte_exit;
 	rte_free;
-	rte_get_hpet_cycles;
-	rte_get_hpet_hz;
+	rte_get_hpet_cycles; # WINDOWS_NO_EXPORT
+	rte_get_hpet_hz; # WINDOWS_NO_EXPORT
 	rte_get_main_lcore;
 	rte_get_next_lcore;
 	rte_get_tsc_hz;
 	rte_hexdump;
 	rte_hypervisor_get;
-	rte_hypervisor_get_name;
+	rte_hypervisor_get_name; # WINDOWS_NO_EXPORT
 	rte_intr_allow_others;
 	rte_intr_callback_register;
 	rte_intr_callback_unregister;
@@ -91,12 +91,12 @@  DPDK_21 {
 	rte_intr_free_epoll_fd;
 	rte_intr_rx_ctl;
 	rte_intr_tls_epfd;
-	rte_keepalive_create;
-	rte_keepalive_dispatch_pings;
-	rte_keepalive_mark_alive;
-	rte_keepalive_mark_sleep;
-	rte_keepalive_register_core;
-	rte_keepalive_register_relay_callback;
+	rte_keepalive_create; # WINDOWS_NO_EXPORT
+	rte_keepalive_dispatch_pings; # WINDOWS_NO_EXPORT
+	rte_keepalive_mark_alive; # WINDOWS_NO_EXPORT
+	rte_keepalive_mark_sleep; # WINDOWS_NO_EXPORT
+	rte_keepalive_register_core; # WINDOWS_NO_EXPORT
+	rte_keepalive_register_relay_callback; # WINDOWS_NO_EXPORT
 	rte_lcore_count;
 	rte_lcore_has_role;
 	rte_lcore_index;
@@ -159,7 +159,7 @@  DPDK_21 {
 	rte_service_component_unregister;
 	rte_service_dump;
 	rte_service_finalize;
-	rte_service_get_by_id;
+	rte_service_get_by_id; # WINDOWS_NO_EXPORT
 	rte_service_get_by_name;
 	rte_service_get_count;
 	rte_service_get_name;
@@ -187,7 +187,7 @@  DPDK_21 {
 	rte_socket_count;
 	rte_socket_id;
 	rte_socket_id_by_idx;
-	rte_srand;
+	rte_srand; # WINDOWS_NO_EXPORT
 	rte_strerror;
 	rte_strscpy;
 	rte_strsplit;
@@ -195,26 +195,26 @@  DPDK_21 {
 	rte_thread_get_affinity;
 	rte_thread_set_affinity;
 	rte_thread_setname;
-	rte_uuid_compare;
-	rte_uuid_is_null;
-	rte_uuid_parse;
-	rte_uuid_unparse;
-	rte_version;
-	rte_vfio_clear_group;
-	rte_vfio_container_create;
-	rte_vfio_container_destroy;
+	rte_uuid_compare; # WINDOWS_NO_EXPORT
+	rte_uuid_is_null; # WINDOWS_NO_EXPORT
+	rte_uuid_parse; # WINDOWS_NO_EXPORT
+	rte_uuid_unparse; # WINDOWS_NO_EXPORT
+	rte_version; # WINDOWS_NO_EXPORT
+	rte_vfio_clear_group; # WINDOWS_NO_EXPORT
+	rte_vfio_container_create; # WINDOWS_NO_EXPORT
+	rte_vfio_container_destroy; # WINDOWS_NO_EXPORT
 	rte_vfio_container_dma_map;
 	rte_vfio_container_dma_unmap;
-	rte_vfio_container_group_bind;
-	rte_vfio_container_group_unbind;
-	rte_vfio_enable;
-	rte_vfio_get_container_fd;
-	rte_vfio_get_group_fd;
-	rte_vfio_get_group_num;
-	rte_vfio_is_enabled;
-	rte_vfio_noiommu_is_enabled;
-	rte_vfio_release_device;
-	rte_vfio_setup_device;
+	rte_vfio_container_group_bind; # WINDOWS_NO_EXPORT
+	rte_vfio_container_group_unbind; # WINDOWS_NO_EXPORT
+	rte_vfio_enable; # WINDOWS_NO_EXPORT
+	rte_vfio_get_container_fd; # WINDOWS_NO_EXPORT
+	rte_vfio_get_group_fd; # WINDOWS_NO_EXPORT
+	rte_vfio_get_group_num; # WINDOWS_NO_EXPORT
+	rte_vfio_is_enabled; # WINDOWS_NO_EXPORT
+	rte_vfio_noiommu_is_enabled; # WINDOWS_NO_EXPORT
+	rte_vfio_release_device; # WINDOWS_NO_EXPORT
+	rte_vfio_setup_device; # WINDOWS_NO_EXPORT
 	rte_vlog;
 	rte_zmalloc;
 	rte_zmalloc_socket;
@@ -234,8 +234,8 @@  EXPERIMENTAL {
 	# added in 18.05
 	rte_dev_event_callback_register;
 	rte_dev_event_callback_unregister;
-	rte_dev_event_monitor_start;
-	rte_dev_event_monitor_stop;
+	rte_dev_event_monitor_start; # WINDOWS_NO_EXPORT
+	rte_dev_event_monitor_stop; # WINDOWS_NO_EXPORT
 	rte_fbarray_attach;
 	rte_fbarray_destroy;
 	rte_fbarray_detach;
@@ -288,8 +288,8 @@  EXPERIMENTAL {
 	# added in 18.11
 	rte_delay_us_sleep;
 	rte_dev_event_callback_process;
-	rte_dev_hotplug_handle_disable;
-	rte_dev_hotplug_handle_enable;
+	rte_dev_hotplug_handle_disable; # WINDOWS_NO_EXPORT
+	rte_dev_hotplug_handle_enable; # WINDOWS_NO_EXPORT
 	rte_malloc_heap_create;
 	rte_malloc_heap_destroy;
 	rte_malloc_heap_get_socket;
@@ -327,7 +327,7 @@  EXPERIMENTAL {
 	rte_lcore_to_cpu_id;
 	rte_mcfg_timer_lock;
 	rte_mcfg_timer_unlock;
-	rte_rand_max;
+	rte_rand_max; # WINDOWS_NO_EXPORT
 
 	# added in 19.11
 	rte_mcfg_get_single_file_segments;
@@ -373,22 +373,22 @@  EXPERIMENTAL {
 	per_lcore_trace_mem;
 	per_lcore_trace_point_sz;
 	rte_log_can_log;
-	rte_thread_getname;
-	rte_trace_dump;
-	rte_trace_is_enabled;
-	rte_trace_metadata_dump;
-	rte_trace_mode_get;
-	rte_trace_mode_set;
-	rte_trace_pattern;
-	rte_trace_point_disable;
-	rte_trace_point_enable;
-	rte_trace_point_is_enabled;
-	rte_trace_point_lookup;
-	rte_trace_regexp;
-	rte_trace_save;
+	rte_thread_getname; # WINDOWS_NO_EXPORT
+	rte_trace_dump; # WINDOWS_NO_EXPORT
+	rte_trace_is_enabled; # WINDOWS_NO_EXPORT
+	rte_trace_metadata_dump; # WINDOWS_NO_EXPORT
+	rte_trace_mode_get; # WINDOWS_NO_EXPORT
+	rte_trace_mode_set; # WINDOWS_NO_EXPORT
+	rte_trace_pattern; # WINDOWS_NO_EXPORT
+	rte_trace_point_disable; # WINDOWS_NO_EXPORT
+	rte_trace_point_enable; # WINDOWS_NO_EXPORT
+	rte_trace_point_is_enabled; # WINDOWS_NO_EXPORT
+	rte_trace_point_lookup; # WINDOWS_NO_EXPORT
+	rte_trace_regexp; # WINDOWS_NO_EXPORT
+	rte_trace_save; # WINDOWS_NO_EXPORT
 
 	# added in 20.08
-	rte_eal_vfio_get_vf_token;
+	rte_eal_vfio_get_vf_token; # WINDOWS_NO_EXPORT
 	rte_lcore_callback_register;
 	rte_lcore_callback_unregister;
 	rte_lcore_dump;
@@ -398,29 +398,29 @@  EXPERIMENTAL {
 	rte_thread_unregister;
 
 	# added in 20.11
-	__rte_eal_trace_generic_size_t;
-	rte_cpu_get_intrinsics_support;
+	__rte_eal_trace_generic_size_t; # WINDOWS_NO_EXPORT
+	rte_cpu_get_intrinsics_support; # WINDOWS_NO_EXPORT
 	rte_epoll_wait_interruptible;
 	rte_service_lcore_may_be_active;
 	rte_vect_get_max_simd_bitwidth;
 	rte_vect_set_max_simd_bitwidth;
 
 	# added in 21.02
-	rte_power_monitor;
-	rte_power_monitor_wakeup;
-	rte_power_pause;
+	rte_power_monitor; # WINDOWS_NO_EXPORT
+	rte_power_monitor_wakeup; # WINDOWS_NO_EXPORT
+	rte_power_pause; # WINDOWS_NO_EXPORT
 
 	# added in 21.05
 	rte_thread_key_create;
 	rte_thread_key_delete;
 	rte_thread_value_get;
 	rte_thread_value_set;
-	rte_version_minor;
-	rte_version_month;
-	rte_version_prefix;
-	rte_version_release;
-	rte_version_suffix;
-	rte_version_year;
+	rte_version_minor; # WINDOWS_NO_EXPORT
+	rte_version_month; # WINDOWS_NO_EXPORT
+	rte_version_prefix; # WINDOWS_NO_EXPORT
+	rte_version_release; # WINDOWS_NO_EXPORT
+	rte_version_suffix; # WINDOWS_NO_EXPORT
+	rte_version_year; # WINDOWS_NO_EXPORT
 };
 
 INTERNAL {