问题与此问题有些类似,但接受的答案并未真正提出解决方案或解决方法.
在我们的项目中,我们有一个dylib和主要的可执行文件.dylib使用-fno-rtti,而可执行文件使用RTTI 编译.当std::bad_alloc从dylib抛出异常(例如)并在exe中捕获时,会发生此问题.
(在你大喊"异常需要RTTI所以你必须有它!",请注意,必要的例外RTTI总是产生不管的-frtti或-fno-rtti设置.这实际上是在记录-fno-rtti标志的说明.在OS X上的问题是,它不是以相同的方式生成的)
经过一番调查,发现了以下内容:
-fno-rtti)中,有一个异常的RTTI结构的本地副本; 特别是__ZTISt9bad_alloc符号(typeinfo for std::bad_alloc).-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编写的小程序.
#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) 我们有一个表我们想要静态初始化,但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) 我知道有几个问题有类似的标题,但似乎没有提供我需要的答案(纠正我,如果我错了).
考虑这个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++编译器在一次调用模式下运行得更好,所以我更喜欢使用它.
最近我们开始在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) 我在xv6 https://github.com/chrisdew/xv6/blob/master/bootasm.S中找到了很多装配,它向我展示了如何从16位移动到32位保护模式.
有没有人知道进入64位模式的类似示例?(通过或不使用32位模式.)
你好,我只是在汇编中有一些清点的基本问题.这是我在下面尝试的.
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)
谁能帮我理解这些结果?
我目前正在尝试了解 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) 我试图通过连接一些值来逐个构建一个字符串,以获得类似的东西:
|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)