mô-đun không an toàn cho SAFESEH image C ++


87

Tôi đang sử dụng Microsoft Visual Studio 2011 Professional Beta

Tôi đang cố chạy các tệp OpenCV C ++ ( http://opencv.willowgarage.com/wiki/Welcome ) mà tôi đã biên dịch bằng cMake & Visual Studio Complier.

Tuy nhiên, khi tôi gỡ lỗi dự án, tôi nhận được hơn 600 lỗi, hầu hết chúng là:

lỗi LNK2026: mô-đun không an toàn cho hình ảnh SAFESEH.

Rõ ràng các tệp này nằm trong dự án opencv_ffmpeg nhưng tôi không thể tìm thấy chúng, tôi đã xem trang safeseh Safe Exception Handlers trên trang trợ giúp của Microsoft nhưng không thể tìm thấy bất kỳ câu trả lời chính xác nào.

Tôi đã tự hỏi liệu có ai khác đã gặp sự cố này và liệu họ có khắc phục được nó hay không.


12
Điều này xảy ra khi bạn liên kết .obj hoặc .lib có chứa mã được tạo bởi phiên bản trước của trình biên dịch. Tất nhiên điều này sẽ phổ biến nếu bạn tải xuống tệp nhị phân cho opencv_ffmpeg thay vì nguồn. Bạn có thể tắt tùy chọn trình liên kết nhưng sau đó bạn vẫn sẽ gặp phải phiên bản CRT không tương thích có thể byte. Xây dựng lại thư viện từ nguồn.
Hans Passant

Cám ơn sự giúp đỡ, nó làm việc
Aaron Thompson

@HansPassant Làm gì khi không có nguồn?
GregC

4
Điều hiển nhiên: yêu cầu chủ sở hữu mã cung cấp cho bạn bản cập nhật.
Hans Passant

@HansPassant Tôi hy vọng nhà cung cấp vẫn ở bên cạnh để cập nhật. Nghe giống như một loại vấn đề "yếu tố xe tải của một".
GregC

Câu trả lời:


63

Từ các ý kiến:

Điều này xảy ra khi bạn liên kết .obj hoặc .lib có chứa mã được tạo bởi phiên bản trước của trình biên dịch. Tất nhiên điều này sẽ phổ biến nếu bạn tải xuống tệp nhị phân cho opencv_ffmpeg thay vì nguồn. Bạn có thể tắt tùy chọn trình liên kết nhưng sau đó bạn vẫn sẽ gặp phải phiên bản CRT không tương thích có thể byte. Xây dựng lại thư viện từ nguồn. - Hans Passant ngày 15 tháng 5 lúc 13:01  
 
Cảm ơn sự giúp đỡ, nó đã hoạt động - Aaron Thompson ngày 17 tháng 5 lúc 14:50


Nó cũng có thể được gây ra bởi các trạng thái lỗi, các mô-đun mà trình liên kết không thể tìm thấy trình xử lý ngoại lệ an toàn. Các mô-đun ngôn ngữ hợp ngữ nói riêng - như đã thảo luận trong các câu trả lời khác. Có một số thông tin về điều này ở đây .
Nick Westgate vào

148

Vô hiệu hóa tùy chọn "Hình ảnh có Trình xử lý Ngoại lệ An toàn" trong thuộc tính Dự án -> Thuộc tính Cấu hình -> Trình liên kết -> tab Nâng cao đã giúp tôi.


3
Điều này không ảnh hưởng gì đến tôi.
Pop-A-Stash

Đối với tôi cũng vậy. Có vẻ như bắt buộc là, mặc dù tôi có thể chọn SAFESEH: NO trong menu con Tùy chọn nâng cao trong cài đặt trình liên kết, nó sẽ không được chọn. Nó luôn hoàn nguyên về SAFESEH: CÓ.
user382459

Thành công, với VS 2013 Express
gbarry

1
Thành công, VS 2015

2
Thành công, VS 2017
ke4ktz

12

Nếu bạn gặp lỗi này khi xây dựng ZLIB trong Visual Studio thì đây là giải pháp. Tìm kiếm contrib\masmx86\bld_ml32.batvà thêm /safesehnhư một tùy chọn

Trước

ml /coff /Zi /c /Flmatch686.lst match686.asm
ml /coff /Zi /c /Flinffas32.lst inffas32.asm

Sau

ml /safeseh /coff /Zi /c /Flmatch686.lst match686.asm
ml /safeseh /coff /Zi /c /Flinffas32.lst inffas32.asm

Tôi đã gặp vấn đề tương tự với zlib, nhưng thay vào đó, tôi đã phải thay đổi đạo cụ trên các .asmtệp trong trình khám phá giải pháp.
Cillié Malan

11

Cách khác là thêm một số trình xử lý SEH (trống chẳng hạn) vào tệp asm và biên dịch chúng với /safesehtùy chọn, sau đó biên dịch mã khác bình thường với /SAFESEH:YEStùy chọn trình biên dịch.

Trình xử lý SEH trống:

.safeseh SEH_handler

SEH_handler   proc
;handler
ret

SEH_handler   endp

1
Tôi đã không bận tâm thêm một trình xử lý vào nguồn của bên thứ 3 (zlib), /safesehcó vẻ như đủ. Điều này thực sự nên được ủng hộ!
mlt

2
Bất cứ ai cũng có cùng một vấn đề với zlib thấy điều này (CTRL + F SafeSEH) tannerhelland.com/5076/compile-zlib-winapi-wapi-stdcall
codekiddy

Tôi đã thêm "/ safeseh" vào dòng lệnh trong thuộc tính cho tệp .asm và điều này đã hoạt động.
Norbert Boros

0

Số dặm của bạn có thể khác nhau, nhưng không có gợi ý nào ở trên phù hợp với tôi (mặc dù tôi đã không thử lăn trình xử lý ngoại lệ asm của riêng mình).

Những gì đã làm là chọn bản phát hành mục tiêu xây dựng / x64.

Tôi đang chạy Windows 10 trên máy 64 bit và sử dụng Visual Studio 2015.

Bản phát hành đích / Win32 cũng hoạt động. Tôi đoán điều chính là chọn "Phát hành".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.