我有一些使用本地范围、程序生命周期对象的 C++ 代码,例如
void testFunction(int arg) {
static Tested tested(0);
tested.use(arg);
}
Run Code Online (Sandbox Code Playgroud)
它与旧版本的 GCC 构建得很好。使用 GCC 8.2.0,我在链接时收到令人费解的警告:
警告:使用旧版兼容的 __sync_synchronize。不适合多线程应用
它指向定义测试的行,并且确实存在对编译器生成的 __sync_synchronize() 的调用。我想它是为了确保没有两个线程可以同时运行初始化代码,并使延迟初始化产生与加载时初始化相同的结果。
Tested 类的此实现重现了问题:
class Tested {
int sum;
public:
Tested(int init) : sum(init) {}
void use(int arg) {
sum += arg;
}
int current() const {
return sum;
}
};
Run Code Online (Sandbox Code Playgroud)
该代码预计在单线程嵌入式平台上运行。
我是否正确地认为该警告与我无关?
我可以做什么(除了停止使用静态对象)来消除警告消息?
我想在链接器脚本中定义一个部分,并在运行时从源代码中获取其值。
到目前为止,我已经采用了默认gcc linker
脚本文件,并添加了我的部分,如下所示:
...
.my_section : { BYTE(0xAA); }
...
Run Code Online (Sandbox Code Playgroud)
编译后,我可以看到以下部分:
> gcc -T ls.ld main.c -o main
> objdump -h main
...
...
27 .my_section 00000001 0000000000a01040 0000000000a01040 00001040 2**0
CONTENTS, ALLOC, LOAD, DATA
28 .comment 00000034 0000000000000000 0000000000000000 00001041 2**0
CONTENTS, READONLY
Run Code Online (Sandbox Code Playgroud)
现在,我想将该值打印到stdout
(并且我期望获得0xAA
):
#include <stdio.h>
static volatile unsigned char SECTION __attribute__((section(".my_section")));
int main(){
printf("hello %d\n", SECTION);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我获得的值始终为 0。我做错了什么?
如何找出我的程序在运行时使用的共享库的路径?
我将 glibc 2.12 作为在我的 CentOS 6.10 系统上运行的主要glibc ,并且还在/opt/glibc-2.14
.
当我检查我的可执行文件时
$ objdump -p ./myProgram
Run Code Online (Sandbox Code Playgroud)
它提供了这个信息
Dynamic Section:
NEEDED libpthread.so.0
NEEDED libcurl.so.4
NEEDED libc.so.6
Run Code Online (Sandbox Code Playgroud)
我的LD_LIBRARY_PATH
有这个值/opt/glibc-2.14/lib
。
是否可以查看我的程序在运行时libc.so.6
实际使用的库(可能是库文件的路径)?
我正在尝试将游戏转换为苏联 PDP11 兼容机。由于它有严格的内存限制 - 56K RAM,我必须在运行时加载部分代码。这意味着我需要构建几个相互交叉引用符号的二进制模块。我用的是GAS和LD。
有没有办法仅使用这些工具来完成此任务?
例如,一个二进制模块文件想要加载另一个二进制模块,为此它必须知道另一个二进制文件的大小。尺寸可以作为符号使用,如下所示:
.title OtherModule
begin:
some code
end:
.equiv SizeOfTheOtherModuleInWords, ((end - begin) / 2)
Run Code Online (Sandbox Code Playgroud)
另一个例子,游戏中的每个级别单独加载,并包含从始终驻留在内存中的主引擎调用子例程的代码。
我通过链接器脚本找到了解决方案。我可以使用/DISCARD/
部分从链接中排除文件。
OUTPUT_FORMAT("binary")
OUTPUT_ARCH(pdp11)
INPUT(core.o bootstrap.o)
OUTPUT(AKU.SAV)
FileSizeCoreWords = ((FileEndCore - FileBeginCore) / 2);
SECTIONS
{
. = 0;
.text :
{
bootstrap.o (.text)
}
.data :
{
bootstrap.o (.data)
}
.bss :
{
bootstrap.o (.bss)
}
/DISCARD/ :
{
core.o
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个 docker 容器,用于构建软件并在其中生成共享库。我想在另一个 docker 容器中使用这些库来实际运行应用程序。为此,我使用带有已安装卷的构建泊坞窗来将这些库放在主机上。
我的 RUNTIME 容器的 docker 文件如下所示:
FROM openjdk:8
RUN apt update
ENV LD_LIBRARY_PATH /build/dist/lib
RUN ldconfig
WORKDIR /build
Run Code Online (Sandbox Code Playgroud)
当我运行以下命令时:
docker run -u $(id -u ${USER}):$(id -g ${USER}) -it -v $(realpath .):/build runtime_docker bash
Run Code Online (Sandbox Code Playgroud)
我在 ldconfig -p 缓存中没有看到 /build/dist/lib 中的任何库。
我究竟做错了什么?
我正在尝试安装此代码我正在尝试为一个大学项目安装这个git-repo,但我陷入了困境,因为 ld 似乎无法正确链接 lua。我按照安装说明进行操作并使用以下命令编译代码:
catkin_make -DCMAKE_BUILD_TYPE=Release -DPYTHON_EXECUTABLE=/usr/bin/python3 -DCMAKE_CXX_STANDARD=14
Run Code Online (Sandbox Code Playgroud)
失败并显示几条消息,例如:
/usr/bin/ld: /home/felixk/catkin_ws/devel/lib/libflatland_lib.so: undefined reference to `lua_toboolean(lua_State*, int)'
/usr/bin/ld: /home/felixk/catkin_ws/devel/lib/libflatland_lib.so: undefined reference to `lua_tonumberx(lua_State*, int, int*)'
...
/usr/bin/ld: /home/felixk/catkin_ws/devel/lib/libflatland_lib.so: undefined reference to `lua_pushstring(lua_State*, char const*)'
/usr/bin/ld: /home/felixk/catkin_ws/devel/lib/libflatland_lib.so: undefined reference to `lua_isstring(lua_State*, int)'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
该代码已经过测试并且可以在 Ubuntu 18.04 上运行,但我正在尝试让它在 Manjaro 上运行。手册指出这liblua5.2-dev
是需要的,我从 AUR安装了lua52 ,它似乎提供了正确的库。
的输出ldd
是:
ldd /home/felixk/catkin_ws/devel/lib/libflatland_lib.so | grep lua
liblua5.2.so.5.2 => /usr/lib/liblua5.2.so.5.2 (0x00007f23fd51c000)
Run Code Online (Sandbox Code Playgroud)
然后我检查是否/usr/lib/liblua5.2.so.5.2
存在并且确实存在。我试图用来readelf
检查是否liblua5.2.so.5.2 …
我记得,几年前当我开始使用mySQL时,设置"就是这样"是一件噩梦,以便找到库(特别是mySQL库!).就我而言,我相信ldconfig是解决问题的工具.闪存到2012年 - 刚刚安装了一个包含64位Ubuntu 12.04的新"主"系统,我正在确保所有源代码都能编译.想象一下,我很惊讶我和libmysqlclient一起回到同一条船上.
我的网络搜索显示了很多尝试,没有任何帮助.一路走来,我发现了这个诀窍:gcc ...... mysql_config --cflags --libs
- 非常好,但是没有用.
因此,例如,结果:
gcc -D_FILE_OFFSET_BITS=64 `mysql_config --cflags --libs` \
-o check-my-ip \
-s check-my-ip.c ../common/ini-file.c
Run Code Online (Sandbox Code Playgroud)
是
/tmp/ccxAgCqr.o: In function `updateTables':
/usr/local/src/check-my-ip/check-my-ip.c:373: undefined reference to `mysql_init'
/usr/local/src/check-my-ip/check-my-ip.c:374: undefined reference to `mysql_real_connect'
/usr/local/src/check-my-ip/check-my-ip.c:381: undefined reference to `mysql_error'
/usr/local/src/check-my-ip/check-my-ip.c:381: undefined reference to `mysql_errno'
/usr/local/src/check-my-ip/check-my-ip.c:397: undefined reference to `mysql_field_count'
/usr/local/src/check-my-ip/check-my-ip.c:398: undefined reference to `mysql_use_result'
/usr/local/src/check-my-ip/check-my-ip.c:399: undefined reference to `mysql_fetch_row'
/usr/local/src/check-my-ip/check-my-ip.c:419: undefined reference to `mysql_free_result'
/usr/local/src/check-my-ip/check-my-ip.c:422: undefined reference to `mysql_field_count'
/usr/local/src/check-my-ip/check-my-ip.c:429: undefined reference to `mysql_close'
/tmp/ccxAgCqr.o: …
Run Code Online (Sandbox Code Playgroud) TL; DR - 我需要使用test.o编译archive.a以生成可执行文件.
背景 - 我试图在一个单独的库中调用一个函数,而不是我正在修改的软件包,但函数(一个字符串解析器)正在创建一个分段违例.失败肯定发生在库中,开发人员要求发生错误的测试用例.我没有让他尝试编译我正在研究的相当大的软件包,而是向他发送一个调用相应函数的简单程序(希望在同一个地方死亡).他的库也使用了几个系统库(lapack,cblas等),因此链接需要达到我想的一切.
我可以链接到我创建库时创建的.o文件,但当然它们没有链接到相应的系统库.
这似乎应该是直截了当的,但它让我全都陷入困境.
经过几个小时的研究(并尝试)如何id3lib
在Qt(windows)上安装,但没有成功,我决定使用TagLib的库.
我按照本教程为Qt构建兼容版本的taglib,但还有另一个问题(这里有完整的日志):
...
C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\mingw32\bin\ld.exe: Dwarf
Error: found dwarf version '4', this reader only handles version 2 and 3
information.
C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../mingw32/lib/crt2.o:crt1.c:(.text+0x1f1):
undefined reference to `__chkstk_ms'
...
Run Code Online (Sandbox Code Playgroud)
在CMake中,我做了configure
> MinGW Makefiles
.
任何人都可以告诉如何解决它?
环境: