问题标签 [weak-linking]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - LLVM/Clang 是否支持弱链接的“弱”属性?
简而言之:LLVM/Clang 是否支持“弱”属性?
我正在学习一些 Arduino 库资源(更详细的是 HardwareSerial.cpp),并且我发现了一些weak
我以前从未使用过的有趣属性:
我发现它很有趣,并且我读到如果未定义,链接器应将其设置为 NULL。
但是,在我对 Clang 的测试中,我无法使用它。
文件lib.cpp:
文件lib.h:
文件main.cpp:
如果我使用g++ lib.cpp main.cpp -o main -DDEFINE_WEAK
我可以使用它:
但如果我使用g++ lib.cpp main.cpp -o main
我无法链接应用程序:
要更详细地了解 Clang:
我应该怎么办?weak
LLVM/Clang 是否支持该属性?
PS。我已经尝试以Apple 描述的方式重写lib.cpp并且仍然得到相同的链接器错误:
ios - Can I set the property for a class, which hasn't been specified until run in OC?
I've got a fixed controller with dynamic views as its view. I want to set value for property of a certain view.
Here's code in the controller as below:
In * the certain* view, I've got a property like this.
It reminds me
Undeclared selector 'lineAdded'
When I run, it just skip if condition and go on.
My question is: is it impossible to set property when the class it belongs to isn't specified?
Hope somebody could help me. Thanks in advance.
objective-c - Why cannot we use the negation operator when checking for the existence of a symbol?
The answers to this question state that if (x != nil)
is the same as if (x)
.
But Apple documentation reads:
Note: When checking for the existence of a symbol, you must explicitly compare it to NULL or nil in your code. You cannot use the negation operator ( ! ) to negate the address of the symbol.
Which seems to contradict "Working with nil" from https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithObjects/WorkingwithObjects.html#//apple_ref/doc/uid/TP40011210-CH4-SW22
c - 一旦在 C 中声明为 WEAK 函数,如何使用 REAL 函数?
在 C 中使用 WEAK 引用时出现问题。假设,我的 src 代码结构如下:
//Eclipse C项目结构
和:
//test_program.c
//source_sample.c
//dummy_Test.h
//dummy_TestWeakAttribute.h
//weak_test_case.c
//strong_test_case.c
我在屏幕上得到了结果:
我不能再使用 REAL 函数了。我对真实test
函数的所有调用都是不可能的,因为它是像__attribute__((weak))
以前一样声明的。那么,有人对这个案子有想法吗?主要目的,我想调用我的真实test
(in source_sample.c
) 但也不要删除 weak
属性。
c - 用函数 B 覆盖弱函数 A
对于嵌入式设备,我有一个文件,其中包含一个带有存储中断处理程序的函数指针的数组,像这样定义(我不能修改它):
我有第二个文件,它定义了一些我无法修改的功能。这个文件就像:
最后,我有一个主源文件,包含main
设备的功能和配置。在中断 78 上,我想闪烁 LED。所以我写了一个这样的强大函数ISR78
:
我想知道是否有解决方案ISR78
直接覆盖弱函数blinkLed
,即存储blinkLed
内部地址__vector_table
而不修改它或重命名函数?
编辑:
我实际上使用 GNU gcc 4.9.3 和相关的链接器(GNU ld 2.24.0)。我可以修改main.c
与项目关联的 Makefile。
c - 共享对象中的弱链接未按预期工作
我正在尝试使用cmocka单元测试框架,该框架建议使用弱链接来选择用户定义的实现而不是函数的实际实现。在我的环境中,我有一个共享对象,我想对其进行单元测试。我在一个单独的文件中实现了单元测试,我编译并链接到共享对象。我的问题是,在共享对象中调用一个函数,而该函数bar
又在该共享对象中调用一个函数foo
,总是会导致真正的实现,foo
而不是自定义的。我创建了共享对象和单元测试的简化实现。
共享库,a.c
:
单元测试,b.c
:
最后,Makefile
:
运行a.out
产生以下输出:
正如预期的那样,从 main 直接调用会foo
导致被调用。__wrap_foo
接下来,我bar
从正确导致__wrap_bar
被调用的 main 调用,我将调用重定向到bar
( __real_bar
) 的实际实现。bar
然后调用foo
,但使用真正的实现,而不是包装的。在这种情况下,为什么不foo
调用包装的实现?看起来问题与函数调用的来源有关。
在 functionbar
中,如果我将被调用替换为foo
我__wrap_foo
确实会得到预期的行为,但我认为这不是一个优雅的解决方案。
我已经设法使用普通链接和dlopen(3)
朋友绕过了这个问题,但是我很好奇为什么弱链接在我的情况下不起作用。
c - GCC -O2 和 __attribute__((弱))
它看起来像 GCC,-O2
并__attribute__((weak))
根据您引用弱符号的方式产生不同的结果。考虑一下:
$猫弱.c
$猫测试.c
$ 制作
$ ./测试
$ 使 ADD_FLAGS="-O2"
$ ./测试
问题是,为什么最后一个“./test”产生“0 1 1”,而不是“1 1 1”?
gcc 版本 5.4.0 (GCC)
gcc - 弱链接与“--按需”
我在使用包含弱符号和--as-needed
链接器标志的库时遇到问题。
例子
(这使用Jack库)
(示例代码被编辑为不再出现段错误,因为段错误不是我的实际问题)
问题
看来问题是:
Jack将所有符号声明为弱符号(如果我包含
<jack/weakjack.h>
)。这对我来说很好;我确实希望我的符号保持弱。尤其是 我的程序与 OSX (-weak_framework Jackmp
) 上的 jack 链接很弱,这需要包括<jack/weakjack.h>
与 链接时
--as-needed
,链接器会排除任何不引用至少一个非弱符号的库。从手册页:
--as-needed 导致 DT_NEEDED 标记仅针对链接中的该点满足来自常规目标文件的非弱未定义符号引用的库发出
- 某些操作系统(例如 Ubuntu-16.04LTS)已
--as-needed
默认启用。
现在我认为这--as-needed
是一个很好的链接器功能,可以摆脱许多真正不需要的运行时依赖项。
但是,我不明白为什么弱依赖被认为根本没有依赖。对我来说,弱依赖是启用可选功能。如果可能,我确实希望启用这些功能,并且是否可能的决定应该是运行时决定。对于当前的行为,它变成了编译时的决定。(如果我想要,我只需通过一些预处理器魔法禁用相关代码)。
一种解决方案显然是添加--no-as-needed
到链接器标志。我不希望这样:如果我的发行版(或编译我的二进制文件的人)认为这是要做的事情,我确实想摆脱过度链接。
所以我可能会在as-needed
链接我已知的弱库后打开:
但这也感觉不对,因为在我强制需要的库之后的所有库都突然被迫这样做--as-needed
(这可能不是我的发行版或编译我的二进制文件的人认为这是要做的事情)。它似乎也给构建链增加了很多麻烦,只是因为某些库恰好只导出弱符号。我不想手动跟踪所有这样做的库。
我当然也可以不包括<jack/weakjack.h>
. 之所以包含它,是因为该应用程序也可以在 OSX 上运行,我确实希望在其中选择依赖JACK 框架(所以我链接到-weak_framework Jackmp
),并在没有该框架的情况下保持我的程序可运行。
我真的不想因为不同平台上的链接器之间的细微差别而弄乱我的应用程序代码。这可能是我遇到的主要问题:为什么我应该在我的应用程序中添加特定于平台的代码来满足不同的链接器细节 - 我可能会添加特定于功能的代码,例如不包括weakjack.h
如果编译器没有等价的-weak_library
or -weak_framework
; 但目前看来,我能得到的最接近的是#ifdef __APPLE__
在这种情况下让我不寒而栗的东西)。
所以我真的很喜欢一些选项来强制只有弱符号的库仍然被动态链接。
有这样的事吗?
gcc - 带有弱符号的奇怪链接行为(ARM-EABI 展开例程 __cxa_begin_cleanup)
我的 ARM-EABI 工具链和/或 libstdc++ 有问题。
当我编译和链接一个由文件 test.cpp、TestClass.cpp、TestClass.h 组成的简单 C++ 库时,一些展开的支持例程(如__cxa_begin_cleanup
从库中弱引用),
objdump -T
显示为
__cxa_begin_cleanup
在 libsupc++ 中实现,与我们的库链接,但函数未链接到库中。为什么?
如果更改了库中的代码并std::string
使用了 a(在 test.cpp 的注释中准备),则该函数__cxa_begin_cleanup
将链接到生成的二进制文件并且objdump -T
不再显示它们。
这里有一个类似的问题,但是提到的链接器选项--start-group
并--end-group
没有帮助。
任何人都可以帮忙吗?
ARM-EABI 工具链包括: GCC 6.3.0 Binutils 2.27 Newlib 2.4.0
命令行:
资源:
测试.cpp
测试类.cpp
测试类.h
c - 如何查看对象中哪些函数是弱链接的?
有没有办法查看/捕获对象中的弱链接函数?
我删除了旧库的链接,但由于一些链接与弱链接,我无法捕获所有使用的函数。