【问题标题】:Undefined reference to _kill, _getpid and _sbrk [duplicate]对 _kill、_getpid 和 _sbrk 的未定义引用 [重复]
【发布时间】:2014-05-04 19:07:44
【问题描述】:

我在这里是因为我无法解决我的问题;事实上,我正在使用 Eclipse CDT C/C++ IDE 中的 arm-none-eabi-gcc 编译器制作一个 C 项目(它用于 STM32 嵌入式卡),并且我已经实现了 PolarSSL 来创建一个 HTTPS 服务器:

我在很多论坛上看到我需要删除printf、malloc、file、path 以避免这个错误(实际上我在一个嵌入式项目中,所以这些功能被禁止了!)。但是即使我删除了所有这些功能,这些错误仍然存​​在!所以现在我不知道如何解决这些错误,请问您能帮帮我吗?

感谢您的帮助。

'Building file: ../.metadata/.plugins/org.eclipse.cdt.make.core/specs.c'
'Invoking: Cross GCC Compiler'
arm-none-eabi-gcc -DARP_CACHE_SIZE=4 -D_kill -D_getpid -D_cert -DUSE_IPV4 -DUSE_IPV6 -DNDP_CACHE_SIZE=4 -DHARDWARE_ETH_TX_CRC -DHARDWARE_ETH_RX_CRC -DUSE_STDPERIPH_DRIVER -DUSE_TCP -DHSE_VALUE=25000000 -DSTM32F2XX -DUSE_MII -I"C:\Sebastien\Sujet_1_ServeurWeb\Projet_1/test_serverweb_v0/src" -I"C:\Sebastien\Sujet_1_ServeurWeb\Projet_1/test_serverweb_v0/src/Library_StackIP/Driver_phyter_f2" -I"C:\Sebastien\Sujet_1_ServeurWeb\Projet_1/test_serverweb_v0/src/stm32f2xx" -I"C:\Sebastien\Sujet_1_ServeurWeb\Projet_1/test_serverweb_v0/src/urts" -I"C:\Sebastien\Sujet_1_ServeurWeb\Projet_1/test_serverweb_v0/src/ethernet" -I"C:\Sebastien\Sujet_1_ServeurWeb\Projet_1/test_serverweb_v0/src/agilia" -I"C:\Sebastien\Sujet_1_ServeurWeb\Projet_1/test_serverweb_v0/src/Service_HttpServeur" -I"C:\Sebastien\Sujet_1_ServeurWeb\Projet_1/test_serverweb_v0/src/Library_StackIP" -I"C:\Sebastien\Sujet_1_ServeurWeb\Projet_1/test_serverweb_v0/src/include/polarssl" -I"C:\Sebastien\Sujet_1_ServeurWeb\Projet_1/test_serverweb_v0/src/include" -I"C:\Sebastien\Sujet_1_ServeurWeb\Projet_1/test_serverweb_v0/src/library" -I"C:\Program Files\AIM\uOne\Tools\eclipse\..\..\CMSIS_V3P00\CMSIS\Include" -I"C:\Program Files\AIM\uOne\Tools\eclipse\..\..\CMSIS_V3P00\Device\ST\STM32F2xx\Include" -I"C:\Program Files\AIM\uOne\Tools\eclipse\..\..\F2\inc" -I"C:\Sebastien\Sujet_1_ServeurWeb\Projet_1\test_serverweb\src\LibrarySSL" -I"C:\Program Files\AIM\uOne\Tools\eclipse\..\..\F2\StdPeriph_Driver\inc" -I"C:\Program Files\AIM\uOne\Tools\eclipse\..\..\F2\STM32_Ethernet\inc" -I"C:\AIM\uOne\F2\inc" -I"C:\AIM\uOne\F2\StdPeriph_Driver\inc" -O2 -g3 -Wall -c -fmessage-length=0 -mthumb -mcpu=cortex-m3 -mfix-cortex-m3-ldrd -mfloat-abi=softfp -fsigned-char -ffunction-sections -fdata-sections -fomit-frame-pointer -MMD -MP -MF".metadata/.plugins/org.eclipse.cdt.make.core/specs.d" -MT".metadata/.plugins/org.eclipse.cdt.make.core/specs.d" -o ".metadata/.plugins/org.eclipse.cdt.make.core/specs.o" "../.metadata/.plugins/org.eclipse.cdt.make.core/specs.c"
'Finished building: ../.metadata/.plugins/org.eclipse.cdt.make.core/specs.c'

