小编Igo*_*sky的帖子

使用-fno-rtti在OS X上抛出和捕获异常的问题

问题与此问题有些类似,但接受的答案并未真正提出解决方案或解决方法.

在我们的项目中,我们有一个dylib和主要的可执行文件.dylib使用-fno-rtti,而可执行文件使用RTTI 编译.当std::bad_alloc从dylib抛出异常(例如)并在exe中捕获时,会发生此问题.

(在你大喊"异常需要RTTI所以你必须有它!",请注意,必要的例外RTTI总是产生不管-frtti-fno-rtti设置.这实际上是在记录-fno-rtti标志的说明.在OS X上的问题是,它不是以相同的方式生成的)

经过一番调查,发现了以下内容:

  • 在dylib(-fno-rtti)中,有一个异常的RTTI结构的本地副本; 特别是__ZTISt9bad_alloc符号(typeinfo for std::bad_alloc).
  • exe(-frtti)从中导入typeinfo符号libstdc++.6.dylib,但没有本地副本

由于异常处理代码依赖于比较typeinfo指针来确定异常匹配,因此匹配失败,只有catch(...)成功.

到目前为止,我看到以下选项:

1)编译所有内容,或者至少编译抛出和捕获异常的文件-frtti.这是可行的,但我不喜欢为所有东西生成RTTI的想法,即使我们不使用它; 并且使用异常的文件列表很容易变得陈旧.

2)当链接dylib时,以某种方式使链接器从目标文件中丢弃弱异常定义并使用它来自libstdc++.6.dylib.到目前为止,我没有成功.

3)???

我做了一个小测试来说明这个问题.

--- throw.cpp ---
#include <iostream>

#if defined(__GNUC__)
#define EXPORT __attribute__((visibility("default")))
#else
#define EXPORT __declspec(dllexport)
#endif

EXPORT void dothrow ()
{
   std::cout << "before throw" << std::endl;
   throw std::bad_alloc();
}

--- main.cpp --- …
Run Code Online (Sandbox Code Playgroud)

c++ macos exception shared-libraries rtti

18
推荐指数
2
解决办法
3289
查看次数

gdb'x'命令有什么作用?

我正在读一关于黑客攻击的,它有一章关于装配.

