mirror of https://github.com/ARMmbed/mbed-os.git
Fix wifi cannot configure as default network interface (#377)
* Fix WiFi link error for as default network interface This fixes WiFi doesn't get linked in when configued as default network interface. * Support WiFi as default network interface This requires support for weak symbol override. Object files arcived in static library don't always participate in linking, dependent on linker and link order. The steps below pull in the override object file anyway even though it comes from static library: 1. Add e.g. GCC linker option "--undefined=<LINK_FOO>" 2. Add <LINK_FOO> function with 'extern "C"' in override source file See: https://stackoverflow.com/questions/42588983/what-does-the-gnu-ld-undefined-option-dopull/15530/head
parent
af80d119c1
commit
197e043d78
|
@ -12,3 +12,15 @@ target_include_directories(mbed-wifi
|
|||
.
|
||||
./ESP8266
|
||||
)
|
||||
|
||||
# Link override object file coming from static library anyway
|
||||
#
|
||||
# NOTE: This linker option is to pretend undefined symbol and won't cause
|
||||
# undefined symbol error even though the override object file actually
|
||||
# doesn't provide such symbol definition.
|
||||
if(${MBED_TOOLCHAIN} STREQUAL "GCC_ARM")
|
||||
target_link_options(mbed-wifi
|
||||
INTERFACE
|
||||
LINKER:--undefined=LINK_ESP8266INTERFACE_CPP
|
||||
)
|
||||
endif()
|
||||
|
|
|
@ -1149,6 +1149,20 @@ WiFiInterface *WiFiInterface::get_default_instance()
|
|||
return &esp;
|
||||
}
|
||||
|
||||
/*
|
||||
* With e.g. GCC linker option "--undefined=<LINK_FOO>", pull in this
|
||||
* object file anyway for being able to override weak symbol successfully
|
||||
* even though from static library. See:
|
||||
* https://stackoverflow.com/questions/42588983/what-does-the-gnu-ld-undefined-option-do
|
||||
*
|
||||
* NOTE: For C++ name mangling, 'extern "C"' is necessary to match the
|
||||
* <LINK_FOO> symbol correctly.
|
||||
*/
|
||||
extern "C"
|
||||
void LINK_ESP8266INTERFACE_CPP(void)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void ESP8266Interface::refresh_conn_state_cb()
|
||||
|
|
|
@ -21,3 +21,15 @@ target_sources(mbed-wifi
|
|||
utils/cydhcp_server_debug.cpp
|
||||
utils/cynetwork_utils.c
|
||||
)
|
||||
|
||||
# Link override object file coming from static library anyway
|
||||
#
|
||||
# NOTE: This linker option is to pretend undefined symbol and won't cause
|
||||
# undefined symbol error even though the override object file actually
|
||||
# doesn't provide such symbol definition.
|
||||
if(${MBED_TOOLCHAIN} STREQUAL "GCC_ARM")
|
||||
target_link_options(mbed-wifi
|
||||
INTERFACE
|
||||
LINKER:--undefined=LINK_WHD_INTERFACE_CPP
|
||||
)
|
||||
endif()
|
||||
|
|
|
@ -32,3 +32,17 @@ WhdSoftAPInterface *WhdSoftAPInterface::get_default_instance()
|
|||
static WhdSoftAPInterface softap;
|
||||
return &softap;
|
||||
}
|
||||
|
||||
/*
|
||||
* With e.g. GCC linker option "--undefined=<LINK_FOO>", pull in this
|
||||
* object file anyway for being able to override weak symbol successfully
|
||||
* even though from static library. See:
|
||||
* https://stackoverflow.com/questions/42588983/what-does-the-gnu-ld-undefined-option-do
|
||||
*
|
||||
* NOTE: For C++ name mangling, 'extern "C"' is necessary to match the
|
||||
* <LINK_FOO> symbol correctly.
|
||||
*/
|
||||
extern "C"
|
||||
void LINK_WHD_INTERFACE_CPP(void)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -21,3 +21,15 @@ target_sources(mbed-wifi
|
|||
mx_wifi/core/mx_wifi_ipc.c
|
||||
mx_wifi/core/mx_wifi_slip.c
|
||||
)
|
||||
|
||||
# Link override object file coming from static library anyway
|
||||
#
|
||||
# NOTE: This linker option is to pretend undefined symbol and won't cause
|
||||
# undefined symbol error even though the override object file actually
|
||||
# doesn't provide such symbol definition.
|
||||
if(${MBED_TOOLCHAIN} STREQUAL "GCC_ARM")
|
||||
target_link_options(mbed-wifi
|
||||
INTERFACE
|
||||
LINKER:--undefined=LINK_EMW3080BINTERFACE_CPP
|
||||
)
|
||||
endif()
|
||||
|
|
|
@ -365,3 +365,19 @@ WiFiInterface *WiFiInterface::get_target_default_instance()
|
|||
return &wifi;
|
||||
}
|
||||
#endif /* MBED_CONF_NSAPI_PRESENT */
|
||||
|
||||
#if MBED_CONF_EMW3080B_PROVIDE_DEFAULT || defined(MBED_CONF_NSAPI_PRESENT)
|
||||
/*
|
||||
* With e.g. GCC linker option "--undefined=<LINK_FOO>", pull in this
|
||||
* object file anyway for being able to override weak symbol successfully
|
||||
* even though from static library. See:
|
||||
* https://stackoverflow.com/questions/42588983/what-does-the-gnu-ld-undefined-option-do
|
||||
*
|
||||
* NOTE: For C++ name mangling, 'extern "C"' is necessary to match the
|
||||
* <LINK_FOO> symbol correctly.
|
||||
*/
|
||||
extern "C"
|
||||
void LINK_EMW3080BINTERFACE_CPP(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -23,4 +23,16 @@ target_sources(mbed-wiced
|
|||
wiced_interface/default_wifi_interface.cpp
|
||||
)
|
||||
|
||||
target_link_libraries(mbed-wifi PUBLIC mbed-wiced)
|
||||
target_link_libraries(mbed-wifi PUBLIC mbed-wiced)
|
||||
|
||||
# Link override object file coming from static library anyway
|
||||
#
|
||||
# NOTE: This linker option is to pretend undefined symbol and won't cause
|
||||
# undefined symbol error even though the override object file actually
|
||||
# doesn't provide such symbol definition.
|
||||
if(${MBED_TOOLCHAIN} STREQUAL "GCC_ARM")
|
||||
target_link_options(mbed-wifi
|
||||
INTERFACE
|
||||
LINKER:--undefined=LINK_DEFAULT_WIFI_INTERFACE_CPP
|
||||
)
|
||||
endif()
|
||||
|
|
|
@ -25,4 +25,18 @@ WiFiInterface *WiFiInterface::get_target_default_instance()
|
|||
return &wifi;
|
||||
}
|
||||
|
||||
/*
|
||||
* With e.g. GCC linker option "--undefined=<LINK_FOO>", pull in this
|
||||
* object file anyway for being able to override weak symbol successfully
|
||||
* even though from static library. See:
|
||||
* https://stackoverflow.com/questions/42588983/what-does-the-gnu-ld-undefined-option-do
|
||||
*
|
||||
* NOTE: For C++ name mangling, 'extern "C"' is necessary to match the
|
||||
* <LINK_FOO> symbol correctly.
|
||||
*/
|
||||
extern "C"
|
||||
void LINK_DEFAULT_WIFI_INTERFACE_CPP(void)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -74,6 +74,12 @@ if("MBED_CONF_TARGET_NETWORK_DEFAULT_INTERFACE_TYPE=MESH" IN_LIST MBED_CONFIG_DE
|
|||
target_link_libraries(mbed-netsocket-api PUBLIC mbed-nanostack-mbed_mesh_api)
|
||||
endif()
|
||||
|
||||
# Similarly if wifi networking is used bring in that library
|
||||
if("MBED_CONF_TARGET_NETWORK_DEFAULT_INTERFACE_TYPE=WIFI" IN_LIST MBED_CONFIG_DEFINITIONS)
|
||||
if(TARGET mbed-wifi)
|
||||
target_link_libraries(mbed-netsocket-api PUBLIC mbed-wifi)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if("DEVICE_EMAC=1" IN_LIST MBED_TARGET_DEFINITIONS)
|
||||
target_link_libraries(mbed-netsocket-api
|
||||
|
|
Loading…
Reference in New Issue