'Building target: test_serverweb_v0'
'Invoking: Cross GCC Linker'
arm-none-eabi-gcc -static -L"C:\Program Files\AIM\uOne\Tools\eclipse\..\..\F2\lib" -L"C:\AIM\uOne\F2\lib" -L"C:\Program Files\AIM\uOne\Tools\eclipse\..\..\F2\StdPeriph_Driver\lib" -L"C:\Program Files\AIM\uOne\Tools\eclipse\..\..\F2\STM32_Ethernet\lib" -L"C:\AIM\uOne\F2\STM32_Ethernet\lib" -L"C:\AIM\uOne\F2\StdPeriph_Driver\lib" -mthumb -mcpu=cortex-m3 -fsigned-char -ffunction-sections -fdata-sections -Wl,-T,../ldscripts/flash.ld,-Map,Debug.map,--gc-sections -o "test_serverweb_v0"  ./src/urts/urts_init.o  ./src/stm32f2xx/startup_stm32f2xx.o ./src/stm32f2xx/system_stm32f2xx.o  ./src/library/aes.o ./src/library/aesni.o ./src/library/arc4.o ./src/library/asn1parse.o ./src/library/asn1write.o ./src/library/base64.o ./src/library/bignum.o ./src/library/blowfish.o ./src/library/camellia.o ./src/library/certs.o ./src/library/cipher.o ./src/library/cipher_wrap.o ./src/library/ctr_drbg.o ./src/library/debug.o ./src/library/des.o ./src/library/dhm.o ./src/library/ecdh.o ./src/library/ecdsa.o ./src/library/ecp.o ./src/library/ecp_curves.o ./src/library/entropy.o ./src/library/entropy_poll.o ./src/library/error.o ./src/library/gcm.o ./src/library/havege.o ./src/library/md.o ./src/library/md2.o ./src/library/md4.o ./src/library/md5.o ./src/library/md_wrap.o ./src/library/memory.o ./src/library/memory_buffer_alloc.o ./src/library/net.o ./src/library/oid.o ./src/library/padlock.o ./src/library/pbkdf2.o ./src/library/pem.o ./src/library/pk.o ./src/library/pk_wrap.o ./src/library/pkcs11.o ./src/library/pkcs12.o ./src/library/pkcs5.o ./src/library/pkparse.o ./src/library/pkwrite.o ./src/library/ripemd160.o ./src/library/rsa.o ./src/library/sha1.o ./src/library/sha256.o ./src/library/sha512.o ./src/library/ssl_cache.o ./src/library/ssl_ciphersuites.o ./src/library/ssl_cli.o ./src/library/ssl_srv.o ./src/library/ssl_tls.o ./src/library/threading.o ./src/library/timing.o ./src/library/version.o ./src/library/x509.o ./src/library/x509_create.o ./src/library/x509_crl.o ./src/library/x509_crt.o ./src/library/x509_csr.o ./src/library/x509write_crt.o ./src/library/x509write_csr.o ./src/library/xtea.o  ./src/agilia/agilia_VC.o ./src/agilia/agilia_VS.o ./src/agilia/agilia_init_uRTS.o ./src/agilia/agilia_login_sha1.o ./src/agilia/agilia_moteur_info.o ./src/agilia/agilia_targetId.o ./src/agilia/agilia_xbin_mem.o  ./src/Service_HttpServeur/AFS.o ./src/Service_HttpServeur/AgiliaGV.o ./src/Service_HttpServeur/Base64.o ./src/Service_HttpServeur/HtmlPage.o ./src/Service_HttpServeur/HtmlPageDynamic.o ./src/Service_HttpServeur/Http.o ./src/Service_HttpServeur/HttpServer.o ./src/Service_HttpServeur/HttpUsers.o ./src/Service_HttpServeur/MoteurHTTP.o ./src/Service_HttpServeur/StdAfx.o ./src/Service_HttpServeur/UTF8.o ./src/Service_HttpServeur/WebSite.o ./src/Service_HttpServeur/divers.o ./src/Service_HttpServeur/httpd.o ./src/Service_HttpServeur/mime.o ./src/Service_HttpServeur/sgf_sdcard.o  ./src/Library_StackIP/Driver_phyter_f2/drv_buffer.o ./src/Library_StackIP/Driver_phyter_f2/drv_mac.o ./src/Library_StackIP/Driver_phyter_f2/drv_phyter_f2.o ./src/Library_StackIP/Driver_phyter_f2/drv_stats.o  ./src/Library_StackIP/arp.o ./src/Library_StackIP/hntonh.o ./src/Library_StackIP/icmp.o ./src/Library_StackIP/icmpv6.o ./src/Library_StackIP/interface_ethernet.o ./src/Library_StackIP/ipv4.o ./src/Library_StackIP/ipv6.o ./src/Library_StackIP/sck_api.o ./src/Library_StackIP/tcp.o ./src/Library_StackIP/udp.o  ./src/config_user.o ./src/ethernet_init.o ./src/hardware_init.o ./src/main.o ./src/peripherals_config.o ./src/ressources.o ./src/ssl_init_uRTS.o ./src/systickDelay.o ./src/timer_uRTS.o  ./.metadata/.plugins/org.eclipse.cdt.make.core/specs.o    -lservice_strformat -lagcomethernet -ltest_syscalls_v2 -lagcore -lagstr -lagtrycatch -lagvariables -lcrc16_soft -lcrc32_f2 -lsha1_soft -lagmetadebug -lflash_f2 -ldrv_phyter_f2 -lservice_horodateur -lservice_httpServeur -lservice_socket -lservice_STM32 -lsysirq -lsysrtc_f2 -lurts -lurtscore -ltrap12 -ltrap12core -lsystime -lsystick -lstm32_stdperiph_driver -lstm32_ethernet -lRessources
c:/program files/aim/uone/tools/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libc.a(lib_a-signalr.o): In function `_kill_r':
signalr.c:(.text._kill_r+0xe): undefined reference to `_kill'
c:/program files/aim/uone/tools/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libc.a(lib_a-signalr.o): In function `_getpid_r':
signalr.c:(.text._getpid_r+0x0): undefined reference to `_getpid'
c:/program files/aim/uone/tools/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'
collect2: ld returned 1 exit status
aim-make: *** [test_serverweb_v0] Error 1

**** Build Finished ****

【问题讨论】:

  • 平台是否有操作系统,或者您的应用程序是否旨在“独立”?
  • 感谢您的回答。我不是在命令行上编译:我在 Windows 中,我使用 eclipse 环境。 stm32 卡没有我刚才说的操作系统!所以我们可以说我的应用程序是“独立的”!所以这些操作系统功能对我来说没用......但我不能更容易地将它们分开......
  • 错误信息是纯文本 - 为什么要发图!?
  • 你需要弄清楚这些函数在哪里被引用——这在错误消息中应该很清楚,但如果不是递归 grep 是你的朋友。如果它们在您构建但从未使用的库代码中被引用,也许您需要一个“-Wl,--gc-sections”构建标志来使链接器修剪未使用的代码。
  • 对不起,克利福德,我的意思是:在 Eclipse 中提供这些错误消息的屏幕副本!我在这里写了 3 条错误消息:

标签: c embedded stm32


【解决方案1】:

我了解这些是使用 newlib(标准 c lib 实现)所必需的操作系统功能。在不提供它们的系统上(正如@wildplasser 所说:没有操作系统?)它们显然需要明确定义。也许这个链接有帮助:http://wiki.osdev.org/Porting_Newlib。我是从http://balau82.wordpress.com/2010/12/16/using-newlib-in-arm-bare-metal-programs/到达那里的。

【讨论】:

  • 首先感谢您的回答。我正在使用 Windows 7,而我的 stm32 板没有操作系统:所以我在其中刷新了我的网络服务器。您的第二份文件似乎很有用,谢谢!但实际上关于我的项目,我不需要使用 printf 等这些函数......所以我会删除这些函数,但我不知道 polarSSL 是否可能(否则我将使用 newlib ,但它可以在 Windows 上运行吗?)非常感谢。
【解决方案2】:

你不需要在 Newlib 中“删除”任何东西,你也不应该 - 我认为这不会有帮助 - 我想知道你在哪里读到的?

您需要提供系统调用存根,尽管其中许多可以是空函数,或者至少返回 错误 状态,以防有人或某事无意中调用它们 - 它们与进程控制、内存分配和流 I/O。这些几乎肯定会被您使用的第三方代码间接引用。

如果您将 Newlib 构建为静态库,它只会链接解析代码中的符号所必需的代码,因此如果您获得未定义的引用,那么您正在调用依赖于它们的东西。

您不应该做的是编译 Newlib 代码并将其直接链接到您的应用程序代码 - 这将链接大量未使用的代码并要求您提供其他未使用的存根。

【讨论】:

  • 我认为目的是根本不使用它们,并消除将它们作为依赖项解析的需要 - 希望不是从库中删除它们,而是不使用任何需要的功能他们。
  • 首先感谢您的回答! newlib 依赖于 linux,不是吗?像 sys/librairies ;在下面的这个网站中,我们有 newlib_stubs.c,其中有 #include sys/stats.h 等......所以它不会工作,不是吗? (我在 Windows 上)stm32discovery.nano-age.co.uk/…
  • 此外,如果我绝对需要使用 newlib,我是否需要在我的 C 项目中插入所有 newlib 源,就像下面这个网站一样? stm32discovery.nano-age.co.uk/…
  • 不,Newlib 没有 Linux 依赖项。它有一组系统调用存根,您必须提供这些存根才能将库映射到您的系统(无论它使用 GPOS、RTOS 还是裸机)。在您发布的链接中,阅读_fstat() 函数上方的评论 - 命名用于与 POSIX 保持一致,并且文件本身与文章中讨论的包一起提供(尽管我不清楚该包是否可用供下载)。
  • 你有两个选择。您可以从包含系统调用存根的 Newlib 源构建静态 libc.a 库,或者您可以在不使用系统调用的情况下构建它,并编译系统调用代码与您的应用程序的链接。如果您不打算完全实现所有存根,并且您想要一个可以在任何基于 Cortex-M 的处理器上运行的库,则后者可能更可取。如果您已经有一个 Newlib libc.a,那么您显然需要在任何情况下执行后者,除非您想重建库。
【解决方案3】:

编译到 MCU 时不要使用选项 -nostartfiles 进行编译。

【讨论】:

    【解决方案4】:

    根据forum尝试添加:

    -specs=nosys.specs

    【讨论】:

      【解决方案5】:

      就我而言,我使用 C++ 进行编译并关闭异常解决了我的问题。 将-fno-exceptions 添加到您的编译标志中。您可能还想关闭Run Time Type Information (RTTI),即-fno-rtti。

      CPPFLAGS += -fno-exceptions -fno-rtti

      【讨论】:

      • 与 C++ 无关。 C 没有异常或 RTTI。
      猜你喜欢
      • 2011-08-11
      • 2015-12-03
      • 1970-01-01
      • 2018-01-27
      • 1970-01-01
      • 2016-12-26
      • 2011-07-27
      • 2013-06-20
      • 2012-02-05
      相关资源
      最近更新 更多