小编abl*_*igh的帖子

重写编译对象的共享库 undef 符号版本

我正在尝试编译和链接一个程序(我们称之为 myprog),该程序与共享库(在本例中为libcryto 和 libssl,但实际库不相关)链接。我正在Centos 5.5上构建它,但希望在其他类似RHEL的发行版(例如 CloudLinux)上运行相同的二进制文件。两者都具有相同库的版本SO_NAME(即DT_NEEDED版本对应)。

我的问题是这个。当我在 Centos 上编译时,我看到:

centos$ objdump -T myprog | fgrep SSL_new
0000000000000000      DF *UND*  0000000000000000  libssl.so.10 SSL_new
Run Code Online (Sandbox Code Playgroud)

这工作正常,因为:

centos$ objdump -T /usr/lib64/libssl.so.10 | fgrep SSL_new
00000000000447d0 g    DF .text  0000000000000390  libssl.so.10 SSL_new
Run Code Online (Sandbox Code Playgroud)

但是,在 CloudLinux 上:

cloudlinux$ objdump -T /usr/lib64/libssl.so.10 | fgrep SSL_new
00000033a623a120 g    DF .text  0000000000000390  Base        SSL_new
Run Code Online (Sandbox Code Playgroud)

请注意 SSL 符号的版本已从 更改libssl.so.10Base

这意味着当我运行二进制文件时,我得到:

cloudlinux$ ./myprog
./myprog: /usr/lib64/libcrypto.so.10: no version information …
Run Code Online (Sandbox Code Playgroud)

linux linker libc binutils objcopy

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

来自 NSData 的 Objective-c sscanf

我有一个 BTLE 设备,它向我发送字节,其中一些我需要组成一个 32 位有符号整数,移位,然后解释。我正在使用 xcode 6.1。

我遇到的问题是简单地使用 sscanf 将字节转换为 int32_t ,这有时有效,有时无效。我不是 obj-c 专家,不确定这是否是正确的方法,我使用的 strtol 同样不起作用。

整个功能如下:

- (double) parseMV2: (NSData*) data {
  NSData* slicedData = [data subdataWithRange:NSMakeRange(2, 4)];
  const char *bytes = [slicedData bytes];
  int32_t value;
  double mV = 0;

  int sscanf_result = sscanf(bytes, "%4x", &value);

  if (1 == sscanf_result) {
    value <<= 3; // discard the 3 most significant bits as they are not part of the value this also brings the sign bit to the most significant …
Run Code Online (Sandbox Code Playgroud)

scanf objective-c bit-shift

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

LLDB 调试器无法识别在远程机器上编译的可执行符号

我正在 Xcode/clang 环境中的一台计算机上构建我的项目,我想在另一个站上的 lldb 调试器下运行它,而无需复制源代码、可执行文件和符号文件。

我已经复制了所有 dSYM 目录,以便 lldb 调试器可以识别我需要的符号并呈现真正的函数(目前我得到了像___lldb_unnamed_function532backtrace 命令一样的函数名称)

我尝试使用命令

settings set target.source_map /source_dir /target_dir
Run Code Online (Sandbox Code Playgroud)

wheretarget_dir代表我放置所有dSYM目录source_dir的路径,代表所有dSYM目录的原始父目录的路径。

不幸的是,除非源代码驻留在/target_dir.

我哪里做错了?

好的,所以我发现当我将 dSYM 目录复制到可执行文件的相同位置时,lldb 设法破译符号。有没有办法“告诉”lldb 到另一个位置?

c debugging macos clang lldb

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

在c中无法使用系统函数调用Linux命令

我想用system()函数执行以下命令,

awk -F [][] '/dB/ { print $2 }' <(amixer sget Master) > sound_level
Run Code Online (Sandbox Code Playgroud)

当我在终端写入时,它给了我想要的输出.但是当我在C中使用系统函数调用此命令时,它会给我错误.

我的代码是:

#include<stdio.h>
#include <stdlib.h>

int main()
{
        system("awk -F [][] '/dB/ { print $2 }' <(amixer sget Master) > sound_level");
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

它给了我以下错误:

sh: 1: Syntax error: "(" unexpected
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

awk -F [][] '/dB/ { print $2 }' < /(amixer sget Master /) > sound_level
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

任何帮助表示赞赏.

c linux

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

将字符串中每个单词的第一个字母大写为s

我想把一个单词大写的第一个字母,但我最终改变整个字符串.任何帮助!

{
   //Prompt for the name
   char *s  = GetString(); /* some function that returns a string */

   //capitalize
   for(int i = 0,n = strlen(s);i < n;i++)
   {
      printf("%c",toupper(s[0]));
   }
   printf("\n");
}
Run Code Online (Sandbox Code Playgroud)

c

-4
推荐指数
1
解决办法
672
查看次数

标签 统计

c ×3

linux ×2

binutils ×1

bit-shift ×1

clang ×1

debugging ×1

libc ×1

linker ×1

lldb ×1

macos ×1

objcopy ×1

objective-c ×1

scanf ×1