标签: ld

对于 GNU ld 'legacy __sync_synchronize' 警告我该怎么办?

我有一些使用本地范围、程序生命周期对象的 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)

该代码预计在单线程嵌入式平台上运行。

我是否正确地认为该警告与我无关?

我可以做什么(除了停止使用静态对象)来消除警告消息?

c++ devkitpro ld thread-safety suppress-warnings

1
推荐指数
1
解决办法
879
查看次数

在 ld 默认链接描述文件中定义一个节并打印其值

我想在链接器脚本中定义一个部分,并在运行时从源代码中获取其值。

到目前为止,我已经采用了默认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。我做错了什么?

linker gcc ld linker-scripts

1
推荐指数
1
解决办法
3963
查看次数

如何知道我的程序在运行时实际使用哪个共享库?

如何找出我的程序在运行时使用的共享库的路径?

我将 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实际使用的库(可能是库文件的路径)?

c linux shared-libraries dynamic-linking ld

1
推荐指数
1
解决办法
778
查看次数

有没有办法使用其他二进制文件中的全局符号而不将其链接到

我正在尝试将游戏转换为苏联 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)

assembly gnu-assembler ld

1
推荐指数
1
解决办法
326
查看次数

在 docker 容器中设置 ldconfig LD_LIBRARY_PATH

我有一个 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 中的任何库。

我究竟做错了什么?

ld docker

1
推荐指数
1
解决办法
1万
查看次数

为什么 gcc 会改变二进制文件中函数的顺序?

  • 有关强制二进制文件中函数的顺序与源文件的顺序相匹配的许多问题
  • 例如,这篇文章那篇文章和其他
  • 我不明白海湾合作委员会为什么要首先改变他们的顺序?
  • 从中能得到什么?
  • 另外,为什么toplevel-reorder默认值是true?

c gcc ld

1
推荐指数
1
解决办法
516
查看次数

ld:对“lua_”的未定义引用。我不知道为什么 ld 不能引用 lua,即使它在那里

我正在尝试安装此代码我正在尝试为一个大学项目安装这个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 …

c++ lua ld archlinux manjaro

1
推荐指数
1
解决办法
1888
查看次数

ld找不到libmysqlclient

我记得,几年前当我开始使用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)

c mysql shared-libraries ld static-libraries

0
推荐指数
1
解决办法
4257
查看次数

如何使用gcc编译包含源代码文件的库存档?

TL; DR - 我需要使用test.o编译archive.a以生成可执行文件.

背景 - 我试图在一个单独的库中调用一个函数,而不是我正在修改的软件包,但函数(一个字符串解析器)正在创建一个分段违例.失败肯定发生在库中,开发人员要求发生错误的测试用例.我没有让他尝试编译我正在研究的相当大的软件包,而是向他发送一个调用相应函数的简单程序(希望在同一个地方死亡).他的库也使用了几个系统库(lapack,cblas等),因此链接需要达到我想的一切.

我可以链接到我创建库时创建的.o文件,但当然它们没有链接到相应的系统库.

这似乎应该是直截了当的,但它让我全都陷入困境.

c compiler-construction gcc ld unix-ar

0
推荐指数
1
解决办法
3383
查看次数

LD需要DWARF版本3或2,但我的版本是4

经过几个小时的研究(并尝试)如何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.

任何人都可以告诉如何解决它?

环境:

  • Windows 7(64位);
  • CMake 2.8.12.1;
  • TagLib 1.9.1;
  • GCC 3.4.5;
  • Qt 5.1.1.

gcc taglib ld dwarf qt5

0
推荐指数
1
解决办法
8056
查看次数