以下是我用C编写的小程序.

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int i;

    for (i = 0; i < 10; i++) {
        puts("Hello World!");
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

以下是gdb测试:

(gdb) break main
Breakpoint 1 at 0x40050f: file main.c, line 7.
(gdb) run
Breakpoint 1, main (argc=1, argv=0x7fffffffe708) at main.c:7
7       for (i = 0; i < 10; i++) {
(gdb) disassemble main
Dump of assembler code for function main:
   0x0000000000400500 <+0>: push   rbp
   0x0000000000400501 …
Run Code Online (Sandbox Code Playgroud)

c assembly gdb

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

静态const数组在MSVC中动态初始化?

我们有一个表我们想要静态初始化,但MSVC(2015.1及更早版本)也会生成动态初始化程序.

以下是演示此问题的简化代码:

#define idaapi __stdcall
#define MAXSTR 1024
typedef int error_t;
typedef unsigned char uchar;


struct psymbol_t
{
  short what;           /* -1 - is error,                       */
                        /* 0 - any symbol,don't skip it         */
                        /* else lxtype_t                        */
  short callNumber;     /* Number in table of metasymbols       */
                        /* -1 - no metasymbol                   */
                        /* Error code if what == -1             */
  uchar  nextNumber;    /* Number in current table              */
                        /* 0xFF - end                           */
  uchar  actNumber;     /* Number …
Run Code Online (Sandbox Code Playgroud)

c++ arrays visual-c++ static-initialization

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

在GNU make中一次编译多个**已更改的**源文件

我知道有几个问题有类似的标题,但似乎没有提供我需要的答案(纠正我,如果我错了).

考虑这个makefile:

SOURCES=file1.cpp file2.cpp file3.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=myprog

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CXX) -o $@ $(OBJECTS)

file1.o: file1.cpp file1.h
file2.o: file2.cpp file2.h file1.h
file3.o: file3.cpp

.cpp.o:
    $(CXX) $(CXXFLAGS) -c -o $@ $<
Run Code Online (Sandbox Code Playgroud)

如果我更改file1.h,则运行以下命令:

g++ -c -o file1.o file1.cpp
g++ -c -o file2.o file2.cpp
g++ -o myprog file1.o file2.o file3.o 
Run Code Online (Sandbox Code Playgroud)

我想拥有的是:

g++ -c file1.cpp file2.cpp
g++ -o myprog file1.o file2.o file3.o 
Run Code Online (Sandbox Code Playgroud)

(我知道我不能用GCC指定对象输出目录,但我可以使用它;应该可以解决一些cd命令.)

在nmake中,这是通过双冒号推理规则(所谓的" 批处理模式规则")来完成的.基本上,它将多个目标的推理规则(例如".obj.cpp:")分组,并为所有依赖项调用编译器,而不是每个文件调用一次.该$<变量获取依赖项列表,而不仅仅是第一个.

现在我们正在使用并行构建(make -j),但它有自己的问题,VC++编译器在一次调用模式下运行得更好,所以我更喜欢使用它.

c gcc nmake makefile

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

ld警告:stack subl指令与OS X上的dwarf堆栈大小有太大的不同

最近我们开始在OS X版本上收到此警告.

ld: warning:
could not create compact unwind for __Z10createMenuv: stack subl instruction is too different from dwarf stack size
ld: warning:
could not create compact unwind for __Z10del_modulejb: stack subl instruction is too different from dwarf stack size
could not create compact unwind for __Z14menu_patchbytev: stack subl instruction is too different from dwarf stack size
Run Code Online (Sandbox Code Playgroud)

我可以在Chromium bug跟踪器中找到对此的一些讨论,但建议的"修复"是禁用紧凑的展开生成.我想了解为什么会出现这种警告,以及它是否在我们的代码或工具链中出现问题.

我们的工具链来自Xcode 7.3.1:

Apple LLVM version 7.3.0 (clang-703.0.31)
Target: x86_64-apple-darwin15.6.0
Run Code Online (Sandbox Code Playgroud)

c++ macos linker clang dwarf

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

如何在x86_64上进入64位模式

我在xv6 https://github.com/chrisdew/xv6/blob/master/bootasm.S中找到了很多装配,它向我展示了如何从16位移动到32位保护模式.

有没有人知道进入64位模式的类似示例?(通过或不使用32位模式.)

assembly x86-64 bare-metal

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

BIC指令

你好,我只是在汇编中有一些清点的基本问题.这是我在下面尝试的.

MOV R0, #OxFFFFFFFF   ;Load R0 with the HEX Values FFFFFFFF
BIC R0, R0, #0xBF    ;This should set bit 7 from my understanding as B is 1011 in hex
Run Code Online (Sandbox Code Playgroud)

执行上述操作时,将以下值放入R0(0xFFFFFF4F)我想知道为什么会这样?

如果我这样做清除它将值0xFFFFFFBF

MOV R0, #OxFFFFFFFF   ;Load R0 with the HEX Values FFFFFFFF
BIC R0, R0, #00000000000000000000000001000000b
Run Code Online (Sandbox Code Playgroud)

谁能帮我理解这些结果?

assembly arm

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

Linux内核模块ABI(x86)

我正在寻找在x86上用于内核模块调用的ABI的官方定义.我最近查看了一个已编译的模块,并惊讶地发现:

  • 它使用寄存器传递前三个参数(eax,edxecx).

  • 它不像fastcallGCC文档中描述的那样.该文件说的是 fastcall使用ECX和EDX(微软风格).

我能找到的唯一有点相关的信息就是这个,但它并没有说太多.

所以:

1)是否有关于内核模块中使用的ABI的官方文档(不是系统调用ABI而不仅仅是函数列表 - 我找到的那些).

2)编译器如何产生这种奇怪的快速调用?我错过了一个开关吗?

linux x86 kernel abi

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

什么是 cfi_adjust_cfa_offset 和 cfi_rel_offset?

我目前正在尝试了解 glibcsyscall函数的内部代码。下面是代码(取自这里)。

/* In the EABI syscall interface, we don't need a special syscall to
   implement syscall().  It won't work reliably with 64-bit arguments
   (but that is true on many modern platforms).  */
ENTRY (syscall)
        mov        ip, sp
        push        {r4, r5, r6, r7}
        cfi_adjust_cfa_offset (16)
        cfi_rel_offset (r4, 0)
        cfi_rel_offset (r5, 4)
        cfi_rel_offset (r6, 8)
        cfi_rel_offset (r7, 12)
        mov        r7, r0
        mov        r0, r1
        mov        r1, r2
        mov        r2, r3
        ldmfd        ip, {r3, r4, r5, r6}
        swi …
Run Code Online (Sandbox Code Playgroud)

assembly arm instruction-set instructions eabi

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

free()抱怨无效指针

我试图通过连接一些值来逐个构建一个字符串,以获得类似的东西:

|0x0F64:0x0063:0x1A|0x7CC4:0x0073:0x1A|0x0A51:0xA29A:0x9C|0xD49D:0x0058:0x10|
Run Code Online (Sandbox Code Playgroud)

我想使用动态变量,因为NB_ELEMENT可能会得到改进.

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

#define NB_ELEMENT 4
typedef struct
{
   unsigned short  u16Val1;
   unsigned short  u16Val2;
   unsigned char   u8Val3;
}stElement;

stElement element[NB_ELEMENT] = {{ 0 }};

int main()
{
    element[0].u16Val1 = 3940;
    element[0].u16Val2 = 99;
    element[0].u8Val3 = 26; 

    element[1].u16Val1 = 31940;
    element[1].u16Val2 = 115;
    element[2].u8Val3 = 26;           

    element[2].u16Val1 = 2641;
    element[2].u16Val2 = 41620;
    element[2].u8Val3 = 156; 

    element[3].u16Val1 = 52429;
    element[3].u16Val2 = 88;
    element[3].u8Val3 = 16;

    char *str = malloc(NB_ELEMENT * sizeof element);

    snprintf(str, sizeof element, "|0x%04x:0x%04x:0x%x\n",element[0].u16Val1,
                                                      element[0].u16Val2, …
Run Code Online (Sandbox Code Playgroud)

c string printf concatenation

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